卸载延迟加载的 DLL

默认提供的延迟加载 Helper 检查延迟加载描述符,确定是否具有 pUnloadIAT 字段中的原始导入地址表 (IAT) 的指针和副本。 如果有,它将列表中的指针保存到导入延迟描述符。 这使得 Helper 函数能够按名称查找 DLL 以支持显式卸载找到的 DLL。

下面是与显式卸载延迟加载的 DLL 关联的结构和函数:

//
// Unload support from delayimp.h
//

// routine definition; takes a pointer to a name to unload

ExternC
BOOL WINAPI
__FUnloadDelayLoadedDLL2(LPCSTR szDll);

// structure definitions for the list of unload records
typedef struct UnloadInfo * PUnloadInfo;
typedef struct UnloadInfo {
    PUnloadInfo     puiNext;
    PCImgDelayDescr pidd;
    } UnloadInfo;

// from delayhlp.cpp
// the default delay load helper places the unloadinfo records in the 
// list headed by the following pointer.
ExternC
PUnloadInfo __puiHead;

UnloadInfo 结构用一个 C++ 类实现,该类将 LocalAllocLocalFree 实现分别用作其 new 运算符和 delete 运算符。 这些选项保留在列表头为 __puiHead 的标准链接表中。

调用 __FUnloadDelayLoadedDLL 将尝试查找在加载的 DLL 列表中提供的名称(要求完全匹配)。 如果找到了,pUnloadIAT 中的 IAT 副本被复制到正在运行的 IAT 的顶端以还原 thunk 指针,并用 FreeLibrary 释放库,断开匹配的 UnloadInfo 记录与列表的链接并删除该记录,并返回 TRUE。

函数 __FUnloadDelayLoadedDLL2 的参数区分大小写。 例如,应该指定:

__FUnloadDelayLoadedDLL2("user32.DLL");

而不是:

__FUnloadDelayLoadedDLL2("User32.DLL");.

请参见

参考

了解 Helper 函数