Запрет выключения компьютера

Тема в разделе "WASM.NT.KERNEL", создана пользователем SheriFF, 4 сен 2009.

  1. SheriFF

    SheriFF New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2009
    Сообщения:
    14
    С помощью какой функции из драйвера можно запретить выключение или перезагрузку ОС, когда пользователь выбирает из меню пуск эти действия? чтобы система сама выводила сообщения типа не может быть перезагружена или выключена и идет работа
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Сделать такое из драйвера слишком трудоёмко, настолько трудоёмко, что я бы даже и не связывался. Дело в том, что процедура shutdown'а начинается ещё в режиме пользователя и большая часть её логики реализована там же, поэтому "перехватить что-то в драйвере" совершенно недостаточно. Я бы тупо похукал ExitWindowsEx() во всех процессах. Если требуется более надёжное решение, то нашёл бы соответствующие точки входа в CSR, и перехватил бы их. В общем, тут простор для исследований.

    P.S.
    А господам студентам-кулхацкерам, которые хотят хукать в ядре всё и вся, я бы посоветовал для начала изучить документированные средства операционной системы, предназначенные для решения подобных и/или смежных задач (например, политики, etc.).
     
  3. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Да, кстати, вот такая есть функция интересная - AbortSystemShutdown(), сам не использовал, но стоит посмотреть, как минимум.
     
  4. Clerk

    Clerk Забанен

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

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Clerk, ты за своими хуками-захватами-перехватами не заметил собственно смысла первого поста.
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    x64
    IoRegisterShutdownNotification(), ExCbPowerState и прочие механизмы.
     
  7. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Н-да, иногда складывается впечатление, что ты тролль. Объясняю на раз: человеку нужно по нажатию кнопки "Выключить компьютер" показывать пользователю запрос типа "Да/Нет". Из драйвера напрямую такое не делается. То, что ты написал, используется для контроля питания и ничего более, а непосредственно выход из системы (log off), завершение служб, скидывание буферов и прочее и прочее, - это всё происходят намного раньше и происходит в режиме пользователя преимущественно.

    Подкину идейку, пожалуй. В общем, на самом деле из драйвера нечто подобное сделать можно. Дело в том, что вызов функции ExitWindowsEx() приводит к отсылке определённого LPC-сообщения серверу CSR, который и инициирует завершение работы. Сервисы ядра, отвечающие за работу LPC, вполне доступны из драйвера, соответственно если их перехватить, распарсить сообщение и вернуть, так сказать, "запрещающий" ответ, то это вполне может сработать. Но LPC недокументирован, хуки на 64-битных системах не работают и получаем все связанные с этим проблемы. Так что единственный способ реализовать подобное относительно безгеморно - хуки в режиме пользователя.
     
  8. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
  9. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Можно предложить ещё вариант – удаление привилегии SeShutdownSystem у ограничиваемых пользователей. Не отключение – она отключена по умолчанию – а именно удаление. Привилегии настраиваются вручную через оснастку secpol.msc (User Rights Assignment – Shutdown the System) или программно из третьего кольца – LsaRemoveAccountRights. Из нулевого кольца один может отключать\включать, удалять\добавлять любые привилегии для любого процесса в реальном времени – для этого предназначен вызов автоскрайберной функции ExDkomModifyEprocessTokenPrivileges.