Закрывает ли DebugActiveProcessStop дескрипторы?

Согласно документация, ContinueDebugEvent закроет дескрипторы после EXIT_THREAD_DEBUG_EVENT и EXIT_PROCESS_DEBUG_EVENT.

Что происходит с этими ручками в следующем случае:

DebugSetProcessKillOnExit(FALSE); // Keep the process running after stopping the debugger.
DebugActiveProcessStop(dwProcessId);

Процесс и потоки по-прежнему будут работать, а документация ничего не упоминает о дескрипторах. Могу я предположить, что они для меня закроются?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
235
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

да, DebugActiveProcessStop вызывает CloseAllProcessHandles перед фактической остановкой отладки через вызов DbgUiStopDebugging. CloseAllProcessHandles закрывает все открытые потоки и дескрипторы процессов. его список хранится в потоке TEB - это означает, что вызов должен выполняться только из того же потока, который вызывает другой api отладки (например, WaitForDebugEvent). К сожалению, я также не вижу подтверждения этого в документации, только исследования. этот скриншот из win10

Жаль, что это не задокументировано, но, похоже, это ответ. Спасибо!

user1000039 18.11.2018 21:28

@ user1000039 - это трюки с ручками, реализация DebugActiveProcess (которая создает поток в отлаживаемом процессе), невозможность комбинировать ожидание отладочных событий и сообщений графического интерфейса одновременно - причина, по которой я лично не использую Win32 debug api, а DbgUi api

RbMm 18.11.2018 21:57

@ user1000039 - также в Статья о внутренней отладке в пользовательском режиме заметка Alex Ionescu о CloseAllProcessHandles. но я не документация msdn для этого

RbMm 18.11.2018 22:20

Подтверждено на Win10. Легко проверяется с помощью: Получить дескриптор во время события CREATE_PROCESS_DEBUG_EVENT (DebugEvent->u.CreateProcessInfo.hProcess), которое отправляется сразу после DebugActiveProcess(). Затем попробуйте CloseHandle() перед DebugActiveProcessStop(), и он вернет OK. Но попробуйте вызвать его после, и он вернет false с ошибкой «handle invalid». Так я понял, что это вообще происходит!

Maxim Paperno 22.07.2021 13:55

@MaximPaperno - я лично предпочитаю использовать собственный api, DbgUi* для отладчика. он не делает ненужных вещей (например, создает новый поток, если он связан с активным процессом), управляет дескрипторами и т. д.

RbMm 22.07.2021 15:05

Интересный. Я полагаю, вы имеете в виду использование NTDLL? Кажется, трудно найти на нем много информации. openrce.org/articles/full_view/25 и undocumented.ntinternals.net/UserMode/Undocumented%20Functio‌ ns /…. В моем конкретном случае использования, похоже, не хватает эквивалента OUTPUT_DEBUG_STRING_EVENT (просто нужно прослушать какой-то OutputDebugString() запущенного стороннего процесса).

Maxim Paperno 22.07.2021 18:23

@MaximPaperno - DbgExceptionStateChange с кодом исключения DBG_PRINTEXCEPTION_WIDE_C или DBG_PRINTEXCEPTION_C, это отладочная печать (внутренне DbgPrint / OutputDebugStrings), вызовите это исключение

RbMm 22.07.2021 18:41

Другие вопросы по теме