Выключение Windows из режима ядра? - PullRequest
5 голосов
/ 21 августа 2011

Я пытаюсь создать драйвер, который будет перехватывать определенную последовательность клавиш и выполнять перезагрузку из режима ядра в Windows, аналогично последовательности клавиш REISUB в Linux.

Я создал хук для клавиатуры точно так же, как Ctrl2Cap , и попытался вызвать NtShutdownSystem для перезагрузки системы.

Обработчик обнаруживает обнаружение нажатия клавиши, но проблема в том, что когда он фактически вызывает NtShutdownSystem, я получаю BSOD с кодом ошибки ATTEMPTED_SWITCH_FROM_DPC.

Я предполагаю, что это потому, что я не могу выключить систему из-за выполнения DPC , поэтому мне, вероятно, нужно выполнить мой код откуда-то еще. Но я не знаю где.

Итак, вопрос:

Как может Я выключил систему при обнаружении последовательности клавиш в режиме ядра?

1 Ответ

5 голосов
/ 21 августа 2011

Ах, я разобрался с ответом ...

Похоже, ExQueueWorkItem делает трюк:

VOID NTAPI MyShutdownSystem(PVOID) { NtShutdownSystem(1); }

// ... [code] ...

PWORK_QUEUE_ITEM pWorkItem =
    (PWORK_QUEUE_ITEM)ExAllocatePool(NonPagedPool, sizeof(WORK_QUEUE_ITEM));

if (pWorkItem != NULL) {
    ExInitializeWorkItem(pWorkItem, &MyShutdownSystem, NULL);
    ExQueueWorkItem(pWorkItem, DelayedWorkQueue);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...