2011-05-25 78 views
1

我试图在内存中加载我的进程的映像基础。根据我的理解,您可以调用GetModuleHandle来获取图像库。我的问题是,它的手柄回到基本指向IMAGE_DOS_HEADER结构,例如,你可以做到以下几点:GetModuleHandle获取指向IMAGE_DOS_HEADER的指针?

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

如果这是不正确的,可能你用什么样的方法?

回答

2

这是正确的,但如果你想要一个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我发现,更具可读性和清晰。

+0

感谢Necrolis!我确实想获取代码执行的模块的基础。 – Chris 2011-05-25 15:41:07

+0

@Necrolis:MSDN sais“如果此参数为NULL,则GetModuleHandle将返回用于创建调用进程(.exe文件)的文件的句柄”。所以它总是返回进程的模块。 – user877329 2014-05-17 07:21:02

0

随着微软的编译器和连接器,你可以使用

extern "C" IMAGE_DOS_HEADER __ImageBase;