2013-02-13 60 views
-1

您好開發夥伴,在Windows上執行映射文件

我想映射Windows上的可執行二進制文件,然後執行映射文件。

到目前爲止,我管理映射使用CreateFileMappingMapViewOfFile。 這些函數給了我一個處理映射文件和指向映射數據的指針,但我不知道如何執行映射的二進制文件。 我想我應該使用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

你不能這樣做(理論上可能的東西類似於你的問題,但仍然不是你想要的)。執行文件時沒有將其映射到文件中,例如, 'CreateProcess'? – 2013-02-13 14:14:56

+0

我嘗試了[這裏](http://www.rohitab.com/discuss/topic/31681-c-run-program-from-memory-and-not-file/)描述的方法(在Windows上分叉),但從不遇到成功。 「僅從文件」執行有什麼問題?沒有什麼,但我覺得它是一個有趣的主題^^ – Jelly 2013-02-13 14:18:28

+0

如果可執行數據被映射,不應該被視爲Windows的常規文件,因此可執行「像一個文件」? – Jelly 2013-02-13 14:22:39

回答

0

沒有本地方式來運行駐留在內存中的原始可執行映像。 CreateProcess()是運行可執行映像的官方方式,但映像必須位於文件系統上。操作系統將圖像加載到內存中,然後根據需要修補它(解析DLL引用等),以便它實際上可以正確運行。

就這樣說,我已經看到第三方代碼浮動,它重複了操作系統在將可執行映像加載到內存時執行的操作。但我只見過使用DLL(因此代碼不必使用LoadLibrary/Ex()在內存中使用DLL),而不使用EXE。