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에서 오류가 없습니다
고마워요! 세르지오. IoReleaseCancelSpinLock (Irp-> CancelIrql)을 추가합니다. 그것은 작동합니다. – wenz