Получить указатель на IMAGE_DOS_HEADER с помощью GetModuleHandle? - PullRequest
1 голос
/ 25 мая 2011

Я пытаюсь получить базу изображений своего процесса, как только он загружен в память.Насколько я понимаю, вы можете вызвать GetModuleHandle, чтобы получить базу изображений.Мой вопрос заключается в том, указывает ли возвращенный дескриптор на структуру IMAGE_DOS_HEADER, чтобы вы могли сделать следующее:

PIMAGE_DOS_HEADER DosHeader;
DosHeader = (PIMAGE_DOS_HEADER)GetModuleHandle(NULL);

Если это не правильно, какой другой метод вы могли бы использовать?

Ответы [ 2 ]

3 голосов
/ 25 мая 2011

Это правильно, хотя, если вы хотите дескриптор модуля dll, вам нужно указать его путь. В противном случае вы получите дескриптор процесса exe. Вы также должны сначала проверить возвращенный HMODULE, чтобы убедиться, что он действителен.

Пример того, как получить виртуальный размер модуля:

std::size_t GetModuleSize(const char* szModule)
{
    HMODULE hModule = GetModuleHandle(szModule);
    if(hModule == NULL) return 0;
    IMAGE_DOS_HEADER* pDOSHeader = (IMAGE_DOS_HEADER*)hModule;
    IMAGE_NT_HEADERS* pNTHeaders =(IMAGE_NT_HEADERS*)((BYTE*)pDOSHeader + pDOSHeader->e_lfanew);
    return pNTHeaders->OptionalHeader.SizeOfImage;
}

вы заметите, что я использую IMAGE_DOS_HEADER*, а не PIMAGE_DOS_HEADER, так как я нахожу это более читабельным и понятным.

1 голос
/ 02 декабря 2017

С компилятором и компоновщиком Microsoft вы можете использовать

extern "C" IMAGE_DOS_HEADER __ImageBase;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...