我正在尝试创建一个驱动程序,它将拦截某个键序列并在Windows中从内核模式执行重新启动,类似于Linux中的REISUB键序列。
我创建了一个类似Ctrl2Cap的键盘钩子,我尝试调用NtShutdownSystem
来重启系统。
处理程序 检测到按键,但问题是当它实际调用NtShutdownSystem
时,我得到一个带有ATTEMPTED_SWITCH_FROM_DPC
错误代码的BSOD。
我假设这是因为我无法从执行DPC关闭系统,所以我可能需要从其他地方执行我的代码。 但我不知道在哪里。
所以问题是:
答案 0 :(得分:5)
似乎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);
}