t2f::T2F — пишет лог
err::GetErrMsg() — вызывает GetLastError и форматирует сообщение из полученной ошибки
Это поточная функция, которая как мне казалось должна поймать TerminateProcess вызываемый для моего процесса диспетчером задач, но увы и поэтому прошу помощи у знающих людей как же правильно это сделать?
Re: Поймать TerminateProcess для своего приложения
Здравствуйте, _agg, Вы писали:
_>привет всем, понадобилось в момент когда из диспетчера задач вызывают снять задачу записать в лог сообщение об этом, пытался вот так:
_>Это поточная функция, которая как мне казалось должна поймать TerminateProcess вызываемый для моего процесса диспетчером задач,
но увы и поэтому прошу помощи у знающих людей как же правильно это сделать?
Когда она теоретически могла бы вызваться, твой процесс уже здох. Можно только сделать два процесса и заставить их каждый следить за другим.
Re: Поймать TerminateProcess для своего приложения
Здравствуйте, _agg, Вы писали:
_>Это поточная функция, которая как мне казалось должна поймать TerminateProcess вызываемый для моего процесса диспетчером задач, но увы и поэтому прошу помощи у знающих людей как же правильно это сделать?
Следилочку за людьми пишете? А вот не надо её писать.
Re[2]: Поймать TerminateProcess для своего приложения
Здравствуйте, Слава, Вы писали:
С>Здравствуйте, _agg, Вы писали:
_>>Это поточная функция, которая как мне казалось должна поймать TerminateProcess вызываемый для моего процесса диспетчером задач, но увы и поэтому прошу помощи у знающих людей как же правильно это сделать?
С>Следилочку за людьми пишете? А вот не надо её писать.
Ерунду говорите уважаемый, в логах обрывы непонятно почему они случаются, что бы отсеить возможность что пользователь просто через диспетчер задач выключает приложение для этого это нужно. Прежде чем что-то сказать нужно подумать.
Re: Поймать TerminateProcess для своего приложения
Здравствуйте, _agg, Вы писали: _>привет всем, понадобилось в момент когда из диспетчера задач вызывают снять задачу записать в лог сообщение об этом, пытался вот так:
_>t2f::T2F — пишет лог _>err::GetErrMsg() — вызывает GetLastError и форматирует сообщение из полученной ошибки
_>Это поточная функция, которая как мне казалось должна поймать TerminateProcess вызываемый для моего процесса диспетчером задач, но увы и поэтому прошу помощи у знающих людей как же правильно это сделать?
Как справедливо сказано выше, процесс станет сигнальным объектом, когда уничтожится, то есть перестанет иметь исполняющиеся нити.
Почему этот код должен срабатывать только при уничтожении процесса из диспетчером задач? Как это будет отличаться от других случаев:
не диспетчером задач, а другой внешний процесс, например — антивирус, завершает процесс?
свой же процесс внутри системного или библиотечного кода (по зависимостям) вызывает одну из функций, которая завершает текущий процесс?
необработанное исключение внутри процесса приводит к завершению процесса?
процесс сам завершился "штатно"? Если важно отделить только это событие и сейчас в этой точке завершается нить с приведенным кодом, то тогда может пойти от обратного: в месте завершения нити залогировать "штатный" выход, а если нет такой записи в логе, то считать что произошла непредусмотренная ситуация уничтожения процесса?
Если интересует именно вызов TerminateProcess, то в Windows 10 (а скорее всего и и на более старых версиях) в отдельном процессе можно следить за ETW-событиями, которые логируют вызов TerminateProcess одного процесса для другого:
taskmgr, помимо TerminateProcess, вызывает EndTask, что приведет к RPC-вызову csrss, который уже и будет непосредственным инициатором вызова TerminateProcess.
не TerminateProcess'ом единым можно заставить процесс умереть: 12 ways to terminate a process.
P.S. Зачем вокруг логирования ошибки открытия процесса городить while (false)? В боевом коде после if (!hProcess) есть еще код, который не попал в приведенный пример?
Здравствуйте, EreTIk, Вы писали:
ETI>P.S. Зачем вокруг логирования ошибки открытия процесса городить while (false)? В боевом коде после if (!hProcess) есть еще код, который не попал в приведенный пример?
Этот пример я писал для теста, не судите строго действительно с do while фигня написана, там после if был еще код раньше потом убрал, а do while остался. По сути к такому выводу и пришел что я отловил WM_CLOSE, WM_QUERYENDSESSION, WTS_EVENT_LOGOFF, WTS_EVENT_LOGON, WTS_EVENT_CONNECT, WTS_EVENT_DISCONNECT если оборвалось и не было не одного из событий, то считаю что приложение не штатно завершилось. Хотя с другой стороны должен быть крэш дамп а его нет. Вообщем разбираюсь приложение досталось в поддержку недавно пытаюсь его оживить.
Спасибо за участие )
Re[3]: Поймать TerminateProcess для своего приложения
Здравствуйте, _agg, Вы писали:
_>Этот пример я писал для теста, не судите строго действительно с do while фигня написана, там после if был еще код раньше потом убрал, а do while остался. По сути к такому выводу и пришел что я отловил WM_CLOSE, WM_QUERYENDSESSION, WTS_EVENT_LOGOFF, WTS_EVENT_LOGON, WTS_EVENT_CONNECT, WTS_EVENT_DISCONNECT если оборвалось и не было не одного из событий, то считаю что приложение не штатно завершилось. Хотя с другой стороны должен быть крэш дамп а его нет. Вообщем разбираюсь приложение досталось в поддержку недавно пытаюсь его оживить.
Если тебя интересуют не действия пользователя, а креши, то есть MiniDumpWriteDump и библиотеки-обертки вокруг неё для простого использования.
Re: Поймать TerminateProcess для своего приложения
Здравствуйте, _agg, Вы писали:
_>привет всем, понадобилось в момент когда из диспетчера задач вызывают снять задачу записать в лог сообщение об этом, пытался вот так:
Могу ошибаться, но по-моему Диспетчер задач сначала шлет WM_CLOSE, и если приложение не реагирует, тогда уже TerminateProcess.
Здравствуйте, wildwind, Вы писали:
W>Здравствуйте, _agg, Вы писали:
_>>привет всем, понадобилось в момент когда из диспетчера задач вызывают снять задачу записать в лог сообщение об этом, пытался вот так:
W>Могу ошибаться, но по-моему Диспетчер задач сначала шлет WM_CLOSE, и если приложение не реагирует, тогда уже TerminateProcess.
Типа того.
А что шлют консольному процессу, например .net core веб приложению в nano server в докере?
Там нет окон, но есть поддержка логики остановки/завершения и оно наверно работает. сам не проверял. но стало интересно.
Ctrl-C шлют?
Re[3]: Поймать TerminateProcess для своего приложения
VC>А что шлют консольному процессу, например .net core веб приложению в nano server в докере? VC>Там нет окон, но есть поддержка логики остановки/завершения и оно наверно работает. сам не проверял. но стало интересно. https://docs.microsoft.com/en-us/windows/console/handlerroutine
Как много веселых ребят, и все делают велосипед...
Re[2]: Поймать TerminateProcess для своего приложения
Здравствуйте, morgot, Вы писали:
M>Наверное, если интересует именно диспетчер задач, то проще как-то отслеживать его появление, инжектиться туда и там уже перехватывать.
А еще есть PE и хрен знает что еще с аналогичным функционалом, подменяющие собой диспетчер задач.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.