プロセスを実行し、終了するのを待ち、実行可能ファイルを開いて、それに何かを書き込もうとしています。そこで、まさにそれを行う小さな「ローダー」を作成しました。これは私のコードです:
;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) 実行可能ファイルを開く「ローダー」から別のプロセスを作成し (実行が終了するのを待ってから)、それに書き込みます - 動作します。2) プロセスがまだ開いているようです。つまり、エラーを説明するファイルがまだマップされていますが、なぜマップされるのかわかりません。3) Olly と ProcessExplorer を使用したデバッグ プロセスが終了した後でも、実際に Olly がこのファイルのハンドルを開いていることがわかりました。すべてのハンドルが閉じられました。
どんなアイデアでも大歓迎です!:)