Получить указатель на IMAGE_DOS_HEADER с помощью GetModuleHandle?

#c #c #windows

#c #c #Windows

Вопрос:

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

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

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

Ответ №1:

Это правильно, хотя, если вам нужен дескриптор модуля библиотеки 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. Спасибо Necrolis! Я действительно хотел получить базу модуля, из которого выполняется код.

2. @Necrolis: MSDN сообщает «Если этот параметр равен НУЛЮ, GetModuleHandle возвращает дескриптор файла, используемого для создания вызывающего процесса (exe-файл)». Таким образом, он всегда возвращает модуль процесса.

Ответ №2:

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

 extern "C" IMAGE_DOS_HEADER __ImageBase;