C++ 通过地址将文件名映射到内存中';s映射到

C++ 通过地址将文件名映射到内存中';s映射到,c++,c,windows,winapi,memory,C++,C,Windows,Winapi,Memory,假设有以下代码- 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 =

假设有以下代码-

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);
<> P>是否可以提取“AdjdDLL”,给定它映射到的地址,使用C++? 当尝试使用windbg调试此可执行文件时,似乎无法很好地提取模块

是的,这正是它的用途:

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

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

是的,这正是它的用途:

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

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

文件映射(即节对象)映射为
SEC_IMAGE
,内存管理器按照PE/COFF映像头中的指定映射各个节。因此,WinDbg确实显示了映射图像的
image\u EXPORT\u目录
中的
名称
,如果它实际作为模块加载,则IIRC将被加载程序模块表中的任何名称覆盖。VC++在构建DLL时设置此导出目录
Name
字段。用于构建此DLL的工具似乎将其保留为空。文件映射(即节对象)映射为
SEC_IMAGE
,内存管理器为其映射PE/COFF图像头中指定的各个节。因此,WinDbg确实显示了映射图像的
image\u EXPORT\u目录
中的
名称
,如果它实际作为模块加载,则IIRC将被加载程序模块表中的任何名称覆盖。VC++在构建DLL时设置此导出目录
Name
字段。似乎用于构建此DLL的工具将其保留为空白。