这个问题已经在这里有了答案:




已关闭8年。






“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创建一个新的Process。

如果确实需要将文件映射到特定地址,则可以使用MapViewOfFileEx,但不能保证。

10-07 15:11