Динамически
загружаемые библиотеки связываются с программами и между собой с помощью таблиц
экспорта и импорта, находящихся внутри файлов, библиотек и программ.
RVA – relative virtual address – формализация данных
в файле.
Просмотреть
содержимое таблиц экспорта и импорта можно с помощью утилиты dumpbin.exe
из состава пакета MS Visual Studio
(консольная программа).
Около
30% функций Win32API лежит в kernel32.dll. Чтобы
посмотреть ее табл. экспорта: dumpbin.exe kernel32.dll \exports>kernel32.exports
Чтобы
посмотреть ее табл. импорта:
kernel32.dll экспортирует функции Win32API, а импортирует функции из ntdll.dll, т.е. Native API.
Другой
способ исследования взаимосвязей между библиотеками – использование еще одной
программы Dependency Walker
(depends.exe)
из состава MS Visual
Studio (программа с GUI).
После
того, как все библиотеки были загружены по табл. импорта от программы и по
табл. импорта от библиотек, управление передается процессу – статическая
загрузка. Динамическая загрузка в процессе работы программы может подгружать
библиотеки.
Создание
DLL - динамически загружаемой библиотеки
Для
создания DLL необходимо при создании проекта в среде MS Visual
Studio указать тип проекта не exe-файл,
а dll. У DLL отсутствует
функция WinMain. Вместо нее используется DllMain.
BOOL WINAPI DllMain(
HINSTANCE
hInstDll, // HINSTANCE можно заменить на
HMODULE
DWORD fdwReason,
LPVOID lpvReserved);
1. Адрес точки
загрузки модуля в память. Для программ он равен 0x400000,
для библиотек 0x10000000 (по
умолчанию). Если 2 библиотеки загрузить по этому адресу, то загрузчик сам
сдвинет 2-ю библиотеку.
2. Причина вызова
функции.
3. Зависит от 2.
Функция
DllMain вызывается в 4-х случаях, при этом fdwReason будет принимать следующие значения:
-
DLL_PROCESS_ATTACH
– при загрузке dll в адресное
пространство процесса;
-
DLL_THREAD_ATTACH – при
создании новой нити;
-
DLL_THREAD_DETACH – при
уничтожении нити;
-
DLL_PROCESS_DETACH
– при выгрузке dll из адресного
пространства процесса.
-
Параметр
lpvReserved имеет смысл в 2-х случаях:
-
при
DLL_PROCESS_ATTACH этот параметр равен 0 для динамической загрузки и
не равен 0 для статической загрузки;
-
при
DLL_PROCESS_DETACH этот параметр равен 0 для динамической выгрузки и
не равен 0 для выгрузки в связи с завершением процесса.
Т.о.,
библиотека может настраиваться для процесса и для нити как ей хочется. Любую
ф-цию, переменную, класс библиотеки можно сделать экспортируемыми, т.е.
подключаемыми извне с помощью табл. экспорта. Чтобы адрес ресурса был помещен в
табл. экспорта необходимо непосредственно перед определением ресурса написать
ключевые слова:
__declspec (dllexport) int; //
для переменной
__declspec (dllexport) void func(); // для функции
class
__declspec (dllexport) MyClass; //
для класса
Динамическое связывание
HMODULE LoadLbrary(
LPCTSTR sz Name);
Эта
функция загружает библиотеку. Ошибка, если библиотека не найдена. Адрес
экспортируемого ресурса L задается
функцией:
VOID * GetProcAddress (
HMODULE hDLL,
LPCSTR szResourceName);
GetProcAddress
не может иметь Unicode, а только ASCII.
В
таблице экспорта ресурс может находиться как именованный, так и не именованный.
Эта функция загружает и такие и такие.
LPCSTR – не указатель, а номер ресурса (0-65535).
Компилятор
при создании динамически загружаемой библиотеки формирует имена экспортируемых
ресурсов таким образом, чтобы в имени содержалась вся инф-ция о параметрах
функции и о параметре возврата.
Void *Func()
“& Func@@ YAXXZ”
Компилим
DLL, смотрим, что она экспортирует с помощью утилиты DumpBin.exe
. смотрим, во что преобразовалось наше имя и подставляем его в функцию GetProcAddress.
Исп-ем
*.def – файл. В них лежат имена экспортируемых
ресурсов.
Func_Func.
После
работы с библиотекой ее можно выгрузить. Это делает функция freelibraty:
BOOL
FreeLibrary (
HMODULE hDLL);
Harrah's Cherokee Casino & Hotel Map | Mapyro
ОтветитьУдалитьHarrah's Cherokee Casino & Hotel is a hotel 세종특별자치 출장안마 in 충청북도 출장안마 Cherokee, 양산 출장마사지 North Carolina. Read reviews, view photos, see special offers, and contact Harrah's Cherokee Casino 목포 출장샵 & Hotel 경산 출장샵