使用GetModuleHandle获取指向IMAGE_DOS_HEADER的指针?

时间:2011-05-25 15:28:19

标签: c++ c windows

我试图在我的进程加载到内存后获取其进程的图像库。根据我的理解,您可以调用GetModuleHandle来获取图像库。我的问题是,返回的句柄是否基本上指向IMAGE_DOS_HEADER结构,以便您可以执行以下操作:

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

如果这不正确,您还可以使用其他什么方法?

2 个答案:

答案 0 :(得分:3)

这是正确的,但是如果你想要一个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 :(得分:1)

使用Microsoft的编译器和链接器,您可以使用

extern "C" IMAGE_DOS_HEADER __ImageBase;