可能的重复:
为什么加载程序无法加载到所需位置 https://stackoverflow.com/questions/9698496/why-wont-the-loader-load-at-the-desired-location
“MapViewOfFile”,这个函数是否将文件映射到虚拟内存中并返回映射内存的基地址?如果是,那么下面的代码应该输出0X400000,因为默认情况下,exe是在这个位置加载的,但输出是0X360000。为什么??
#include<iostream>
#include<Windows.h>
#include<stdio.h>
#include<WinNT.h>
int main()
{
HANDLE hFile,hFileMapping;
LPVOID lpFileBase;
if((hFile = CreateFile(TEXT("c:\\linked list.exe"),GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0)) == INVALID_HANDLE_VALUE)
std::cout<<"unable to open";
if((hFileMapping = CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL)) == 0)
{
CloseHandle(hFile);
std::cout<<"unable to open for mapping";
}
if((lpFileBase = MapViewOfFile(hFileMapping,FILE_MAP_READ,0,0,0))== 0)
{
CloseHandle(hFile);
CloseHandle(hFileMapping);
std::cout<<"couldn't map view of file";
}
printf("%x\n",lpFileBase);
}
您研究的0X400000与普通文件映射无关。
You can imagineMapViewOfFile 作为您要打开的文件的 malloc+memcpy,仅此而已(在幕后情况恰恰相反:malloc 可以使用平板内存映射)。因此,MapViewOfFile 通常只选择一个可以在内存中连续容纳文件视图字节的地址。
您可能想要的(因为您正在尝试映射 .exe)是用它创建一个新进程创建进程 http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425%28v=vs.85%29.aspx.
如果您确实需要将文件映射到特定地址,您可以使用文件扩展视图 http://msdn.microsoft.com/en-us/library/windows/desktop/aa366763%28v=vs.85%29.aspx,但没有任何保证。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)