我正在尝试创建一个驱动程序,该驱动程序将拦截某个键序列并在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);
}

10-04 22:12