Hello开发人员,
我正在尝试在Windows上映射可执行二进制文件,然后执行映射文件。
到目前为止,我使用CreateFileMapping
和MapViewOfFile
管理了映射。
这些函数给了我映射文件的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 ?
答案 0 :(得分:0)
没有本地方法来运行驻留在内存中的原始可执行映像。 CreateProcess()
是运行可执行映像的官方方式,但映像必须驻留在文件系统上。操作系统将映像加载到内存中,然后根据需要对其进行修补(解析DLL引用等),以便它实际运行正确。
话虽如此,我已经看到第三方代码浮动,重复了操作系统在将可执行映像加载到内存时的作用。但我只见过与DLL一起使用(因此代码不必使用LoadLibrary/Ex()
在内存中使用DLL),而不是使用EXE。