Существует ли надежный способ определения завершения работы Windows из DLL, без относительно к какому процессу она принадлежить. Например, logoff, reboot, shutdown через кнопку Пуск, taskman, команда shutdown -l(-r,-s), др. DLL_THREAD_DETACH,DLL_PROCESS_DETACH, SetConsoleCtrlHandler, SetProcessShutdownParameters, перехваты ExitProcess, ExitWindowsEx, DispatchMessage не дают желаемого результата во всех случаях. SetWindowsHookEx - разумного ничего не ловило, хотя может я чегото не доучел. Какие еще рарианты могут быть? Спасибо.
Спасибо. да как бы и работает, но далеко не на 100%, особенно при выполнении команды shutdown -l(-r,-s), с ней больше всего проблем!! более того вот эта DLL_THREAD_DETACH, казалось бы глупорсть спасает от срывов во многих случаях, а вот эта "умность" DLL_PROCESS_DETACH дает постоянные просечки может есть у кого еще интересные варианты?
qwertyy Если система заершает работу без участия шадова(быстрое выключение), то на некотором этапе выполняется енум процессов и их завершение просто через PspTerminateProcess(), тоесть никакой нотификации длл не будет. Не вижу стабильного решения в юзермоде(всякие инжекты в csrss, ожидание межпоточное и пр. не вариант).
бывают 1)SetConsoleCtrlHandler -->CTRL_SHUTDOWN_EVENT -->CTRL_LOGOFF_EVENT 2)Для служб есть нотификации SERVICE_CONTROL_SHUTDOWN и SERVICE_CONTROL_PRESHUTDOWN 3)Есть сообщения WM_ENDSESSION и WM_QUERYENDSESSION не знаю, насколько это панацея от всех бед, но приходилось пользоваться SERVICE_CONTROL_SHUTDOWN; оно работало.
1 - не работает для GUI 2 - к сожалению не подходит 3 - через SetWindowsHookEx ничего путного поймать не удалось
через перехват GetMessageW получается отлавливать WM_QUIT, но не на всех системах, например в ХР2 не ловлю, и не во всех способах выхода из ОС.