如何正确地从其baseaddress获取DLL的图像大小?

时间:2011-09-04 20:10:54

标签: windows visual-c++ memory-management

我只将DLL的基地址加载到另一个进程的内存中。我想获得DLL的图像大小。所以我从VirtualQuery获得了MEMORY_BASIC_INFORMATION。此函数不会失败,但allocateBase始终为0.应用程序在行中崩溃,您可以在其中读取“bug”。

问题:VirtualQuery是否在特定情况下工作?有没有更好的方法来获得图像?但请记住我的情况:我想将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 个答案:

答案 0 :(得分:3)

// base address of a DLL of other process

评论说明了一切,VirtualQuery只返回你的进程中有关虚拟内存的信息,而不是实际加载此DLL的进程。您需要使用VirtualQueryEx(),使用OpenProcess()获取所需的流程句柄。