c++ - 使用 GetModuleHandle 获取指向 IMAGE_DOS_HEADER 的指针?

标签 c++ c windows

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

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

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

最佳答案

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

关于c++ - 使用 GetModuleHandle 获取指向 IMAGE_DOS_HEADER 的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61593712/

相关文章:

c++ - 通过指向该对象的指针更改对象数据成员的值

c++ - 逐字节读取内存

c++ - 覆盖未调用的虚拟方法

c - 使用c更新文件中的记录

windows - 如何更改 cmd.exe 的默认启动目录?

java - 使用 OpenJDK 将 Jenkins 节点/代理作为 Windows 服务运行

c++ - OpenCV:处理每一帧

我可以使用 C 预处理器有条件地检查宏的值吗?

c++ - 在自定义源和 SmartTee 之间插入过滤器会泄漏 COM 对象

c - 二维数组的段错误