// error.c // // // Requires DDK Only // File created on 2/2/2005 // #include "pch.h" #ifdef CPR_WMI_TRACE #include "error.tmh" #endif /////////////////////////////////////////////////////////////////////////////////////////////////// // CprSerialError // error detection callback // // Arguments: // IN Dpc // ErrorDpc // // IN Context // our device extension // // IN Unused1 // unused // // IN Unused2 // unused // // Return Value: // None // VOID CprSerialError( IN PKDPC Dpc, IN PVOID Context, IN PVOID Unused1, IN PVOID Unused2 ) { PCPR_DEVICE_EXTENSION deviceExtension; deviceExtension = (PCPR_DEVICE_EXTENSION)Context; CprDebugPrint(deviceExtension, DBG_IO, DBG_WARN, __FUNCTION__"++"); // just cancel all reads and writes CprQueueCancelAll(&deviceExtension->WriteQueue); CprQueueCancelAll(&deviceExtension->ReadQueue); CprDebugPrint(deviceExtension, DBG_IO, DBG_WARN, __FUNCTION__"--"); return; } /////////////////////////////////////////////////////////////////////////////////////////////////// // CprCheckForError // checks if device is in error state // // Arguments: // IN DeviceExtension // our device extension // // IN Irp // new Irp // // Return Value: // Status // NTSTATUS CprCheckForError( IN PCPR_DEVICE_EXTENSION DeviceExtension, IN PIRP Irp ) { NTSTATUS status; PIO_STACK_LOCATION irpStack; CprDebugPrint1(DeviceExtension, DBG_IO, DBG_INFO, __FUNCTION__"++. IRP %p", Irp); // check if we should abort all the new requests in the error state if ((DeviceExtension->SerialHandFlow.ControlHandShake & SERIAL_ERROR_ABORT) && (DeviceExtension->ErrorWord != 0)) { irpStack = IoGetCurrentIrpStackLocation(Irp); // IOCTL_SERIAL_GET_COMMSTATUS should be allowed to get through // even in the error state if ((irpStack->MajorFunction == IRP_MJ_DEVICE_CONTROL) && (irpStack->MinorFunction == IOCTL_SERIAL_GET_COMMSTATUS)) { status = STATUS_SUCCESS; } else { status = STATUS_CANCELLED; Irp->IoStatus.Status = status; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); } } else { status = STATUS_SUCCESS; } CprDebugPrint2(DeviceExtension, DBG_IO, DBG_INFO, __FUNCTION__"--. IRP %p STATUS %x", Irp, status); return status; }