Обработчики уведомления
Обновлен: Ноябрь 2007
Обработчики уведомления вызываются перед выполнением следующих действий во вспомогательной подпрограмме.
С помощью сохраненного дескриптора библиотеки проверяется, загружена она или нет.
Вызывается метод LoadLibrary, чтобы попытаться загрузить библиотеку DLL.
Вызывается метод GetProcAddress для получения адреса процедуры.
Возвращение в преобразователь задержки импорта загрузки.
Обработчик уведомления включается следующим образом.
При предоставлении нового определения указателя __pfnDliNotifyHook2, который при инициализации указывает на собственную функцию, получающую уведомления.
-или-
При присвоении указателю __pfnDliNotifyHook2 значения, равному адресу функции обработчика, перед любыми вызовами библиотеки DLL, которую программа загружает с задержкой.
При уведомлении dliStartProcessing, функция обработчика может возвратить:
NULL
Вспомогательная подпрограмма, использующаяся по умолчанию, обрабатывает загрузку библиотеки DLL. Ее полезно вызывать только для получения сведений.указатель на функцию
Обход стандартной загрузки с задержкой. При этом можно использовать собственный обработчик загрузки.
При уведомлении dliNotePreLoadLibrary, функция обработчика может возвратить:
0, если требуются только информационные уведомления.
Параметр HMODULE для загруженной DLL, если была загружена библиотека DLL.
При уведомлении dliNotePreGetProcAddress, функция обработчика может возвратить:
0, если требуются только информационные уведомления.
Адрес функции импорта, если обработчик самостоятельно получает адрес.
При уведомлении dliNoteEndProcessing, возвращаемое значение функции обработчика игнорируется.
Если этот указатель инициализирован (значение не равно нулю), вспомогательная подпрограмма загрузки с задержкой вызывает функцию в определенных точках уведомления во время своего выполнения. Указатель функции имеет следующие определение:
// 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 в функцию обработчика, как и значение уведомления. Данные такие же, как и используемые вспомогательной подпрограммой загрузки с задержкой. Возможные значения уведомления определены в разделе Определения структур и констант.