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

时间:2017-09-12 08:59:30

标签: 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 = MapViewOfFileEx(map, 0, 0, 0, 0, 0);

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

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

enter image description here

1 个答案:

答案 0 :(得分:5)

是的,这正是GetMappedFileName的用途:

  

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

PS: GWT_DOMAIN_SERVICE.findAll(new AsyncCallback<List<GwtDomain>>() { @Override public void onFailure(Throwable caught) { exitMessage = MSGS.dialogAddPermissionErrorDomains(caught.getLocalizedMessage()); exitStatus = false; hide(); } @Override public void onSuccess(List<GwtDomain> result) { for (final GwtDomain gwtDomain : result) { GWT_DOMAIN_SERVICE.findActionsByDomainName(gwtDomain.name(), new AsyncCallback<List<GwtAction>>() { @Override public void onFailure(Throwable caught) { exitMessage = MSGS.dialogAddPermissionErrorActions(caught.getLocalizedMessage()); exitStatus = false; hide(); } @Override public void onSuccess(List<GwtAction> result) { for (GwtAction gwtAction : result) { rootCheckBox= new CheckBox(); rootCheckBox.setBoxLabel(gwtDomain.toString()); treeItemCheckox = new CheckBox(); rootTreeItem = new TreeItem(rootCheckBox); treeItem = new TreeItem(treeItemCheckox); treeItemCheckox.setBoxLabel(gwtAction.toString()); rootTreeItem.addItem(treeItem); } tree.addItem(rootTreeItem); } }); } 没有理由显示不是加载模块的内存映射文件的名称,即使该文件恰好是DLL。