Что возвращает GetModuleHandle(NULL)

265
13 ноября 2017, 21:24

Необходимо получить адрес начала PE-заголовка в памяти. Использую данный код:

#define MakePtr(Type, Base, Offset) ((Type)(DWORD(Base) + (DWORD)(Offset)))

HMODULE hModule = GetModuleHandle(NULL);
PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)hModule;
PIMAGE_NT_HEADERS pNTHeaders = MakePtr(PIMAGE_NT_HEADERS,hModule,pDosHeader-
>e_lfanew);
PIMAGE_SECTION_HEADER pSections = IMAGE_FIRST_SECTION(pNTHeaders);

При выводе переменных получаю данные значения:

hModule = 01000000 //дескриптор файла
pDoaHeader = 01000000 //начало Dos заголовка
pDosHeader->e_lfanew = 224
pNTHeaders = 010000E0 // начало PE заголовка 
pSections = 010001D8

Вопрос в том почему используется хэндл(дескриптор файла) для нахождения DOS и PE заголовков? Какое он имеет отношение к структуре самого файла? А то получается какому то непонятному числу присваивается тип PIMAGE_DOS_HEADER и выдается по сути за начало файла. Разве DOS заголовок не идет от начала файла т.е. от 00000000?

Answer 1

GetModuleHandle возвращает хэндл текущего исполнимого модуля (EXE).

В текущих версиях Windows, кажется, его значение равно указателю на базовый адрес модуля. Если формат вашего исполнимого файла начинается с IMAGE_DOS_HEADER'а, то в начале его образа у вас действительно найдётся PIMAGE_DOS_HEADER. (DOS-заголовок идёт с начала файла, да — но нулевой адрес файла не означает нулевой адрес модуля: по адресу 0 расположена страница, которая вызывает access violation при обращении!)

Подтверждение: The Old New Thing: Accessing the current module’s HINSTANCE from a static library. (Плюс вам понадобится также «известный» факт, что HINSTANCE приложения и GetModuleHandle(NULL) одинаковы.)

Тем не менее, я не нашёл упоминания этих фактов в официальной документации, поэтому я бы рассматривал их как ничем не подкреплённый хак. Стоит ли полагаться на него в вашем коде — решать вам.

READ ALSO
Qt Widgets. Форматирование текста.

Qt Widgets. Форматирование текста.

Есть функция, которая при выводе текста на виджет Textedit (chat_edit), выравнивает его по левому краю через Qt::AlignLeftЯ хочу, чтоб, когда я получу текст,...

282
Палиндром - ошибка

Палиндром - ошибка

Программа должна проверять строку на палиндромНе понимаю , в чем ошибка

233
Ошибка undefined reference to + list<T>::iterator it? [дубликат]

Ошибка undefined reference to + list<T>::iterator it? [дубликат]

На данный вопрос уже ответили:

283
Какой компилятор для С++ лучше? [требует правки]

Какой компилятор для С++ лучше? [требует правки]

Не можете подсказать, какой компилятор для С++ лучше? Изучил основы С++ и хочу попрактиваться

227