#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;