DLL_PROCESS_ATTACH通知

windows:加载dll时的DLLMain介绍 在实际开发中,通常情况下,系统自带的初始化和清理机制(如全局变量初始化和析构、自动内存管理等)已经足够。然而,有些特定场景下,需要开发者自己在DllMain中处理和。以下是一些可能的情况:线程本地存储(TLS)当需要在每个线程中维护独立的数据(如线程本地存储),必须手动进行线程初始化和清理。例如,多线程日志记录、线程特定的配置等。示例:每个线程都有独立的日志文件句柄或配置对象。资源管理当需要在DLL加载时分配全局资源(如文件句柄、网络连接)并在卸载时释放这些资源时,必须手动进行初始化和清理。示例。 阅读详情

(15) DLL_PROCESS_ATTACH通知

当DLL被初次映射到进程的地址空间中时,系统将调用该DLL的DllMain函数,给它传递参数fdwReason的值DLL_PROCESS_ATTACH。只有当DLL的文件映像初次被映射时,才会出现这种情况。如果线程在后来为已经映射到进程的地址空间中的DLL调用LoadLibrary(Ex)函数,那么操作系统只是递增DLL的使用计数,它并不再次用DLL_PROCESS_ATTACH的值来调用DLL的DllMain函数。

 

当处理DLL_PROCESS_ATTACH时,DLL应该执行DLL中的函数要求的任何与进程相关的初始化。例如,DLL可能包含需要使用它们自己的堆栈(在进程的地址空间中创建)的函数。通过在处理DLL_PROCESS_ATTACH通知时调用HeapCreate函数,该DLL的DllMain函数就能够创建这个堆栈。已经创建的堆栈的句柄可以保存在DLL函数有权访问的一个全局变量中。

当DllMain处理一个DLL_PROCESS_ATTACH通知时,DllMain的返回值能够指明DLL的初始化是否已经取得成功。如果对HeapCreate的调用取得了成功,DllMain应该返回TRUE。如果堆栈不能创建,它应该返回FALSE。如果fdwReason使用的是其他的值,即DLL_PROCESS_DETACH、DLL_THREAD_ATTACH和DLL_THREAD_DETACH,那么系统将忽略DllMain返回的值。

当然,系统中的有些线程必须负责执行DllMain函数中的代码。当一个新线程创建时,系统将分配进程的地址空间,然后将.exe文件映像和所有需要的DLL文件映像映射到进程的地址空间中。然后它创建进程的主线程,并使用该线程调用每个DLL的带有DLL_PROCESS_ATTACH值的DllMain函数。当已经映射的所有DLL都对通知信息作出响应后,系统将使进程的主线程开始执行可执行模块的C/C++运行期启动代码,然后执行可执行模块的进入点函数(main、wmain、WinMain或wWinMain)。如果DLL的任何一个DllMain函数返回FALSE,指明初始化没有取得成功,系统便终止整个进程的运行,从它的地址空间中删除所有文件映像,给用户显示一个消息框,说明进程无法启动运行。

下面让我们来看一看DLL被显式加载时的情况。当进程中的一个线程调用LoadLibrary(Ex)时,系统会找出特定的DLL,并将它映射到进程的地址空间中。然后,系统使用调用LoadLibrary(Ex)的线程,调用DLL的带有DLL_PROCESS_ATTACH值的DllMain函数。当DLL的DllMain函数处理了通知消息后,系统便允许调用的LoadLibrary(Ex)函数返回,同时该线程像平常一样继续进行处理。如果DllMain函数返回FALSE,指明初始化没有取得成功,那么系统就自动从进程的地址空间中卸载DLL的文件映像,而对LoadLibrary(Ex)的调用则返回NULL。

C++ DLL开发实战:DllMain函数详解与常见问题排查指南 本文深入解析C++ DLL开发中的DllMain函数,详细讲解其四种调用场景(DLL_PROCESS_ATTACH、DLL_PROCESS_DETACH、DLL_THREAD_ATTACH、DLL_THREAD_DETACH)及常见问题排查方法。通过实战案例和优化策略,帮助开发者避免常见陷阱,提升DLL开发效率与稳定性。 阅读详情

相关推荐

【开关电源】开关电源实战经验分享

开关电源原理设计、Layout设计经验分享

weixin_42098658的博客 4169

关于Dll

Dll(动态链接库)的加载分为2种: 静态加载 动态加载 首先来看一个Dll的例子: 上面3张图分别是main.cpp, Test.h以及Test.cpp。其编译连接后生成了一个名为Sample.dll以及对应的Sample.lib导入库。 静态加载是通过如下几种方式使用: 首先可以通过#pragma comment语句来静态使用dll 或者可以通过在项目属性中的附加依赖项添加对应的导入库来静态使用 这种情况下就无需#pragma comment语句了 ...

