我正在尝试创建一个驱动程序,该驱动程序将拦截某个键序列并在Windows中从内核模式执行重启,类似于Linux中的REISUB键序列。
我已经创建了一个键盘 Hook ,就像Ctrl2Cap一样,并且尝试调用 NtShutdownSystem
重新启动系统。
该处理程序确实检测到按键,但是问题是当它实际调用NtShutdownSystem
时,我收到了带有 ATTEMPTED_SWITCH_FROM_DPC
错误代码的BSOD。
我假设这是因为我无法从正在执行的DPC关闭系统,所以我可能需要从其他地方执行我的代码。
但是我不知道在哪里。
所以问题是:
在内核模式下检测到 key 序列后如何关闭系统?
最佳答案
啊,我想出了答案。
好像 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);
}