Я пытаюсь запустить процесс, дождаться его завершения, открыть исполняемый файл и что-то записать в него. Поэтому я создал небольшой «загрузчик», который делает именно это.
Это мой код:
;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 есть дескриптор этого файла, открытый даже после завершения процесса, и все дескрипторы были закрыты - я не понимаю почему, и как, черт возьми, я могу закрыть его:)
Любые идеи приветствуются! :)