windows - MapViewOfFile 返回什么?

标签 windows winapi exe portable-executable

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/

相关文章:

c++ - 开源网络摄像头库

c - Win32 API CopyFile() 无法发送多个文件

Python - 使用 win32service 打开服务即使以管理员身份也会返回“访问被拒绝”

javascript - 如何使用 JavaScript 打开 Windows 程序?

java - 处理网页中的Java exe

php - 如何从另一个执行php脚本?

python - Cython编译为exe,Windows

c++ - Windows CreateFile - 文件打开时的动态共享模式?

windows - 如何使用NSIS向 "Open With"菜单添加程序

c++ - 奇怪的 Unresolved external 错误