Отследить завершение потока

Тема в разделе "WASM.WIN32", создана пользователем Clerk, 28 ноя 2008.

  1. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Первый поток исполняет такой код:
    Код (Text):
    1.     xor esp,esp
    2.     dec esp
    3.     push esp
    Как второму потоку того же процесса отследить это ?
     
  2. Dian

    Dian Member

    Публикаций:
    0
    Регистрация:
    19 июн 2008
    Сообщения:
    222
    Что значит "отследить"? Бряк железный поставить на адрес этого кода?
     
  3. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Можно зарегистрировать себя как отладчик и ловить исключения свои же? ^^
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    KeSqueer
    Как это сделоть ?
     
  5. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    DebugActiveProcess
    WaitForDebugEvent
     
  6. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Clerk
    А чем не подходит поставить VEH, в котором сделать синхронизацию, например, через Mutex со вторым потоком?
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Немного криво вопрос задал. Спрошу иначе. Как предотвратить завершение процесса и как следствие всех потоков, если один из потоков выполнит приведённый код ?
    Partner
    Эти апи могут применяться из другого процесса, а нужно чтобы из текущего.
     
  8. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    Так а разве VEH не катит? МСДН пишет, что
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Velheart
    В юзермоде подобное исключение не будет развёрнуто.
     
  10. MikDay

    MikDay New Member

    Публикаций:
    0
    Регистрация:
    5 май 2005
    Сообщения:
    32
    Адрес:
    Minsk
    Обязательно "второму потоку того же процесса"? Создать другой процесс, который будет отладчиком-наблюдателем?
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Да, нужно сделоть без удалённых потоков, возможно это ?
     
  12. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    SetUnhandledExceptionFilter?
    предварительно записать в ss исчо можт чото неприятное и анализировать место падения?
     
  13. PE_Kill

    PE_Kill New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2006
    Сообщения:
    107
    Не совсем понял о ем ты?

    Я такое делал через VEH, в Ring3 всё прекрасно ловится. Также можно захукать KiUserExceptionDispatcher и увести его на NtContinue с коррекцией Eip конечно.

    Или всё это происходит в ring0?
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Freeman
    PE_Kill
    Ядро не вызывает KiUserExceptionDispatcher(), просто снося процесс. Юзермод. Нет, вобще идей у меня нет.
     
  15. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Clerk
    http://www.microsoft.com/technet/prodtechnol/windows2000serv/reskit/regentry/11500.mspx?mfr=true
     
  16. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    KeSqueer
    Отладчик не вызывается, хотя должен..
    При обращении к стеку возникает #PF, оно обрабатываетсо в KiTrap0E:
    KiTrap0E -> KiDispatchException() ->
    Исключение при копировании аргументов в стек(ProbeForWrite) для вызова KiUserExceptionDispatcher() ->
    Код (Text):
    1.         if (DbgkForwardException(ExceptionRecord, TRUE, TRUE)) {
    2.             goto Handled2;
    3.         } else if (DbgkForwardException(ExceptionRecord, FALSE, TRUE)) {
    4.             goto Handled2;
    5.         } else {
    6.             ZwTerminateProcess(NtCurrentProcess(), ExceptionRecord->ExceptionCode);
    Без отладчика никак не словить.
     
  17. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    А как чекать состояние потока кроме как ZwQuerySystemInformation->SYSTEM_PROCESSES->SYSTEM_THREADS.State ?
    Походу ZwQueryInformationThread безполезен в этом плане да ? Через него моно токо чекать жив или мертв поток THREAD_BASIC_INFORMATION.ExitStatus.
    А надо узнать - заморожен или нет поток.

    Из TEB'a потока никак не узнать ?
     
  18. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Flasher
    THREAD_BASIC_INFORMATION.ExitStatus содержит код завершения потока, то значение которое было передано в NtTerminateThread, это не состояние потока, если поток завершён с кодом STATUS_SUCCESS и не завершён это поле будет одинаковым. Для этого подходит SYSTEM_THREADS.State, либо NtSuspendThread, последний сервис возвратит число остановок потока, но не возвратит более подробную информацию о потоке, типо находится ли он в ожидании на обьекте и тп., но если этот сервис вызвать для завершённого потока он возвратит STATUS_THREAD_IS_TERMINATING, что может использоватьсо для определения завершен ли поток.
     
  19. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Clerk
    У меня вызывается, попробуй так:
     
  20. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Clerk, а для чекания - заморожен ли поток придумал один глупый но действенный метод..
    Открыть поток, и в цикле разморозить..

    Код (Text):
    1.      invoke ZwResumeThread,ThreadHandle,addr ThreadStatus
    Если поток был заморожен - ThreadStatus вернет 1 :)