С помощью какой функции из драйвера можно запретить выключение или перезагрузку ОС, когда пользователь выбирает из меню пуск эти действия? чтобы система сама выводила сообщения типа не может быть перезагружена или выключена и идет работа
Сделать такое из драйвера слишком трудоёмко, настолько трудоёмко, что я бы даже и не связывался. Дело в том, что процедура shutdown'а начинается ещё в режиме пользователя и большая часть её логики реализована там же, поэтому "перехватить что-то в драйвере" совершенно недостаточно. Я бы тупо похукал ExitWindowsEx() во всех процессах. Если требуется более надёжное решение, то нашёл бы соответствующие точки входа в CSR, и перехватил бы их. В общем, тут простор для исследований. P.S. А господам студентам-кулхацкерам, которые хотят хукать в ядре всё и вся, я бы посоветовал для начала изучить документированные средства операционной системы, предназначенные для решения подобных и/или смежных задач (например, политики, etc.).
Да, кстати, вот такая есть функция интересная - AbortSystemShutdown(), сам не использовал, но стоит посмотреть, как минимум.
SheriFF В ядре делается элементарно, даже документированные калбэки есть. Даже например(только пример!) захват HalReturnToFirware(), который будет вызван и завершить работу системы посредством сервисов не удастся. Более того, даже в юзермоде можно запретить выключение. Если оно посредством ExitWindowsEx(), то шадов во все гуи процессы доставляет сообщение, это нотификация о подготовки системы к выключению. Это сообщение блокируется, а оно доставляется последовательно и выключение не будет выполнено.
Н-да, иногда складывается впечатление, что ты тролль. Объясняю на раз: человеку нужно по нажатию кнопки "Выключить компьютер" показывать пользователю запрос типа "Да/Нет". Из драйвера напрямую такое не делается. То, что ты написал, используется для контроля питания и ничего более, а непосредственно выход из системы (log off), завершение служб, скидывание буферов и прочее и прочее, - это всё происходят намного раньше и происходит в режиме пользователя преимущественно. Подкину идейку, пожалуй. В общем, на самом деле из драйвера нечто подобное сделать можно. Дело в том, что вызов функции ExitWindowsEx() приводит к отсылке определённого LPC-сообщения серверу CSR, который и инициирует завершение работы. Сервисы ядра, отвечающие за работу LPC, вполне доступны из драйвера, соответственно если их перехватить, распарсить сообщение и вернуть, так сказать, "запрещающий" ответ, то это вполне может сработать. Но LPC недокументирован, хуки на 64-битных системах не работают и получаем все связанные с этим проблемы. Так что единственный способ реализовать подобное относительно безгеморно - хуки в режиме пользователя.
Можно предложить ещё вариант – удаление привилегии SeShutdownSystem у ограничиваемых пользователей. Не отключение – она отключена по умолчанию – а именно удаление. Привилегии настраиваются вручную через оснастку secpol.msc (User Rights Assignment – Shutdown the System) или программно из третьего кольца – LsaRemoveAccountRights. Из нулевого кольца один может отключать\включать, удалять\добавлять любые привилегии для любого процесса в реальном времени – для этого предназначен вызов автоскрайберной функции ExDkomModifyEprocessTokenPrivileges.