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