SetDefaultDllDirectories 函数 (libloaderapi.h)

指定调用进程加载 DLL 时要搜索的默认目录集。 调用 LoadLibraryEx 且没有 LOAD_LIBRARY_SEARCH 标志时,将使用此搜索路径。

语法

BOOL SetDefaultDllDirectories(
  [in] DWORD DirectoryFlags
);

parameters

[in] DirectoryFlags

要搜索的目录。 此参数可以是以下值的任意组合。

含义
LOAD_LIBRARY_SEARCH_APPLICATION_DIR
0x00000200
如果使用此值,则搜索应用程序的安装目录。
LOAD_LIBRARY_SEARCH_DEFAULT_DIRS
0x00001000
此值是 LOAD_LIBRARY_SEARCH_APPLICATION_DIRLOAD_LIBRARY_SEARCH_SYSTEM32LOAD_LIBRARY_SEARCH_USER_DIRS的组合。

此值表示应用程序在其 DLL 搜索路径中应包含的建议最大目录数。

LOAD_LIBRARY_SEARCH_SYSTEM32
0x00000800
如果使用此值,则搜索 %windows%\system32。
LOAD_LIBRARY_SEARCH_USER_DIRS
0x00000400
如果使用此值,则搜索使用 AddDllDirectorySetDllDirectory 函数显式添加的任何路径。 如果已添加多个目录,则未指定搜索这些目录的顺序。

返回值

如果该函数成功,则返回值为非零值。

如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。

注解

DLL 搜索路径是在 LoadLibraryLoadLibraryEx 函数调用中未指定完整路径,或者指定 DLL 的完整路径但系统必须搜索依赖 DLL 时搜索 DLL 的目录集。 有关标准 DLL 搜索路径的详细信息,请参阅 动态链接库搜索顺序

标准 DLL 搜索路径包含易受 DLL 预加载攻击的目录。 应用程序可以使用 SetDefaultDllDirectories 函数为进程指定默认 DLL 搜索路径,以消除最易受攻击的目录并限制搜索的其他目录。 进程 DLL 搜索路径仅适用于调用进程,并在进程的生命周期内保留。

如果 DirectoryFlags 参数指定多个标志,则按以下顺序搜索目录:

  • 包含 DLL (LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR) 的目录。 此目录仅搜索正在加载的 DLL 的依赖项。
  • 应用程序目录 (LOAD_LIBRARY_SEARCH_APPLICATION_DIR) 。
  • 使用 AddDllDirectory 函数 (LOAD_LIBRARY_SEARCH_USER_DIRS) 或SetDllDirectory 函数显式添加到应用程序搜索路径的路径。 如果已添加多个路径,则未指定路径的搜索顺序。
  • 系统目录 (LOAD_LIBRARY_SEARCH_SYSTEM32) 。
如果 SetDefaultDllDirectories 未指定 LOAD_LIBRARY_SEARCH_USER_DIRS,则使用 AddDllDirectory 函数指定的目录仅用于指定LOAD_LIBRARY_SEARCH_USER_DIRSLoadLibraryEx 函数调用。

无法将还原到标准 DLL 搜索路径,也无法从搜索路径中删除使用 SetDefaultDllDirectories 指定的任何目录。 但是,可以通过使用一个或多个LOAD_LIBRARY_SEARCH标志调用 LoadLibraryEx 来替代进程 DLL 搜索路径,并且可以通过调用 RemoveDllDirectory 删除使用 AddDllDirectory 添加的目录。

Windows 7、Windows Server 2008 R2、Windows Vista 和 Windows Server 2008: 若要在应用程序中调用此函数,请使用 GetProcAddress 函数从 Kernel32.dll 检索其地址。 KB2533623 必须安装在目标平台上。

要求

   
最低受支持的客户端 Windows 8 [仅限桌面应用],在 Windows 7、Windows Server 2008 R2、Windows Vista 和 Windows Server 2008 上KB2533623
最低受支持的服务器 Windows Server 2012 [仅限桌面应用]
目标平台 Windows
标头 libloaderapi.h (包括 Windows.h)
DLL Kernel32.dll

另请参阅

AddDllDirectory

动态链接库搜索顺序

动态链接库安全性

LoadLibrary

LoadLibraryEx

RemoveDllDirectory