Possible Duplicate:
Why won't 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与普通文件映射无关。
您可以将 MapViewOfFile 想象为您正在打开的文件的 malloc+memcpy,仅此而已(在幕后情况恰恰相反:malloc 可以使用平板内存映射)。因此,MapViewOfFile 通常只选择一个可以在内存中连续容纳文件 View 字节的地址。
您可能想要的(因为您正在尝试映射 .exe)是用它创建一个新进程 CreateProcess .
如果您确实需要将文件映射到特定地址,您可以使用 MapViewOfFileEx ,但没有任何保证。
关于windows - MapViewOfFile 返回什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9718616/