2013-02-13 4 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'? –

+0

필자는 [여기] (http://www.rohitab.com/discuss/topic/31681-c-run-program-from-memory-and-not-file/) (Windows에서 분기)에 설명 된 방법을 시도했지만 절대로 시도하지 않았습니다. 성공했다. "From file only"실행의 문제점은 무엇입니까? 아무것도 아니지만 흥미로운 주제라고 생각합니다 ^^ – Jelly

+0

실행 데이터가 매핑 된 경우 Windows에서 일반 파일로 간주해서는 안되며 따라서 "파일처럼"실행 가능합니까? – Jelly

답변

0

메모리에있는 원시 실행 가능 이미지를 실행하는 기본 방법이 없습니다. CreateProcess()은 실행 가능 이미지를 실행하는 공식적인 방법이지만 이미지는 파일 시스템에 있어야합니다. OS는 이미지를 메모리에로드 한 다음 필요에 따라 패치 (DLL 참조 등을 해결)하여 실제로 올바르게 실행됩니다.

그 말로는 실행 가능 이미지를 메모리에로드 할 때 OS가 수행하는 복제와 관련하여 제 3 자 코드가 떠 다니는 것을 보았습니다. 하지만 난 단지 DLL과 함께 사용되는 것을 보았습니다 (따라서 코드는 메모리에 DLL을 사용하기 위해 LoadLibrary/Ex()을 사용할 필요가 없습니다). EXE와는 다릅니다.