通过映射到的地址将文件名映射到内存中

Roy*_*hti 0 c c++ memory windows winapi

假设有以下代码 -

HANDLE h = CreateFile(L"some_dll.dll", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_DELETE,
    NULL,
    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
HANDLE map = CreateFileMapping(h, NULL, PAGE_READONLY | SEC_IMAGE, 0, 0, NULL);
LPVOID res = MapViewOfFileEx(map, 0, 0, 0, 0, 0);
Run Code Online (Sandbox Code Playgroud)

是否有可能使用c ++提取'some_dll',给定它映射到的地址?

当尝试使用windbg调试此可执行文件时,似乎它也不能很好地提取模块

在此输入图像描述

Har*_*ton 5

是的,这正是GetMappedFileName的用途:

检查指定的地址是否在指定进程的地址空间中的内存映射文件中.如果是,则该函数返回内存映射文件的名称.

PS:没有理由windbg显示不是加载模块的内存映射文件的名称,即使该文件恰好是DLL.

  • 文件映射(即Section对象)被映射为`SEC_IMAGE`,内存管理器为PE/COFF映像头中指定的各个部分映射.因此,WinDbg会从映射图像的`IMAGE_EXPORT_DIRECTORY`中显示`Name`,如果它实际作为模块加载,则IIRC将被加载器模块表中的任何名称覆盖.VC++在构建DLL时设置此导出目录`Name`字段.似乎用于构建此DLL的工具将其留空. (2认同)