从内核模式关闭Windows?

时间:2011-08-20 22:12:54

标签: winapi kernel

我正在尝试创建一个驱动程序,它将拦截某个键序列并在Windows中从内核模式执行重新启动,类似于Linux中的REISUB键序列。

我创建了一个类似Ctrl2Cap的键盘钩子,我尝试调用NtShutdownSystem来重启系统。

处理程序 检测到按键,但问题是当它实际调用NtShutdownSystem时,我得到一个带有ATTEMPTED_SWITCH_FROM_DPC错误代码的BSOD。

我假设这是因为我无法从执行DPC关闭系统,所以我可能需要从其他地方执行我的代码。 但我不知道在哪里。

所以问题是:

如何在内核模式下检测到密钥序列后关闭系统?

1 个答案:

答案 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);
}