Выгрузка библиотеки DLL, загруженной с задержкой
Обновлен: Ноябрь 2007
Вспомогательная функция отложенной загрузки, предоставляемая по умолчанию, выполняет проверку на предмет наличия в поле pUnloadIAT указателей дескриптора отложенной загрузки, а также копии исходной адресной таблицы импорта (IAT). Если результат проверки положительный, функция сохраняет указатель в списке дескрипторов отложенной загрузки. Таким образом, вспомогательная функция включается для поиска по именам библиотек 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++, использующего реализации LocalAlloc и LocalFree в качестве операторов создать и удалить соответственно. Данные параметры содержатся в стандартном связанном списке, в котором в качестве заголовка используется __puiHead.
При вызове __FUnloadDelayLoadedDLL будет выполнен поиск по имени, заданному в списке загруженных библиотек DLL (по точному совпадению). Если результат поиска положительный, копия IAT а UnloadIAT записывается поверх работающей IAT, чтобы восстановить указатели преобразователя, библиотека высвобождается посредством FreeLibrary, связывание соответствующей записи UnloadInfo списка отменяется, запись удаляется, и возвращается значение true.
Для аргумента функции __FUnloadDelayLoadedDLL2 регистр учитывается. Например, можно указать:
__FUnloadDelayLoadedDLL2("user32.DLL");
но не:
__FUnloadDelayLoadedDLL2("User32.DLL");.