Программа запускает свою копию через CreateProcess.Как проверять продолжает ли выполнятся её первая копия? То есть та котороя выполнила CreateProcess.
_nic Можно ещё дать дочернему процессу унаследовать свой хэндл. Проверяем существование родительского процесса с помощью WaitForSingleObject с нулевым временем ожидания.
Щёлкнул я в проводнике на файл, запустился процесс. Этому процессу нужно узнать работает ли проводник. GoldFinch И что мне делоть с этим мьютексом ? l_inc Что за хэндл передать в эту функцию ? HuXTUS Какой хэндл передать ? ;~~~~~~~~~~~~~~~~~~~~~~~~~~ Нужно определить PID родителя. Простейший способ, но не всюду работать будет - NtQueryInformationProcess(ProcessBasicInformation), возвратит в поле InheritedFromUniqueProcessId идентификатор родительского процесса. Следующий способ максимально эффективен, можно получить даже указатель в ядре(и далее на EPROCESS). Недостаток - требует установки бита FLG_MAINTAIN_OBJECT_TYPELIST в реестре(NtGlobalFlags) до ребута, иначе слепок не будет содержать некоторые поля и сервис возвратит ошибку. Это NtQuerySystemInformation(SystemObjectInformation), поле CreatorProcessId. Имея PID родителя далее извлекается необходимая информация. В данном случае нужно узнать состояние процесса - NtOpenProcess возвратит по полученному идентификатору хэндл процесса, который передаётся в NtQueryInformationProcess(ProcessBasicInformation). Поле ExitStatus содержит код завершения процесса, если он активен, то там будет STATUS_PENDING.
как это, Parent process id сохраняется в винде и его можно вытащить. как бы иначе по-твоему Process Explorer строил дерево процессов
Clerk Вот оно, "одно из самых страшных преступлений против цитаты". © diamond Там перед этим написано: "Можно ещё дать дочернему процессу унаследовать свой хэндл". Так что за хэндл надо передать? Думаю, можно догадаться, даже если по звёздам и картам не определить.
Какраз вчера была точно подобная задача. Надо было чекать чтобы свой родитель был все время в памяти.. Через ZwQueryInformationProcess->ProcessBasicInformation получаю InheritedFromUniqueProcessId, открываю процесс, и по хендлу процесса в цикле проверял ZwQueryInformationProcess -> ProcessImageFileName. И прикол был в том, что все время возвращал успешно, хоть и давно родительского процесса нету в памяти.. Решил проблему заменив ZwQueryInformationProcess -> ProcessImageFileName на ZwQueryVirtualMemory -> MemoryBasicInformation, но любопытство не исчезло.., могет кто знает почему ZwQueryInformationProcess по мертвому хендлу возвращает true ?
Flasher Объект "процесс" остаётся как минимум до тех пор, пока все хэндлы к нему не будут освобождены. Поэтому, разумеется, и путь к нему получить можно. Как правильно указал Clerk, в данном случае проверять нужно ZwQueryInformationProcess->ProcessBasicInformation->ExitStatus.
l_inc Дело не совсем в хендлах как я помню.. В некоторых версиях Windows система не уничтожает объект "процесс" после закрытия всех хендлов. Начиная с XP появились флаги ProcessExiting и ProcessDelete в EPROCESS. Когда они установлены, это значит, что процесс мертв. Но в двусвязном списке процессов он есть. Но при перечислении через ZwQuerySystemInformation (SystemProcessesAndThreadsInformation) такие процессы исключаются. Увидеть его нельзя, кажется и открыть тоже - винда не позволит, но по открытому хендлу можно получить инфу.
У него нет ни одного готового к выполнению потока. Кому время отдавать? Кванты выделяются потокам, а не процессам. Процесс это совокупность набора потоков, адресного пространства, таблицы объектов и всякой прочей лабудени. Можешь попробовать перенести какой-нибудь нормальный поток другого процесса в пользование этому процессу (в режиме ядра поправив указатели в E/KTHREAD). Тогда поток все равно будет получать управление (вроде бы планировщику по барабану завершен ли процесс, которому принадлежит поток). Но смысла такой махинации не вижу.
Гораздо проще сделать unlink EPROCESS'а из двусвязного списка процессов. С тем же, кстати, эффектом. Даже лучше.
Хм....Пытаюсь так Код (Text): PROCESS_INFORMATION pi; STARTUPINFO si; LPDWORD code; char fnm[400]; GetModuleFileName(NULL,fnm,400); si.cb=sizeof(si); si.lpReserved=NULL; si.lpDesktop=NULL; si.lpTitle=NULL, si.dwFlags=STARTF_FORCEONFEEDBACK; si.cbReserved2=0; si.lpReserved2=NULL; SetLastError(0); CreateEvent(NULL, FALSE, FALSE, TEXT("ProgName_started")); if (GetLastError() != ERROR_ALREADY_EXISTS) { CreateProcess(fnm,NULL,NULL,NULL,false,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi); } if (GetLastError() == ERROR_ALREADY_EXISTS) { for(;;) { Sleep(300); GetExitCodeProcess(pi.hProcess,code); if(code!=(unsigned long*)STILL_ACTIVE) {MessageBox(0,"сдохло","!!!!!",MB_OK); break;} } } В итоге Acces violation в модуле kernel32.dll