我只有一个DLL的基地址加载到另一个进程的内存中。 我想获得DLL的图像大小。 所以我从VirtualQuery中获取MEMORY_BASIC_INFORMATION。 这个函数不会失败,但是allocationBase总是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;
// base address of a DLL of other process
这个注释说明了这一切,VirtualQuery只会返回关于你的进程中的虚拟内存的信息,而不是实际上有这个DLL加载的进程。 你需要使用VirtualQueryEx(),用OpenProcess()获取所需的进程句柄。