关于DLL中遇到的一个问题
2009-05-21 14:50
351 查看
前一阶段闲着无聊,用远程线程注入的方法把DLL注入到Explorer.exe进程实现音乐循环播放。
在DLL中的代码是这样的:
Code
BOOL WINAPI DllMain(HINSTANCE hInstDll, DWORD fdwReason, PVOID fImpLoad)
{
static HANDLE hThread;
static DWORD dwThreadId;
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
g_hInstDll = hInstDll;
hThread = BEGINTHREADEX(NULL, 0, ThreadProc, (PVOID)hInstDll, 0, &dwThreadId);
if (hThread == NULL)
{
return FALSE;
}
break;
case DLL_PROCESS_DETACH:
SendMessage(g_hWnd, WM_CLOSE, 0, 0);
WaitForSingleObject(hThread, INFINITE); // 这里存在死循环
CloseHandle(hThread); // 执行不到这里
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
default:
break;
}
return TRUE;
}
在DLL_PROCESS_ATTACH的时候创建了一个线程,这个线程中创建了一个隐藏的窗口,并利用MCI实现播放音乐,具体就不贴出了。然后在DLL_PROCESS_DETACH中停止和关闭设备。
但是在应用程序中,发现注入时无异常,在需要撤销DLL映射时出现了问题,程序出现了死循环,在等待远程线程执行FreeLibaray完毕时不返回了。
注意上面代码中DLL_PROCESS_DETACH的代码,SendMessage用来关闭窗口,窗口会在WM_DESTROY通知下调用PostQuitMessage(0)使得线程的消息循环退出,从而线程退出。但是WaitForSingleObject函数无法返回。
后来发现这里存在死循环,因为执行DllMain的线程是序列化的,必须等待一个线程执行完毕之后另一个线程才能执行。在SendMessage后,导致创建的线程即将退出,这时该线程会调用DllMain,并以DLL_THREAD_DETACH作为通知。可是调用SendMessage的线程调用DllMain时却还在等待即将退出的线程结束,DllMain还没有返回,因此存在了死循环。
因此,在DllMain中不适合调用WaitForSingleObject等函数来等待线程完毕。
在DLL中的代码是这样的:
Code
BOOL WINAPI DllMain(HINSTANCE hInstDll, DWORD fdwReason, PVOID fImpLoad)
{
static HANDLE hThread;
static DWORD dwThreadId;
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
g_hInstDll = hInstDll;
hThread = BEGINTHREADEX(NULL, 0, ThreadProc, (PVOID)hInstDll, 0, &dwThreadId);
if (hThread == NULL)
{
return FALSE;
}
break;
case DLL_PROCESS_DETACH:
SendMessage(g_hWnd, WM_CLOSE, 0, 0);
WaitForSingleObject(hThread, INFINITE); // 这里存在死循环
CloseHandle(hThread); // 执行不到这里
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
default:
break;
}
return TRUE;
}
在DLL_PROCESS_ATTACH的时候创建了一个线程,这个线程中创建了一个隐藏的窗口,并利用MCI实现播放音乐,具体就不贴出了。然后在DLL_PROCESS_DETACH中停止和关闭设备。
但是在应用程序中,发现注入时无异常,在需要撤销DLL映射时出现了问题,程序出现了死循环,在等待远程线程执行FreeLibaray完毕时不返回了。
注意上面代码中DLL_PROCESS_DETACH的代码,SendMessage用来关闭窗口,窗口会在WM_DESTROY通知下调用PostQuitMessage(0)使得线程的消息循环退出,从而线程退出。但是WaitForSingleObject函数无法返回。
后来发现这里存在死循环,因为执行DllMain的线程是序列化的,必须等待一个线程执行完毕之后另一个线程才能执行。在SendMessage后,导致创建的线程即将退出,这时该线程会调用DllMain,并以DLL_THREAD_DETACH作为通知。可是调用SendMessage的线程调用DllMain时却还在等待即将退出的线程结束,DllMain还没有返回,因此存在了死循环。
因此,在DllMain中不适合调用WaitForSingleObject等函数来等待线程完毕。
相关文章推荐
- 关于Use MFC in a Shared DLL和Use MFC in a Static Library 转换遇到的问题
- 关于&& || ! 遇到的一个问题
- 关于加载设计器遇到一个或多个错误问题的解决方案
- 在使用一个全局底层键盘钩子dll时遇到的问题
- 最近遇到一个非常棘手的需求是关于邮件转发的问题,请大家来帮忙给出出主意如何实现。
- 关于这两天遇到的一个问题
- 遇到的一个关于printf()的小问题。
- 工作中遇到的一个相当有意思的问题(关于Windows和linux环境下执行PHP,ajax,javascript,flexigrid的一个莫名异常)
- 今天遇到一个问题,关于ibatis的
- 关于VS2005中编写DLL的一个异常问题
- 关于c#调用c++的dll遇到的问题
- 今天在写一个关于背四级单词的APP,遇到一个问题
- 这个坑,你遇到过吗?关于UIView上添加一个手势,导致子视图为UIButton的无法响应的问题
- 分享关于学习new BufferedWriter()方法时常遇到的一个无厘头的问题
- 写插件时遇到的一个小问题,关于animate和css3的问题
- 关于request遇到的一个问题
- 今天遇到一个关于对象和对象方法内存分配的有趣的问题
- LeetCode上关于Min Stack遇到的一个小小问题
- 今天遇到一个关于STL中排序的问题, 怀疑是sort的bug!
- 关于NavigationView在使用中遇到的一个小问题