return status;
}
+static DECLSPEC_NOINLINE NTSTATUS
+FdoDispatchCleanup(
+ IN PXENIFACE_FDO Fdo,
+ IN PIRP Irp
+ )
+{
+ PIO_STACK_LOCATION StackLocation;
+ PFILE_OBJECT FileObject;
+
+ StackLocation = IoGetCurrentIrpStackLocation(Irp);
+ FileObject = StackLocation->FileObject;
+
+ // XenIfaceCleanup requires PASSIVE_LEVEL as it can call KeFlushQueuedDpcs
+ ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
+ XenIfaceCleanup(Fdo, FileObject);
+
+ return FdoDispatchComplete(Fdo, Irp);
+}
+
NTSTATUS
FdoDispatch(
IN PXENIFACE_FDO Fdo,
status = FdoDispatchSystemControl(Fdo, Irp);
break;
+ case IRP_MJ_CLEANUP:
+ status = FdoDispatchCleanup(Fdo, Irp);
+ break;
+
case IRP_MJ_CREATE:
case IRP_MJ_CLOSE:
case IRP_MJ_READ: