DLL-LoadLibrary函数

来源:互联网 发布:爱普生手机打印软件 编辑:程序博客网 时间:2024/06/05 15:06

加载指定的模块到调用进程的地址空间。指定的模块可能导致被装载的其它模块。

有关其他加载选项,使用 函数LoadLibraryEx函数。

句法

C ++
HMODULE WINAPI调用LoadLibrary(  _In_ LPCTSTR lpFileName的对象);

参数

lpFileName的对象 [中]

模块的名称。这可以是一个库模块(.dll文件)或可执行模块(.exe文件)。指定的名称是模块的文件名 ​​,并且不与存储在库模块本身中的名称,所指定的图书在模块定义(.DEF)文件的关键字。

如果该字符串指定一个完整路径,该函数只搜索该路径为模块。

如果字符串指定相对路径或没有路径的模块名称,函数使用了标准的搜索战略,找到模块; 有关更多信息,请参见备注。

如果函数找不到模块,功能失效。当指定路径,一定要使用反斜杠(\),而不是正斜杠(/)。关于路径的更多信息,请参阅 命名文件或目录。

如果字符串指定模块名不带路径和文件扩展名被忽略,则函数将默认库扩展.dll的模块名称。为了防止函数.dll文件附加到模块的名称,包括尾随点字符(。)的模块名称字符串。

返回值

如果函数成功,返回值是一个句柄模块。

如果函数失败,返回值为NULL。若想获得更多的错误信息,调用 GetLastError函数

备注

要启用或禁用时加载DLL的加载程序显示错误消息,请使用 SetErrorMode功能。

的LoadLibrary可以用来加载库模块到进程的地址空间,并返回可被用在手柄 GetProcAddress的获得的一个DLL函数的地址。 的LoadLibrary也可用于加载其他可执行模块。例如,该函数可以指定.exe文件以获得可在使用一手柄 的FindResource或 LoadResource。但是,不要使用 调用LoadLibrary来运行.exe文件。相反,使用CreateProcess的功能。

如果指定的模块是不是已经加载的调用进程一个DLL,系统调用的DLL的DllMain中具有功能 DLL_PROCESS_ATTACH值。如果 DllMain中返回TRUE, 调用LoadLibrary返回的句柄模块。如果 DllMain中返回FALSE,系统卸载从进程的地址空间的DLL和 调用LoadLibrary返回NULL。它是不是安全调用调用LoadLibrary从 DllMain中欲了解更多信息,请参见备注部分 的DllMain

模块句柄是不是全球或继承。的调用 的LoadLibrary由一个过程中不产生的手柄另一进程可以使用-例如,在呼叫 GetProcAddress的。其他进程必须做出自己的调用调用LoadLibrary之前调用该模块 GetProcAddress的

如果lpFileName的对象不包括路径和存在具有相同的基本名和扩展名以上的加载模块,该函数返回的句柄是先加载的模块。

如果在没有指定文件扩展名lpFileName的对象参数,默认的库扩展.dll追加。但是,文件名 ​​字符串可以包括一个尾随点字符(。)来表示的模块名没有扩展。如果没有指定路径,功能搜索加载模块的基本名称相匹配的模块的基本名称被加载。如果名字匹配,加载成功。否则,该功能搜索该文件。

第一个目录中搜索被包含用于创建调用进程映像文件的目录(有关详细信息,请参阅 CreateProcess的功能)。这样做可以在不添加过程的安装目录到PATH环境变量中找到专用动态链接库(DLL)与进程相关联的文件。如果指定了相对路径,在整个相对路径追加到该DLL搜索路径列表中的每个标记。加载从相对路径模块没有寻找其他路径,使用 GetFullPathName获得nonrelative路径和调用 调用LoadLibrary与nonrelative路径。对于DLL搜索顺序的更多信息,请参阅 动态链接库搜索顺序。

的搜索路径可以使用被改变 SetDllDirectory会功能。这种溶液,推荐,而不是使用SetCurrentDirectory或硬编码的完整路径到DLL。

如果指定的路径和存在用于应用程序重定向文件中,函数搜索在应用程序的目录中的模块。如果模块存在于应用程序的目录, 调用LoadLibrary忽略指定的路径,并加载从应用程序的目录模块。如果模块没有在应用程序的目录中, 调用LoadLibrary加载从指定的目录模块。欲了解更多信息,请参阅 动态链接库重定向。

如果调用调用LoadLibrary与程序集的名称,没有路径说明,该组件被列在系统兼容清单,呼叫将被自动重定向到并排侧装配。

系统维护上的所有加载的模块每个进程的引用计数。调用调用LoadLibrary 增加引用计数。调用FreeLibrary则或 的FreeLibraryAndExitThread函数递减引用计数。该系统卸载模块时,其引用计数为零或当进程终止(无论引用计数)。

在Windows Server 2003和Windows XP:  在Visual C ++编译器支持语法,使您可以声明线程局部变量: _declspec(线程)。如果你在一个DLL使用这个语法,你将无法加载明确使用的DLL 调用LoadLibrary在Windows之前的Windows Vista版本。如果你的DLL会被显式加载,你必须使用,而不是线程本地存储功能_declspec(线程)。举一个例子,看看 在动态链接库使用线程本地存储。

安全备注

不要使用SearchPath中的函数来检索的路径DLL的后续调用LoadLibrary调用。在 SearchPath中的功能比使用不同的搜索顺序 调用LoadLibrary,它不使用过程中的安全搜索模式,除非明确调用启用 SetSearchPathModeBASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE。因此, SearchPath中很可能会先搜索用户的当前工作目录中指定的DLL。如果攻击者已经复制了DLL的恶意版本到当前的工作目录,检索到的路径SearchPath中会指向恶意DLL,它调用LoadLibrary将加载。

不要对根据操作系统版本假设 的LoadLibrary调用搜索一个DLL。如果应用程序的环境中运行,其中DLL是不合法存在,但该DLL的恶意版本的搜索路径,该DLL的恶意版本可装载。相反,使用中所描述的推荐技术 获取系统版本。

0 0
原创粉丝点击