我正在开发一个Windows设备驱动程序,需要延迟执行系统关闭大约10秒。我在我的驱动程序的DispatchPower()函数中使用以下代码:
NTSTATUS DispatchPower(
__in struct _DEVICE_OBJECT *DeviceObject,
__in struct _IRP *Irp
)
{
switch(stack->MinorFunction)
{
case IRP_MN_SET_POWER:
delay_time.QuadPart = WDF_REL_TIMEOUT_IN_SEC(10);
KeDelayExecutionThread(KernelMode, FALSE, &delay_time);
}
}
但似乎KeDelayExecutionThread()立即返回而不等待?有什么建议吗?
谢谢,
答案 0 :(得分:2)
不确定,但这里有一些建议:
检查KeDelayExecutionThread
的返回值。根据文档似乎,此函数可以返回STATUS_ALERTED
或STATUS_USER_APC
的初步。好吧,既然你正在执行一个不可警告的状态,这不应该发生,但OTOH我不太明白STATUS_ALERTED
和STATUS_USER_APC
之间有什么区别。除此之外,它可能会返回错误状态,这可能是提供信息。
根据文档,您必须在IRQL< = APC_LEVEL
上运行。您应该检查实际的IRQL(KeGetCurrentIrql
)。
无论如何,恕我直言,在内核模式下阻塞线程是一个非常奇怪的设计。通常这会挂起整个系统。如果你想延迟IRP处理,你最好在调度程序中返回STATUS_PENDING
,然后通过计时器DPC完成这个IRP。
如果您对此不熟悉,请阅读以下有关以下内容的MSDN:KeInitializeDpc
,KeInitializeTimer
,KeSetTimer
。
答案 1 :(得分:1)
之前的答案是一个很好的答案,阻止这样的权力线程是不鼓励的(即使在文档中)。你为什么一开始需要10秒的延迟?
-Scott