Описание API-функции LoadLibrary

API-функция LoadLibrary (как и некоторые другие) может быть использована как в стандартном, так и расширенном виде. В последнем случае к названию API-функции добавляется суффикс Ex. Кроме этого, существуют версии этой функции для кодировки Unicode (LoadLibraryW и LoadLibraryExW) и для кодировки ANSI (LoadLibraryA и LoadLibraryExA).

В стандартном виде, в качестве входного параметра функции LoadLibrary выступает указатель на строку, содержащую имя DLL (в принципе, с помощью этой функции можно загрузить и.exe модуль, однако для запуска приложений желательно использовать функцию CreateProcess).

В качестве результата выполнения данной функцией возвращается описатель модуля. Если функция завершилась успешно (DLL с указанным именем найдена), то результат будет отличен от нуля. Нулевое значение дескриптора означает отсутствие динамической библиотеки.

При задании имени файла можно использовать полный путь, можно ограничиться только именем файла. В последнем случае используется стандартная стратегия поиска файлов: сначала в каталоге где находится исполняемый файл вызывающего процесса, затем в системном каталоге, затем в текущем каталоге, затем в каталогах описанных в переменной PATH (в системном файле инициализации). При этом загружается первый подходящий по названию файл. Можно изменить стандартную последовательность каталогов при поиске DLL с помощью значений ключа реестра " HKLM\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode" активируя или дезактивируя ключ "SafeDllSearchMode".

Пусть имя файла с DLL находится в строке под именем DllFileName, тогда вызов функции LoadLibrary будет выглядеть так:

PUSH offset DllFileName; в стек передается адрес строки с именем DLL

CALL LoadLibraryW; вызывается функция загрузки DLL

CMP eax,0; результат функции сравнивается с 0

JZ ErrorMessage_DllNotFound; если 0, то переход на вывод сообщения об ошибке

MOV [dllHandle],eax; дескриптор DLL сохраняется в переменной dllHandle

При использовании расширенной функции загрузки динамической библиотеки LoadLibraryEx, кроме имени DLL необходимо указывать дескриптор файла и 32-х разрядное слово, определяющее флаги, инициирующие различные действия выполняющиеся при загрузке модуля.

PUSH dwFlags; загружаются флаги

PUSH hFile; загружается дескриптор файла

PUSH offset DllFileName; загружается имя DLL

CALL LoadLibraryExW; вызывается функция загрузки DLL

CMP eax,0; результат функции сравнивается с 0

JZ ErrorMessage_DllNotFound; если 0, то переход на вывод сообщения об ошибке

В таблице 6 приведены описания некоторых флагов.

Таблица 6 -Описание флагов API-функции LoadLibraryEx

Название флага и его значение (в 16-ой с/с) Описание действия
DONT_RESOLVE_DLL_REFERENCES 0x00000001 При загрузке DLL ОС не вызывает процедуру входа и не загружает дополнительные исполняемые модули, на которые ссылается модуль
LOAD_IGNORE_CODE_AUTHZ_LEVEL 0x00000010 Во время загрузки DLL ОС не выполняет автоматическую проверку уровня доверия к DLL или её зависимостям
LOAD_LIBRARY_AS_DATAFILE 0x00000002 ОС загружает DLL как файл с данными, не выполняя никаких операций по подготовке к исполнению кода, поэтому в этом случае нельзя выполнять функции типа GetProcAddress. Данный флаг используется если DLL содержит какие-либо ресурсы.
LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE 0x00000040 То же самое что и LOAD_LIBRARY_AS_DATAFILE, за исключением того, что файл DLL на диске открывается для эксклюзивной записи.

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: