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 на диске открывается для эксклюзивной записи. |
|
|