2011-07-04 137 views
1

我正在开发Windows设备驱动程序,并且需要将系统关闭的执行延迟约10秒。我使用下面的代码我的司机的DispatchPower()函数中:延迟执行IRP_MN_SET_POWER

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

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

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

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

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

如果你不熟悉这个阅读MSDN了解以下信息:KeInitializeDpcKeInitializeTimerKeSetTimer

+1

STATUS_ALERTED意味着有人提醒你的线程与无证ZwAlertThread API。 STATUS_USER_APC意味着APC排队到该线程,例如使用Win32 API QueueUserApc。 – snoone

+0

不知道'ZwAlertThread'(听起来像一个丑陋的黑客)。我认为''STATUS_USER_APC'被执行后的**被执行后**被返回。至少在可警告的用户模式等待中这是如此 – valdo

1

以前的回答很好,阻止了这样的权力线索(甚至在文档中)。为什么你首先需要10秒的延迟?

斯科特