【发布时间】:2013-01-29 02:41:30
【问题描述】:
各位开发者您好,
我正在尝试在 Windows 上映射一个可执行的二进制文件,然后执行映射的文件。
到目前为止,我使用CreateFileMapping 和MapViewOfFile 管理映射。
这些函数给了我一个映射文件的句柄和一个指向映射数据的指针,但我不知道如何执行映射的二进制文件。
我想我应该使用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 ?
【问题讨论】:
-
你不能这样做(理论上可能有一些类似于你的问题但仍然不是你想要的东西)。在不映射文件的情况下执行文件有什么问题,例如
CreateProcess? -
我尝试了here 描述的方法(在 Windows 上分叉),但从未成功。 “仅从文件”执行有什么问题?没什么,但我觉得这是一个有趣的主题^^
-
如果可执行数据被映射,Windows不应该将其视为常规文件,因此可以“像文件一样”执行吗?
-
@Jelly:不。为了在内存中实际运行可执行文件,必须解析各种引用(DLL 引用、查找表等),然后可执行文件才能正常工作。您不能只是将图像加载到内存中并按原样运行。这就是操作系统开始使用 .exe 加载程序的原因。
-
我同意所说的,但我认为映射的 file 可以被操作系统用作常规文件,尽管它存储在 RAM 中。那么
CreateFileMapping函数可用的PAGE_EXECUTE_READ和SEC_IMAGE选项有什么用?
标签: c winapi createprocess file-mapping