Как правильно получить размер изображения DLL из ее базового адреса? - PullRequest
0 голосов
/ 05 сентября 2011

У меня только базовый адрес DLL загружен в память другого процесса.Я хочу получить размер изображения DLL.Поэтому я получаю MEMORY_BASIC_INFORMATION от VirtualQuery.Эта функция не завершается с ошибкой, но allocBase всегда равен 0. Приложение вылетает в строке, где вы можете прочитать «ошибка».

Вопросы: Виртуальная работа работает в данной ситуации?Есть ли лучший способ получить размер изображения?Но помните мою ситуацию: я хочу загрузить размер изображения DLL в память другого процесса!DLL не загружена в мое приложение, и у меня нет дескриптора приложения (но можно было бы получить дескриптор).

...
 DWORD baseAddress = (DWORD)me32.modBaseAddr; // base address of a DLL of other process
 MEMORY_BASIC_INFORMATION mem;

    if (NULL==VirtualQuery((LPCVOID)baseAddress, &mem, sizeof(mem))) {
        printError( TEXT("VirtualQuery") );
        return false;
    }

    unsigned char* allocationBase = (unsigned char*)mem.AllocationBase;
    _tprintf( TEXT("\n allocationBase = %d"), allocationBase ); // 0

    IMAGE_DOS_HEADER *dos = (IMAGE_DOS_HEADER*)mem.AllocationBase;

    IMAGE_NT_HEADERS *pe = (IMAGE_NT_HEADERS*)((unsigned long)
    dos+(unsigned long)dos->e_lfanew); // bug crashes application

size_t base_len = (size_t)pe->OptionalHeader.SizeOfImage;

1 Ответ

3 голосов
/ 05 сентября 2011
// base address of a DLL of other process

Комментарий говорит сам за себя, VirtualQuery возвращает информацию о виртуальной памяти только в вашем процессе, а не в процессе, который фактически загружает эту DLL.Вам нужно будет использовать VirtualQueryEx (), получить требуемый дескриптор процесса с помощью OpenProcess ().

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