我在 Windows 7 中编写了一个驱动程序。我使用 pedding IRP 将事件从驱动程序发送到应用程序。关键代码如:
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”函数中。
剂量锁与此错误有关吗?我不知道为什么?我该如何解决?
PS 这个驱动在 Windows XP 中没有错误