DllMain
BOOL WINAPI DllMain(
HANDLE hinstDLL, 句柄
DWORD dwReason, 调用实际
LPVOID lpvReserved); 指定初始化和清理的其他方面
对于一个Dll模块,
DllMain函数是可选的
dll加载和卸载的时候被调用,
dll初始化和资源的释放
跟exe有个main或者WinMain入口函数一样,DLL也有一个入口函数,就是DllMain。
系统是在什么时候调用DllMain函数的呢?静态链接时,或动态链接时调用LoadLibrary和FreeLibrary都会调用DllMain函数。
DLL_PROCESS_ATTACH:
进程启动
loadlibrary,
第一加载到进程地址空间
DLL_PROCESS_DETACH:
进程结束
FreeLibrary,每次调用会减少引用计数,当计数值为0,则卸载dll
返回值:
FALSE:
进程启动中,会弹出一个错误,然后立刻调用DLLMain,并传入DLL_PROCESS_DETACH
在main函数之前执行代码:
1. dllmain
2. 全局对象的构造
3. 全局变量使用函数赋值
函数转发: (又叫dll劫持)
所导出的函数实现不在本dll,而在其他dll中
创建进程
WinExec(
"cmd /k copy D:\process.exe d:\1.exe", 文件名 可以是命令行
SW_NORMAL); 窗口 sw_show参数相同
Uint ShellExecute(
HWND hwnd, //父窗口句柄
LPCSTR lpOperation, //操作类型
LPCSTR lpFile, //要进行操作的文件或路径
LPCSTR lpParameters, //当lpOperation为“explore”时指定要传递的参数,通常设为NULL
LPCSTR lpDirectory, //指定默认目录,通常设为NULL
INT nShowCmd //文件打开的方式,以通常方式还是最大化或最小化显示
)
返回值大于32表示执行成功
返回值小于32表示执行错误
返回值可能的错误有: = 0 {内存不足}
ERROR_FILE_NOT_FOUND = 2; {文件名错误}
ERROR_PATH_NOT_FOUND = 3; {路径名错误}
ERROR_BAD_FORMAT = 11; {EXE 文件无效}
SE_ERR_SHARE = 26; {发生共享错误}
SE_ERR_ASSOCINCOMPLETE = 27; {文件名不完全或无效}
SE_ERR_DDETIMEOUT = 28; {超时}
SE_ERR_DDEFAIL = 29; {DDE 事务失败}
SE_ERR_DDEBUSY = 30; {正在处理其他 DDE 事务而不能完成该 DDE 事务}
SE_ERR_NOASSOC = 31; {没有相关联的应用程序}
操作类型
Edit:编辑文件
Exporer:打开资源管理器(必须是目录)
Find:打开搜索对话框
Open:打开文档、可执行文件与文件夹
ShellExecute 可以打开命令行 脚本 网页