Как узнать о завершении работы из DLL

Тема в разделе "WASM.WIN32", создана пользователем qwertyy, 12 ноя 2010.

  1. qwertyy

    qwertyy New Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2010
    Сообщения:
    5
    Существует ли надежный способ определения завершения работы Windows из DLL, без относительно к какому процессу она принадлежить.
    Например, logoff, reboot, shutdown через кнопку Пуск, taskman, команда shutdown -l(-r,-s), др.
    DLL_THREAD_DETACH,DLL_PROCESS_DETACH, SetConsoleCtrlHandler, SetProcessShutdownParameters, перехваты ExitProcess, ExitWindowsEx, DispatchMessage не дают желаемого результата во всех случаях.
    SetWindowsHookEx - разумного ничего не ловило, хотя может я чегото не доучел.
    Какие еще рарианты могут быть?
    Спасибо.
     
  2. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    Все что ты написал должно работать во всех случаях кроме forced shutdown.
     
  3. qwertyy

    qwertyy New Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2010
    Сообщения:
    5
    Спасибо.

    да как бы и работает, но далеко не на 100%, особенно при выполнении команды shutdown -l(-r,-s), с ней больше всего проблем!!
    более того вот эта DLL_THREAD_DETACH, казалось бы глупорсть спасает от срывов во многих случаях, а вот эта "умность" DLL_PROCESS_DETACH
    дает постоянные просечки

    может есть у кого еще интересные варианты?
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    qwertyy
    Если система заершает работу без участия шадова(быстрое выключение), то на некотором этапе выполняется енум процессов и их завершение просто через PspTerminateProcess(), тоесть никакой нотификации длл не будет. Не вижу стабильного решения в юзермоде(всякие инжекты в csrss, ожидание межпоточное и пр. не вариант).
     
  5. qwertyy

    qwertyy New Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2010
    Сообщения:
    5
    Если это приговор, то печально :dntknw:
     
  6. vptrlx

    vptrlx New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2009
    Сообщения:
    15
    бывают
    1)SetConsoleCtrlHandler
    -->CTRL_SHUTDOWN_EVENT
    -->CTRL_LOGOFF_EVENT
    2)Для служб есть нотификации SERVICE_CONTROL_SHUTDOWN и SERVICE_CONTROL_PRESHUTDOWN
    3)Есть сообщения WM_ENDSESSION и WM_QUERYENDSESSION

    не знаю, насколько это панацея от всех бед, но приходилось пользоваться SERVICE_CONTROL_SHUTDOWN; оно работало.
     
  7. qwertyy

    qwertyy New Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2010
    Сообщения:
    5
    1 - не работает для GUI
    2 - к сожалению не подходит
    3 - через SetWindowsHookEx ничего путного поймать не удалось
     
  8. vptrlx

    vptrlx New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2009
    Сообщения:
    15
    3 - можешь попробовать не хук делать, а создать окошко и ловить
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    И не будет работать для NtShutdownSystem. А это обычный сервис.
     
  10. qwertyy

    qwertyy New Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2010
    Сообщения:
    5
    через перехват GetMessageW получается отлавливать WM_QUIT, но не на всех системах, например в ХР2 не ловлю, и не во всех способах выхода из ОС.