首页
社区
课程
招聘
[求助]如果安全的 FreeLibrary 一个创建线程的 DLL
发表于: 2008-7-30 23:03 9568

[求助]如果安全的 FreeLibrary 一个创建线程的 DLL

2008-7-30 23:03
9568


一个 DLL 被 FreeLibrary 时..应该要首先退出.其建立的所有线程吧!?(我自己的测试是..

如果不退出这个dll建立的线程..加载他的dll就会出错!!!)

不知道API 里面有没有这样的函数.. 要 卸载 DLL 时...让这个 DLL 自动的将自己建立的线程

全部自动退出...然后...调用 FreeLibrary.


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 156
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
可以在DllMain函数里面 停止线程

BOOL WINAPI DllMain(
    HINSTANCE hinstDLL,  // handle to DLL module
    DWORD fdwReason,     // reason for calling function
    LPVOID lpReserved )  // reserved
{
    // Perform actions based on the reason for calling.
    switch( fdwReason )
    {
        case DLL_PROCESS_ATTACH:
         // Initialize once for each new process.
         // Return FALSE to fail DLL load.
            break;

        case DLL_THREAD_ATTACH:
         // Do thread-specific initialization.
            break;

        case DLL_THREAD_DETACH:
         // Do thread-specific cleanup.
            break;

        case DLL_PROCESS_DETACH:
         // Perform any necessary cleanup.
       // 在这里 停止线程

            break;
    }
    return TRUE;  // Successful DLL_PROCESS_ATTACH.
}
2008-7-31 09:36
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
印象中无法在DllMain里面“安全”的退出线程,除非用不安全的TerminateThread。
原因是线程正常退出时也会调用DllMain,fdwReason是DLL_THREAD_DETACH,但是由于正常停止线程的语句在等待线程退出,本身也在DllMain里面,而DllMain又是互斥的,最终导致死锁。一般可以多加一个导出函数用于停止所有线程,然后再FreeLibrary。
有没有记错就不知道……
2008-8-1 08:56
0
雪    币: 367
活跃值: (20)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
4
case DLL_PROCESS_ATTACH:

DisableThreadLibraryCalls(hInst);//dll首次初始化时禁用线程通知
2008-8-1 09:07
0
雪    币: 427
活跃值: (412)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
很显然LZ是要卸载他人的DLL。
2008-8-2 08:34
0
雪    币: 33
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
楼上正解..

我现在发现..卸载 dll的时候.谁知道 他建立了哪些线程啊..

也不是直接调用 FreeLibrary 就可以了!!!

不过..我曾经有见过一个工具..

可以.看到...一个进程内.....线程...所在 dll!!!
2008-8-2 13:53
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
http://blog.sina.com.cn/s/blog_56ea069101000b3k.html
看下这里。我研究好几天了不知道那个函数怎么用。你研究出来把代码给我共享下哈
2008-8-2 15:47
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
就算你把线程都关掉就一定有用么?你能保证主线程不会去调用DLL中的导出函数?你能保证你在卸载DLL的时候,主线程此时的EIP不在DLL的空间中么?
2008-8-4 09:10
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
楼上说的正确,DLL卸载后,如果程序主线程要调用DLL中的导出函数,马上挂掉。曾经想对付VS和浩方对战平台的DLL时就是这种情况。谁有什么高明的办法通知一下我,哈。
2008-8-4 15:10
0
游客
登录 | 注册 方可回帖
返回
//