2013-05-13 2 views
0

Windows 7에 드라이버를 씁니다. 그리고 IRP를 사용하여 드라이버에서 응용 프로그램으로 이벤트를 보냅니다. 핵심 코드는 다음과 같습니다.블루 스크린 오류 : DRIVER_RETURNED_HOLDING_CANCEL_LOCK

PIRP PeddingIRP; 

... 

VOID PtDriverCancelIRP(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) 
{ 
    UNREFERENCED_PARAMETER(DeviceObject); 

    KdPrint(("[WENZ] User Message Cancel Irp....\n")); 

    if (Irp == PeddingIRP) 
     PeddingIRP = NULL; 

    Irp->IoStatus.Status = STATUS_CANCELLED; 
    Irp->IoStatus.Information = 0; 
    IoCompleteRequest(Irp,IO_NO_INCREMENT); 
} 

... 

NTSTATUS 
DeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) 
{ 
    ... 
    switch (irpSp->Parameters.DeviceIoControl.IoControlCode) 
    { 
     ... 
    case IOCTL_NOTIFY_STATE: 
    Irp->IoStatus.Information = 0; 
    Irp->IoStatus.Status = STATUS_PENDING; 
    IoMarkIrpPending(Irp); 
    PeddingIRP = Irp; 
     IoSetCancelRoutine(Irp, PtDriverCancelIRP); 

    return STATUS_PENDING; 
     ... 
    } 
    ... 
} 

일부 이벤트가 응용 프로그램에 통지 될 때 작동합니다. 그러나 드라이버를 제거하면 블루 스크린 오류가 발생합니다. 드라이버가 글로벌 취소 잠금을 보유한 취소 호출에서 반환되었습니다. 오류 코드 ID는 0x011B입니다. 나는 windbg 추적을 사용하고 추적은 "PtDriverCancelIRP"함수에서 발생합니다.

복용량은이 오류와 관련이 있습니까? 왜 그런지 몰라? 내가 어떻게 고쳐?

P. 이 드라이버는 Windows XP에서 오류가 없습니다

답변

1

취소 루틴은 취소 스핀 록을 해제 할 책임이 있습니다. 이를 위해서는 IoReleaseCancelSpinLock을 사용하십시오.

VOID PtDriverCancelIRP(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) 
{ 
    UNREFERENCED_PARAMETER(DeviceObject); 

    KdPrint(("[WENZ] User Message Cancel Irp....\n")); 

    if (Irp == PeddingIRP) 
     PeddingIRP = NULL; 

    IoReleaseCancelSpinLock(); // release the cancel spinlock 

    Irp->IoStatus.Status = STATUS_CANCELLED; 
    Irp->IoStatus.Information = 0; 
    IoCompleteRequest(Irp,IO_NO_INCREMENT); 
} 
+0

고마워요! 세르지오. IoReleaseCancelSpinLock (Irp-> CancelIrql)을 추가합니다. 그것은 작동합니다. – wenz

관련 문제