在Windows上执行映射文件

时间:2013-02-13 14:11:04

标签: c winapi createprocess file-mapping

Hello开发人员,

我正在尝试在Windows上映射可执行二进制文件,然后执行映射文件。

到目前为止,我使用CreateFileMappingMapViewOfFile管理了映射。 这些函数给了我映射文件的HANDLE和指向映射数据的指针,但我不知道如何执行映射的二进制文件。 我想我应该使用CreateProcess函数,但它应该作为参数给出什么?

char *binaryPath = "C:/MyExecutable.exe";

// Get the binary size
std::fstream stream(binaryPath, std::ios::in | std::ios::binary);
stream.seekg(0, std::ios::end);
unsigned int size = stream.tellg();

// Create a mapped file in the paging file system
HANDLE mappedFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_EXECUTE_READ, 0, size, NULL);

// Put the executable data into the mapped file
void* mappedData = MapViewOfFile(mappedFile, FILE_MAP_READ | FILE_MAP_EXECUTE, 0, 0, size);

stream.read((char*)mapping, size);
stream.close();

// What should I do now ?

1 个答案:

答案 0 :(得分:0)

没有本地方法来运行驻留在内存中的原始可执行映像。 CreateProcess()是运行可执行映像的官方方式,但映像必须驻留在文件系统上。操作系统将映像加载到内存中,然后根据需要对其进行修补(解析DLL引用等),以便它实际运行正确。

话虽如此,我已经看到第三方代码浮动,重复了操作系统在将可执行映像加载到内存时的作用。但我只见过与DLL一起使用(因此代码不必使用LoadLibrary/Ex()在内存中使用DLL),而不是使用EXE。