static NTSTATUS MajorFunction_Irp_finish(DEVICE_OBJECT *DeviceObject,IRP *Irp)
{
+NTSTATUS r;
+
g_return_val_if_fail(TRUE==validate_DeviceObject(DeviceObject),STATUS_INVALID_PARAMETER);
g_return_val_if_fail(Irp!=NULL,STATUS_INVALID_PARAMETER);
Irp->IoStatus.Information=0; /* may got set during some processing before error occured */
}
- IoCompleteRequest(Irp,IO_NO_INCREMENT); /* I hope it won't corrupt our Irp->IoStatus.Status */
- return Irp->IoStatus.Status;
+ /* IoCompleteRequest() will do 'IoFreeIrp(Irp);'!
+ * 'IoStatus.Status' must be saved before its invocation!
+ */
+ r=Irp->IoStatus.Status;
+ IoCompleteRequest(Irp,IO_NO_INCREMENT);
+ return r;
}