延迟执行IRP_MN_SET_POWER

时间:2011-07-04 13:36:04

标签: windows device-driver

我正在开发一个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()立即返回而不等待?有什么建议吗?

谢谢,

2 个答案:

答案 0 :(得分:2)

不确定,但这里有一些建议:

  1. 检查KeDelayExecutionThread的返回值。根据文档似乎,此函数可以返回STATUS_ALERTEDSTATUS_USER_APC的初步。好吧,既然你正在执行一个不可警告的状态,这不应该发生,但OTOH我不太明白STATUS_ALERTEDSTATUS_USER_APC之间有什么区别。除此之外,它可能会返回错误状态,这可能是提供信息。

  2. 根据文档,您必须在IRQL< = APC_LEVEL上运行。您应该检查实际的IRQL(KeGetCurrentIrql)。

  3. 无论如何,恕我直言,在内核模式下阻塞线程是一个非常奇怪的设计。通常这会挂起整个系统。如果你想延迟IRP处理,你最好在调度程序中返回STATUS_PENDING,然后通过计时器DPC完成这个IRP。

  4. 如果您对此不熟悉,请阅读以下有关以下内容的MSDN:KeInitializeDpcKeInitializeTimerKeSetTimer

答案 1 :(得分:1)

之前的答案是一个很好的答案,阻止这样的权力线程是不鼓励的(即使在文档中)。你为什么一开始需要10秒的延迟?

-Scott