通知挂钩
只有当在 Helper 例程中执行下列操作之前才调用通知挂钩:
检查存储的库句柄,确保已经加载。
调用 LoadLibrary 以尝试加载 DLL。
调用 GetProcAddress 以尝试获取过程地址。
返回到延迟导入加载 thunk。
用下列方法启用通知挂钩:
通过提供指针 __pfnDliNotifyHook2 的新定义,该指针已初始化为指向您自己的接收通知的函数。
- 或 -
通过在调用程序正在延迟加载的 DLL 之前设置指向挂钩函数的指针 __pfnDliNotifyHook2。
如果通知是 dliStartProcessing,则挂钩函数可以返回:
NULL
默认 Helper 处理 DLL 加载。 若只是为了了解信息,那么调用它是很有用的。函数指针
跳过默认的延迟加载处理。 这使您能够提供自己的加载处理程序。
如果通知是 dliNotePreLoadLibrary,挂钩函数可以返回:
0,如果只需要信息性通知。
已加载的 DLL 的 HMODULE,如果它自己加载了 DLL 的话。
如果通知是 dliNotePreGetProcAddress,挂钩函数可以返回:
0,如果只需要信息性通知。
已导入函数的地址,如果挂钩函数自已获取地址的话。
如果通知是 dliNoteEndProcessing,挂钩函数的返回值将忽略。
若该指针已初始化(非零),延迟加载 Helper 在执行过程中将在某些通知点调用此函数。 该函数指针具有如下定义:
// The "notify hook" gets called for every call to the
// delay load helper. This allows a user to hook every call and
// skip the delay load helper entirely.
//
// dliNotify == {
// dliStartProcessing |
// dliNotePreLoadLibrary |
// dliNotePreGetProc |
// dliNoteEndProcessing}
// on this call.
//
ExternC
PfnDliHook __pfnDliNotifyHook2;
// This is the failure hook, dliNotify = {dliFailLoadLib|dliFailGetProc}
ExternC
PfnDliHook __pfnDliFailureHook2;
在 DelayLoadInfo 结构中,通知连同通知值一起传递给挂钩函数。 该数据与延迟加载 Helper 例程使用的数据相同。 通知值将为结构和常数定义中定义的值之一。