我試圖運行一個進程,等待它完成,打開可執行文件並向其中寫入內容。所以我創造了一個小的「裝載機」,正是這個。 這是我的代碼:將數據寫入正在運行的可執行文件
;Run the executable
INVOKE GetStartupInfo,OFFSET startInfo
INVOKE CreateProcess, ADDR SomeExecutableFile, \
NULL, NULL, NULL, FALSE, \
NORMAL_PRIORITY_CLASS, NULL,NULL, \
OFFSET startInfo, OFFSET processInfo
INVOKE CloseHandle, processInfo.hThread
;Wait for it to finish & Close handle
INVOKE WaitForSingleObjectEx, processInfo.hProcess, INFINITE, FALSE
INVOKE CloseHandle, processInfo.hProcess
;Try to open the same exe file which just finished executing.
INVOKE CreateFile, OFFSET SomeExecutableFile,GENERIC_WRITE \
,0, 0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL
MOV hFile, EAX
.IF hFile== INVALID_HANDLE_VALUE
INVOKE MessageBox,NULL, OFFSET Problem, OFFSET Problem, MB_ICONWARNING
.ELSE
INVOKE WriteFile, hFile, Buffer, 5, OFFSET BytesWritten , NULL
INVOKE CloseHandle,hFile
.ENDIF
INVOKE ExitProcess,0
正如你所看到的,「SomeExecutable」文件正在跑。它停止執行後,它將使用CreateFile打開。 創建文件失敗,我得到一個INVALID_HANDLE ....,最後一個錯誤 - 0x20 - ERROR_SHARING_VIOLATION。
爲什麼會發生這種情況?
想法&備註: 1)從打開可執行文件的「loader」中創建另一個進程(等待它完成執行後)並寫入它 - 它的工作原理。 2)看起來過程仍然是開放的,即文件仍然映射,這解釋了錯誤,但我不明白爲什麼它會被映射。 3)使用Olly進行調試& ProcessExplorer我看到,即使在進程終止後,Olly也確實打開了此文件的句柄,並且所有句柄都已關閉 - 我不明白爲什麼,以及我該如何關閉它。
歡迎任何想法! :)