輚至消亡 2642

IPMItool 控制风扇转速

然后手动设置风扇,最后一位0x1e为设置30%的转速(16进制)。最后4位 0x0f 表示15%,0x0a,表示10%,不建议小于10%,因为10%已经很静音了 如果再小怕不能控温,烧毁硬件。首先停止服务器的自动风扇控制,最后一位0x00表示停止自动风扇控制,0x01为开启自动风扇控制。首先开启主板上的ipmi 设置好 用户名密码。此过程可以在网上搜索,有很多的资料可以参考。解压只有在目录里面有ipmltool。下面是一些常用的修改温度命令。

m0_37970303的博客 5060

zz DLL 编写教程

DLL的优点 简单的说,dll有以下几个优点: 1) 节省内存。同一个软件模块,若是以源代码的形式重用,则会被编译到不同的可执行程序中,同时运行这些exe时这些模块的二进制码会被重复加载到内存中。如果使用dll,则只在内存中加载一次,所有使用该dll的进程会共享此块内存(当然,像dll中的全局变量这种东西是会被每个进程复制一份的)。 2) 不需编译的软件系统升级,若一个软件系统使用了dll,则该

1074

三维重建之条纹投影结构光(三)——相高模型标定

接上面两文: 三维重建之条纹投影结构光(一)https://blog.youkuaiyun.com/beyond951/article/details/123361852?spm=1001.2014.3001.5501三维重建之条纹投影结构光(二)——四步相移+三频外差法https://blog.youkuaiyun.com/beyond951/article/details/123769596?spm=1001.2014.3001.5501接下来对相高模型进行标定,其推导过程如下图所示 ...

beyond951的博客 4876

数字后端DRC Violation定位与自动化修复:Innovus与Calibre协同实战

设计规则检查(DRC)是芯片tapeout前确保版图可制造性的关键验证环节。在数字后端流程中,Calibre作为signoff级物理验证工具,会依据代工厂SVRF规则文件对GDS进行严格几何检查;而Innovus则提供快速迭代的in-design DRC反馈。两者协同成为工程师定位violation、保障流片成功的主流工作流。面对成千上万条DRC violation,高效的定位与分类思路、跨工具映射技巧,以及基于Tcl脚本的自动化修复方法,能大幅缩短物理验证周期。本文从DRC的分层定位出发,结合Innovu

weixin_29185167的博客 335

c++注入dll调用call

这个函数很简单,里面内嵌的汇编代码,用来调用test的call,首先我们申明一个a=2,和一个引用类型r。这个可以和上面拿到的汇编进行对比,这个是按照c语言的调用约定来的,这个push的顺序是不能变的哈,后面直接调用call。不出意外的话,应该会弹出两个窗口,一个是注入成功窗口,一个是输出基址的窗口。我们想调用test函数,就必须知道这个函数在内存的地址,但是每次重启电脑,地址都是变化的。我们的目标是在dll调用到test.exe的test函数,这个dll还没有达到我们的目标,我们还需要继续完善。

qq_59848320的博客 2922

嵌入式接口通识知识之PCIe接口

PCIe x1接口是最常见的一种,插槽的长度是最短的,仅有25mm。PCIe x4接口有四个数据通道,提供比x1接口更高的带宽,插槽的长度为39mm,分为前后两组,一组22根针脚用于供电,剩下的42根针脚是数据针脚。插槽全长89mm,有164根针脚,分为前后两组,较短的插槽有22根针脚,主要用于供电,较长的插槽142根,主要用于数据传输,具有16通道所带来的高带宽。PCIe x8接口有八个数据通道,插槽全长56mm,有98跟针脚,分为前后两组,较短的22根针脚用于供电,剩下的76根针脚是数据针脚。

2301_76587520的博客 1305

dll的一些常识

1、若显式载入DLL,则当系统第一次调用Library时,进程会将Dll映射到进程的地址空间,并触发DLL_PROCESS_ATTACH事件; 2、若DLL_PROCESS_ATTACH事件返回ture,则表示调用LoadLibrary成功,反之则失败,特别需要注意的是,在这种情况下是没有DLL_PROCESS_DETACH事件触发的; 3、在调用FreeLibrary时,会触发DllMain

物知馆 909

