2011-07-04 69 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秒的延遲?

斯科特