Жива ли "родительская" копия

Тема в разделе "WASM.BEGINNERS", создана пользователем _nic, 26 ноя 2008.

  1. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Программа запускает свою копию через CreateProcess.Как проверять продолжает ли выполнятся её первая копия? То есть та котороя выполнила CreateProcess.
     
  2. mupsy

    mupsy New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2008
    Сообщения:
    55
    ну вроде бы это только в линуксе мона узнать про родителя,у винды вроде нет такого...
     
  3. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    создавай мьютекс.
    вот пример: http://www.wasm.ru/forum/viewtopic.php?id=29393
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    _nic
    Можно ещё дать дочернему процессу унаследовать свой хэндл. Проверяем существование родительского процесса с помощью WaitForSingleObject с нулевым временем ожидания.
     
  5. HuXTUS

    HuXTUS New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2007
    Сообщения:
    240
    GetExitCodeProcess
    GetExitCodeThread

    сравнивай результат с STILL_ACTIVE.
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Щёлкнул я в проводнике на файл, запустился процесс. Этому процессу нужно узнать работает ли проводник.
    GoldFinch
    И что мне делоть с этим мьютексом ?
    l_inc
    Что за хэндл передать в эту функцию ?
    HuXTUS
    Какой хэндл передать ?
    ;~~~~~~~~~~~~~~~~~~~~~~~~~~
    Нужно определить PID родителя. Простейший способ, но не всюду работать будет - NtQueryInformationProcess(ProcessBasicInformation), возвратит в поле InheritedFromUniqueProcessId идентификатор родительского процесса.
    Следующий способ максимально эффективен, можно получить даже указатель в ядре(и далее на EPROCESS). Недостаток - требует установки бита FLG_MAINTAIN_OBJECT_TYPELIST в реестре(NtGlobalFlags) до ребута, иначе слепок не будет содержать некоторые поля и сервис возвратит ошибку. Это NtQuerySystemInformation(SystemObjectInformation), поле CreatorProcessId.
    Имея PID родителя далее извлекается необходимая информация. В данном случае нужно узнать состояние процесса - NtOpenProcess возвратит по полученному идентификатору хэндл процесса, который передаётся в NtQueryInformationProcess(ProcessBasicInformation). Поле ExitStatus содержит код завершения процесса, если он активен, то там будет STATUS_PENDING.
     
  7. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Clerk
    Почитай внимательно вопрос.
    Такие извраты здесь неуместны.
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Я прочитал только название топика и предложил решение.
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    как это, Parent process id сохраняется в винде и его можно вытащить.
    как бы иначе по-твоему Process Explorer строил дерево процессов
     
  10. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Clerk
    Вот оно, "одно из самых страшных преступлений против цитаты". © diamond
    Там перед этим написано: "Можно ещё дать дочернему процессу унаследовать свой хэндл". Так что за хэндл надо передать? Думаю, можно догадаться, даже если по звёздам и картам не определить.
     
  11. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Какраз вчера была точно подобная задача. Надо было чекать чтобы свой родитель был все время в памяти..
    Через ZwQueryInformationProcess->ProcessBasicInformation получаю InheritedFromUniqueProcessId, открываю процесс, и по хендлу процесса в цикле проверял ZwQueryInformationProcess -> ProcessImageFileName.
    И прикол был в том, что все время возвращал успешно, хоть и давно родительского процесса нету в памяти.. :)
    Решил проблему заменив ZwQueryInformationProcess -> ProcessImageFileName на ZwQueryVirtualMemory -> MemoryBasicInformation, но любопытство не исчезло.., могет кто знает почему ZwQueryInformationProcess по мертвому хендлу возвращает true ?
     
  12. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Flasher
    Объект "процесс" остаётся как минимум до тех пор, пока все хэндлы к нему не будут освобождены. Поэтому, разумеется, и путь к нему получить можно. Как правильно указал Clerk, в данном случае проверять нужно ZwQueryInformationProcess->ProcessBasicInformation->ExitStatus.
     
  13. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Понятно.
    Буду знать, спасибо :)
     
  14. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    l_inc
    Дело не совсем в хендлах как я помню.. В некоторых версиях Windows система не уничтожает объект "процесс" после закрытия всех хендлов. Начиная с XP появились флаги ProcessExiting и ProcessDelete в EPROCESS. Когда они установлены, это значит, что процесс мертв. Но в двусвязном списке процессов он есть. Но при перечислении через ZwQuerySystemInformation (SystemProcessesAndThreadsInformation) такие процессы исключаются. Увидеть его нельзя, кажется и открыть тоже - винда не позволит, но по открытому хендлу можно получить инфу.
     
  15. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Great
    Я потому и написал "как минимум". :)

    Great: :)
     
  16. Dian

    Dian Member

    Публикаций:
    0
    Регистрация:
    19 июн 2008
    Сообщения:
    222
    offtop: а добиться выделения процессорного времени такому процессу реально? ;)
     
  17. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    У него нет ни одного готового к выполнению потока. Кому время отдавать? Кванты выделяются потокам, а не процессам. Процесс это совокупность набора потоков, адресного пространства, таблицы объектов и всякой прочей лабудени.

    Можешь попробовать перенести какой-нибудь нормальный поток другого процесса в пользование этому процессу (в режиме ядра поправив указатели в E/KTHREAD). Тогда поток все равно будет получать управление (вроде бы планировщику по барабану завершен ли процесс, которому принадлежит поток). Но смысла такой махинации не вижу.
     
  18. Dian

    Dian Member

    Публикаций:
    0
    Регистрация:
    19 июн 2008
    Сообщения:
    222
    Смысл в том, что не видно :)
    На счет перевода - наверное, проще живому процессу выставить эти флаги
     
  19. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Гораздо проще сделать unlink EPROCESS'а из двусвязного списка процессов. С тем же, кстати, эффектом. Даже лучше.
     
  20. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Хм....Пытаюсь так
    Код (Text):
    1. PROCESS_INFORMATION pi;
    2. STARTUPINFO si; LPDWORD code;
    3. char fnm[400];
    4. GetModuleFileName(NULL,fnm,400);
    5. si.cb=sizeof(si);
    6. si.lpReserved=NULL;
    7. si.lpDesktop=NULL;
    8. si.lpTitle=NULL,
    9. si.dwFlags=STARTF_FORCEONFEEDBACK;
    10. si.cbReserved2=0;
    11. si.lpReserved2=NULL;
    12. SetLastError(0);
    13. CreateEvent(NULL, FALSE, FALSE, TEXT("ProgName_started"));
    14. if (GetLastError() != ERROR_ALREADY_EXISTS)
    15. {
    16. CreateProcess(fnm,NULL,NULL,NULL,false,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi);
    17. }
    18. if (GetLastError() == ERROR_ALREADY_EXISTS)
    19. {
    20. for(;;)
    21. {
    22. Sleep(300);
    23. GetExitCodeProcess(pi.hProcess,code);
    24. if(code!=(unsigned long*)STILL_ACTIVE)
    25. {MessageBox(0,"сдохло","!!!!!",MB_OK);
    26. break;}
    27. }
    28. }
    В итоге Acces violation в модуле kernel32.dll :dntknw: