2011-07-04 3 views
1

Windows 장치 드라이버를 개발 중이며 약 10 초 동안 시스템 종료 실행을 지연해야합니다.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()을 기다리지 않고 즉시 반환 것 : 내 드라이버의 DispatchPower() 함수 내에서 다음 코드를 사용하고? 어떤 제안?

감사합니다,

답변

2

특정하지,하지만 여기에 몇 가지 조언은 다음과 같습니다

  1. KeDelayExecutionThread의 반환 값을 확인하십시오. 문서에 따르면 STATUS_ALERTED 또는 STATUS_USER_APC 중 하나와 함께 예비 기능을 반환 할 수있는으로 보입니다. 음, 당신이 경고 할 수없는 상태를 수행하고 있기 때문에 이런 일이 있어서는 안됩니다. 그러나 OTOH는 STATUS_ALERTEDSTATUS_USER_APC의 차이점을 이해하지 못합니다. 이 외에도 정보가 될 수있는 오류 상태가 반환 될 수 있습니다.

  2. 문서에 따르면 IRQL < = APC_LEVEL에서 실행해야합니다. 실제 IRQL (KeGetCurrentIrql)을 확인해야합니다.

  3. 어쨌든, IMHO는 커널 모드에서 스레드를 차단하는 매우 이상한 디자인입니다. 보통 이것은 전체 시스템을 정지시킵니다. IRP 처리를 지연하려면 디스패치 루틴에서 STATUS_PENDING을 반환 한 다음 타이머 DPC를 통해이 IRP를 완료하는 것이 좋습니다. KeInitializeDpc, KeInitializeTimer, KeSetTimer :

이 익숙하지 않은 경우

은 다음에 대해 MSDN을 참조하십시오.

+1

STATUS_ALERTED 사람이 문서화되지 않은 ZwAlertThread API를 사용하여 스레드를 경고 것을 의미한다. STATUS_USER_APC는 APC가 Win32 API QueueUserApc와 같이 스레드에 대기 중임을 나타냅니다. – snoone

+0

'ZwAlertThread' (못생긴 해킹 같은 소리)에 대해 몰랐습니다. APC가 실행 된 후 ** STATUS_USER_APC가 반환됩니다 **. 최소한 이것은 경고 가능한 사용자 모드 대기 상태에 있습니다. – valdo

1

이전 답변은 좋았습니다. 이와 같은 강력한 스레드에서 차단하는 것이 좋습니다 (문서에서도). 왜 처음에는 10 초 지연이 필요한가요?

-scott