IofCallDriver(): Non-handled 'IRP_MJ_FLUSH_BUFFERS' is silently ignored.
[reactos.git] / ntoskrnl / io / irp.c
index e967145..cfaf255 100644 (file)
@@ -133,7 +133,14 @@ IofCallDriver(PDEVICE_OBJECT DeviceObject,
     DriverObject->MajorFunction[Param->MajorFunction]);
 
   if (!DriverObject->MajorFunction[Param->MajorFunction])
-    KeBugCheck(0);
+    {
+      if (Param->MajorFunction==IRP_MJ_FLUSH_BUFFERS)
+       {
+         ObDereferenceObject(Param->FileObject);
+         return STATUS_SUCCESS;
+       }
+      KeBugCheck(0);
+    }
   return DriverObject->MajorFunction[Param->MajorFunction](DeviceObject, Irp);
 }
 
@@ -214,6 +221,12 @@ IopCompleteRequest(struct _KAPC* Apc,
 
 #endif /* LIBCAPTIVE */
 
+
+#ifdef LIBCAPTIVE
+/* file-scope of libcaptive/io/irp.c: */
+extern void IofCompleteRequest_register_APC(PIRP Irp,CCHAR PriorityBoost);
+#endif /* LIBCAPTIVE */
+
 VOID FASTCALL
 IofCompleteRequest(PIRP Irp,
                   CCHAR PriorityBoost)
@@ -288,8 +301,14 @@ IofCompleteRequest(PIRP Irp,
 
    if (Irp->PendingReturned)
      {
+#ifdef LIBCAPTIVE
+       /* FIXME: Why the hell should we bother with some damned APCs?!?
+        * Call it directly below!
+        */
+       DPRINT("IofCompleteRequest() dispatching APC: using g_idle_add_full()\n");
+       IofCompleteRequest_register_APC(Irp,PriorityBoost);
+#else /* !LIBCAPTIVE */
        DPRINT("Dispatching APC\n");
-#ifndef LIBCAPTIVE
        KeInitializeApc(&Irp->Tail.Apc,
                        &Irp->Tail.Overlay.Thread->Tcb,
                        0,
@@ -303,10 +322,8 @@ IofCompleteRequest(PIRP Irp,
                         (PVOID)Irp,
                         (PVOID)(ULONG)PriorityBoost,
                         KernelMode);
-       DPRINT("Finished dispatching APC\n");
-#else /* !LIBCAPTIVE */
-       KeBugCheck(0);
 #endif /* !LIBCAPTIVE */
+       DPRINT("Finished dispatching APC\n");
      }
    else
      {
@@ -348,6 +365,8 @@ IoIsOperationSynchronous(IN PIRP Irp)
 
   /* Check the FILE_OBJECT's flags first. */
   FileObject = IoGetCurrentIrpStackLocation(Irp)->FileObject;
+  if (FileObject == NULL)
+    KeBugCheck(0);
   if (!(FO_SYNCHRONOUS_IO & FileObject->Flags))
     {
       /* Check IRP's flags. */