华为OD机试 - 进制转换 - 二进制(Python/JS/C/C++ 2024 B卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题。

学Java,找哪吒 916

工业相机的检测原理课件(建议收藏)

本课件为各位工程师详细介绍了工业相机的视觉检测原理 ,旨在为工程师调试工业相机的视觉检测原理时提供理论性指导。

Bamboo265925的博客 498

动态链接库--入口点函数、通知

DLL入口点DllMain函数: DLL入口点函数DllMain,通常被用来执行一些与进程或者线程有关的初始化和清理工作。如果不需要,则可以在源代码中不去实现。DllMain函数执行的时候,同一个地址空间的其它DLL可能还没有执行它们的DllMain,因为我们应该避免调用那些从其它DLL中导入的函数。 DLL入口点通知: 当系统第一次且只有一次将DLL映射到进程地址空间中,会调用DllMa...

weixin_34204722的博客 500

【ArcGIS遇上Python】批量提取多波段影像至单个波段

本案例基于ArcGIS python,将landsat影像的7个波段影像数据,批量提取至单个波段。

智慧空间实验室 2073

Dll 入口函数

代码 BOOLWINAPIDllMain(HINSTANCEhinstDLL,DWORDfdwReason,LPVOIDlpReserved){//分别处理各种通知switch(fdwReason){caseDLL_PROCESS_ATTACH://为新进程初始化,只能进行1次...

weixin_30267785的博客 110

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

翻译《The Old New Thing》If you return FALSE from DLL_PROCESS_ATTACH, will you get a DLL_PROCESS_DETACH?

如果从 DLL_PROCESS_ATTACH 返回 FALSE,是否会得到 DLL_PROCESS_DETACH?

0x0007 的博客 929

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Windows注入与拦截(1) -- DLL注入的基本原理

一. DLL注入技术的用途 从前面的《Windows内存体系》系列文章中我们可以知道,在Windows系统中,每个进程都有自己私有的地址空间。当我们用指针来引用内存的时候,指针的值表示的是进程自己的地址空间的一个虚拟的内存地址。进程不能通过指针来引用其他进程地址空间的内存。因此,如果一个进程有缺陷会导致其引用和覆盖随机地址处的内存,那么这个缺陷的影响就会不会扩散到其他的进程。 独立的地址空间有...

while(1) { smile(); } 5万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

DLL高级技术2

2、DLL的入口点函数      一个DLL可以有一个入口点函数。系统会在不同的时候调用这个入口点函数,具体什么时候我们马上就会介绍。这些调用是通知性质的,通常被DLL用来执行一些与进程或线程有关的初始化和清理工作。如果DLL不需要这些通知,那么我们可以不必再源代码中实现这个入口点函数。例如:如果要创建一个只包含资源的DLL,那么我们就不需要实现这个函数。如果想要在DLL中接收通知,那么我们可以用switch语句来实现入口点函数。BOOL WINAPI DllMain(HINSTANCE hInstDll,

2112

《Win32多线程程序设计》学习笔记 第14章 建造DLL

DLL的通告消息Notifications 任何时候,当一个进程载入或卸载一个dll时,dllmain会被调用。线程也是一样的。当一个进程开始执行时,它所用到的每个dll的dllmain都会被系统调用之,并获得一个DLL_PROCESS_ATTACH消息。如果是线程开始执行,进程所用到的每一个dll的dllmain也都会被系统调用之,并获得DLL_THREAD_ATTACH消息。 ...

weixin_34411563的博客 157

【Windows核心编程笔记】第二十章 DLL高级技术

DLL模块的显示载入和符号链接 LoadLibrary/Ex 显示加载dll,映射到进程的地址空间 FreeLibrary 显示卸载dll FreeLibraryAndExitThread 适用dll中创建线程的情况 同一进程中多次加载一个dll会递增使用计数 不同进程之间维护各自的dll使用计数 可以使用GetModuleHanle检测dll是否被映射...

半雨微凉 493

DllMain的执行线程

DllMain的执行线程 DllMain()有4个通知: DLL_PROCESS_ATTACH DLL_THREAD_ATTACH DLL_THREAD_DETACH DLL_PROCESS_DETACH 其中:DLL_PROCESS_ATTACH/DLL_PROCESS_DETACH由主线程执行 DLL_THREAD_ATTACH由新建线程执行,DLL_PROCESS_DETACH...

weixin_33877092的博客 227

动态链接库(二)

DLL高级技术    1.1 显示载入DLL模块:LoadLibrary,LoadLibraryEx.两个函数的返回值HMODULE表示文件映像被映射到的虚拟内存地址,等价于HINSTANCE(DllMain入口点函数所接收的参数),LoadLibraryEx函数有两个额外的参数:hFile(保留应为NULL),dwFlags:    DONT_RESOLVE_DLL_REFE

静 1987

Windows核心编程 第二十章 DLL的高级操作技术

第20章DLL的高级操作技术 看了下这章的内容,谈不上高级,都是些常用相关,但是还是有一些细节需要注意。 20.1DLL模块的显式加载和符号链接 如果线程需要调用DLL模块中的函数,那么DLL的文件映像必须映射到调用线程的进程地址空间中。可以用两种方法进行这项操作。第一种...

墨鱼菜鸡 286
上一篇: PE文件结构与虚拟地址空间
下一篇: 何时调用DllMain
tomorrowsprogress
博客等级 码龄20年 16粉丝 20原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值