DisableThreadLibraryCalls函数

标签: Win32API(系统调用) Win32API(系统调用)
7人阅读 评论(0) 收藏 举报
分类:

DisableThreadLibraryCalls函数用于使指定DLL的DLL_THREAD_ATTACHDLL_THREAD_DETACH通知无效,这可减少某些应用程序的工作集空间。原型如下:

BOOL WINAPI DisableThreadLibraryCalls(

  __in  HMODULE hModule//Dll的句柄

);


参数hModule是指定DLL模块的句柄,可以使用LoadLibrary()、LoadLibraryEx()或GetModuleHandle()函数获得该句柄。当然在DLL中,我们不能调用GetModuleHandle(NULL)来获取DLL模块的句柄,因为这样获得的是当前使用该DLL的可执行程序映像的基地址,而不是DLL映像的。

         函数调用成功时返回非零值。当指定的DLL模块拥有活动的静态线程局部存储或者hModule参数无效时,函数调用失败。

         对于一个拥有很多DLL的多线程应用程序而已,如果这些DLL频繁地创建和销毁线程,而且这些DLL不需要线程创建和销毁通知,则在DLL中使用DisableThreadLibraryCalls函数将能够起到优化应用程序的作用,远程过程调用RPC服务器就是这样的例子。在这类应用程序中,如果不使用该函数,DLL初始化例程将驻留在内存中以响应DLL_THREAD_ATTACH和DLL_THREAD_DETACH通知。因此,使这两个通知无效,则DLL初始化代码就不会因为线程的创建和销毁而驻留在物理内存中了,这就减少了应用程序工作代码集的大小。一般实现这个优化就是在DLL的DLL_PROCESS_ATTACH代码响应中添加DisableThreadLibraryCalls函数。

         有一点需要注意的是,对于静态链接到C运行时库(CRT)的DLL我们不应该使用该函数,因为CRT需要DLL_THREAD_ATTACH和DLL_THREAD_DETACH通知才能正确地运行。


下面是代码示例:(摘自金山卫士开源作品之ARP防火墙)

    HINSTANCE g_hModule = NULL;  
    //////////////////////////////////////////////////////////////////////////  
      
    BOOL WINAPI DllMain(  
        __in HANDLE     hInstance,   
        __in DWORD      dwReason,   
        __in_opt LPVOID lpReserved  
        )  
    {  
        UNREFERENCED_PARAMETER(lpReserved);  
      
        switch (dwReason)  
        {  
        case DLL_PROCESS_ATTACH:  
            DisableThreadLibraryCalls((HMODULE)hInstance);  
            g_hModule = (HINSTANCE)hInstance;  
            break;  
        case DLL_PROCESS_DETACH:  
            break;  
        default:  
            break;  
        }  
      
        return TRUE;  
    }  

查看评论

DisableThreadLibraryCalls 的作用

第一篇文章看Wince驱动时,看到Init函数时不时有这个函数,不知道啥意思,BOOL DisableThreadLibraryCalls(  HMODULE hLibModule); This fu...
  • winceARM
  • winceARM
  • 2010-07-01 11:55:00
  • 5393

0.VC(Custom)-DisableThreadLibraryCalls

DisableThreadLibraryCalls 的MSDN解释是这样的: The DisableThreadLibraryCalls function lets a DLL disable the...
  • hgy413
  • hgy413
  • 2011-12-02 12:45:54
  • 2286

DirectShow 学习(一) COM实现部分和部分辅助源码浅读

1.      BaseClasses中实现COM的部分源代码分析[combase.h/combase.cpp] o        class CBaseObject是BaseClasses中的基类,...
  • alvachien
  • alvachien
  • 2005-01-05 17:04:00
  • 6077

《Windows API巡礼》のDisableThreadLibraryCalls函数

DisableThreadLibraryCalls函数用于使指定DLL的DLL_THREAD_ATTACH和DLL_THREAD_DETACH通知无效,这可减少某些应用程序的工作集空间。原型如下:BO...
  • ACE1985
  • ACE1985
  • 2010-12-19 21:44:00
  • 2366

DllMain中不当操作导致死锁问题的分析--DisableThreadLibraryCalls对DllMain中死锁的影响

(转载于breaksoftware的csdn博客) 《windows核心编程》作者在讨论DllMain执行序列化的时候,曾说过一个他的故事:他试图通过调用DisableThreadLibrary...
  • ProgrammingRing
  • ProgrammingRing
  • 2014-03-18 15:38:58
  • 670

DisableThreadLibraryCalls

1、函数原型 BOOL WINAPI DisableThreadLibraryCalls(   __in          HMODULE hModule ); 功能:...
  • yuan_hs_hf
  • yuan_hs_hf
  • 2013-12-03 21:31:14
  • 618

必备绝技——Hook大法(上)

 【文章标题】: 必备绝技——Hook大法(上)【文章作者】: LvG【作者邮箱】: LvG2008@gmail.com【作者声明】: 这没有什么新鲜东西,其内容全部来自于前辈,姑且当作学习笔记。文字...
  • RemoteHacker
  • RemoteHacker
  • 2007-08-22 15:22:00
  • 845

简介: DisableThreadLibraryCalls

BOOL WINAPI DisableThreadLibraryCalls(   __in  HMODULE hModule ); Disables the DLL_THREAD_ATTACH ...
  • sunnylion1982
  • sunnylion1982
  • 2012-11-14 10:24:04
  • 326

DllMain中要谨慎写代码避免死锁

之前几篇文章主要介绍和分析了为什么会在DllMain做出一些不当操作导致死锁的原因。本文将总结以前文章的结论,并介绍些DllMain中还有哪些操作会导致死锁等问题。(转载请指明出于breaksoftw...
  • hczhiyue
  • hczhiyue
  • 2014-01-19 16:36:47
  • 1150

页面异常反dump 及 内存访问异常hook

第七章:应用层保护 加密,加壳,反调试,混淆。。。 静态保护:去静态特征,去字符串,全局指针等。 动态保护: 在dump模块的方法中,一般会调用ReadProcessMemory来读取,可以修...
  • pomelozero
  • pomelozero
  • 2015-04-15 18:43:21
  • 1340
    个人资料
    等级:
    访问量: 1282
    积分: 690
    排名: 7万+
    文章存档