update for HEAD-2003091401
[reactos.git] / ntoskrnl / io / irp.c
index c436611..1619680 100644 (file)
@@ -46,6 +46,9 @@
 /* FUNCTIONS ****************************************************************/
 
 
+/*
+ * @implemented
+ */
 VOID STDCALL
 IoFreeIrp(PIRP Irp)
 /*
@@ -58,6 +61,9 @@ IoFreeIrp(PIRP Irp)
 }
 
 
+/*
+ * @unimplemented
+ */
 PIRP STDCALL
 IoMakeAssociatedIrp(PIRP Irp,
                    CCHAR StackSize)
@@ -77,6 +83,9 @@ IoMakeAssociatedIrp(PIRP Irp,
 }
 
 
+/*
+ * @implemented
+ */
 VOID STDCALL
 IoInitializeIrp(PIRP Irp,
                USHORT PacketSize,
@@ -99,6 +108,9 @@ IoInitializeIrp(PIRP Irp,
 }
 
 
+/*
+ * @implemented
+ */
 NTSTATUS FASTCALL
 IofCallDriver(PDEVICE_OBJECT DeviceObject,
              PIRP Irp)
@@ -128,11 +140,14 @@ IofCallDriver(PDEVICE_OBJECT DeviceObject,
   DPRINT("MajorFunction %d\n", Param->MajorFunction);
   DPRINT("DriverObject->MajorFunction[Param->MajorFunction] %x\n",
     DriverObject->MajorFunction[Param->MajorFunction]);
-  
+
   return DriverObject->MajorFunction[Param->MajorFunction](DeviceObject, Irp);
 }
 
 
+/*
+ * @implemented
+ */
 NTSTATUS
 STDCALL
 IoCallDriver (PDEVICE_OBJECT DeviceObject, PIRP Irp)
@@ -142,6 +157,9 @@ IoCallDriver (PDEVICE_OBJECT DeviceObject, PIRP Irp)
 }
 
 
+/*
+ * @implemented
+ */
 PIRP STDCALL
 IoAllocateIrp(CCHAR StackSize,
              BOOLEAN ChargeQuota)
@@ -191,25 +209,12 @@ IoAllocateIrp(CCHAR StackSize,
 }
 
 
-VOID STDCALL
-IopCompleteRequest(struct _KAPC* Apc,
-                  PKNORMAL_ROUTINE* NormalRoutine,
-                  PVOID* NormalContext,
-                  PVOID* SystemArgument1,
-                  PVOID* SystemArgument2)
-{
-  DPRINT("IopCompleteRequest(Apc %x, SystemArgument1 %x, (*SystemArgument1) %x\n",
-        Apc,
-        SystemArgument1,
-        *SystemArgument1);
-  IoSecondStageCompletion((PIRP)(*SystemArgument1),
-                         (KPRIORITY)(*SystemArgument2));
-}
-
-
+/*
+ * @implemented
+ */
 VOID FASTCALL
 IofCompleteRequest(PIRP Irp,
-                  CCHAR PriorityBoost)
+         CCHAR PriorityBoost)
 /*
  * FUNCTION: Indicates the caller has finished all processing for a given
  * I/O request and is returning the given IRP to the I/O manager
@@ -222,6 +227,7 @@ IofCompleteRequest(PIRP Irp,
    ULONG             i;
    NTSTATUS          Status;
    PDEVICE_OBJECT    DeviceObject;
+   PFILE_OBJECT      OriginalFileObject;
 
    DPRINT("IoCompleteRequest(Irp %x, PriorityBoost %d) Event %x THread %x\n",
       Irp,PriorityBoost, Irp->UserEvent, PsGetCurrentThread());
@@ -261,7 +267,7 @@ IofCompleteRequest(PIRP Irp,
       {
          Status = Irp->Stack[i].CompletionRoutine(DeviceObject,
                                                   Irp,
-                                                  Irp->Stack[i].CompletionContext);
+                                                  Irp->Stack[i].Context);
 
          if (Status == STATUS_MORE_PROCESSING_REQUIRED)
          {
@@ -275,33 +281,48 @@ IofCompleteRequest(PIRP Irp,
       }
    }
 
+   //Windows NT File System Internals, page 154
+   OriginalFileObject = Irp->Tail.Overlay.OriginalFileObject;
+
    if (Irp->PendingReturned)
-     {
-       DPRINT("Dispatching APC\n");
-       KeInitializeApc(&Irp->Tail.Apc,
-                       &Irp->Tail.Overlay.Thread->Tcb,
-                       0,
-                       IopCompleteRequest,
-                       NULL,
-                       (PKNORMAL_ROUTINE)
-                       NULL,
-                       KernelMode,
-                       NULL);
-       KeInsertQueueApc(&Irp->Tail.Apc,
-                        (PVOID)Irp,
-                        (PVOID)(ULONG)PriorityBoost,
-                        KernelMode);
-       DPRINT("Finished dispatching APC\n");
-     }
+   {
+      BOOLEAN bStatus;
+
+      DPRINT("Dispatching APC\n");
+      KeInitializeApc(  &Irp->Tail.Apc,
+                        &Irp->Tail.Overlay.Thread->Tcb,
+                        OriginalApcEnvironment,
+                        IoSecondStageCompletion,
+                        NULL,
+                        (PKNORMAL_ROUTINE) NULL,
+                        KernelMode,
+                        OriginalFileObject);
+      
+      bStatus = KeInsertQueueApc(&Irp->Tail.Apc,
+                                 (PVOID)Irp,
+                                 (PVOID)(ULONG)PriorityBoost,
+                                 PriorityBoost);
+
+      if (bStatus == FALSE)
+      {
+         DPRINT1("Error queueing APC for thread. Thread has probably exited.\n");
+      }
+
+      DPRINT("Finished dispatching APC\n");
+   }
    else
-     {
-       DPRINT("Calling completion routine directly\n");
-       IoSecondStageCompletion(Irp,PriorityBoost);
-       DPRINT("Finished completition routine\n");
-     }
+   {
+      DPRINT("Calling IoSecondStageCompletion routine directly\n");
+      IoSecondStageCompletion(NULL,NULL,(PVOID)&OriginalFileObject,(PVOID) &Irp,(PVOID) &PriorityBoost);
+      DPRINT("Finished completition routine\n");
+   }
+
 }
 
 
+/*
+ * @implemented
+ */
 VOID STDCALL
 IoCompleteRequest(PIRP Irp,
                  CCHAR PriorityBoost)
@@ -324,38 +345,40 @@ IoCompleteRequest(PIRP Irp,
  *
  * RETURN VALUE
  *     TRUE if Irp's operation is synchronous; otherwise FALSE.
+ *
+ * @implemented
  */
 BOOLEAN STDCALL
 IoIsOperationSynchronous(IN PIRP Irp)
 {
-  PFILE_OBJECT FileObject = NULL;
-  ULONG Flags = 0;
+   PFILE_OBJECT FileObject = NULL;
 
-  /* Check the FILE_OBJECT's flags first. */
-  FileObject = IoGetCurrentIrpStackLocation(Irp)->FileObject;
-  if (!(FO_SYNCHRONOUS_IO & FileObject->Flags))
-    {
-      /* Check IRP's flags. */
-      Flags = Irp->Flags;
-      if (!((IRP_SYNCHRONOUS_API | IRP_SYNCHRONOUS_PAGING_IO) & Flags))
-       {
-         return(FALSE);
-       }
-    }
+   FileObject = IoGetCurrentIrpStackLocation(Irp)->FileObject;
+  
+   if (Irp->Flags & IRP_SYNCHRONOUS_PAGING_IO)
+   {
+      return TRUE;
+   }
 
-  /* Check more IRP's flags. */
-  Flags = Irp->Flags;
-  if (!(IRP_PAGING_IO & Flags)
-      || (IRP_SYNCHRONOUS_PAGING_IO & Flags))
-    {
-      return(TRUE);
-    }
+   if (Irp->Flags & IRP_PAGING_IO)
+   {
+      return FALSE;
+   }
+
+   //NOTE: Windows 2000 crash if IoStack->FileObject == NULL, so I guess we should too;-)
+   if (Irp->Flags & IRP_SYNCHRONOUS_API || FileObject->Flags & FO_SYNCHRONOUS_IO)
+   {
+      return TRUE;
+   }
 
-  /* Otherwise, it is an asynchronous operation. */
-  return(FALSE);
+   /* Otherwise, it is an asynchronous operation. */
+   return FALSE;
 }
 
 
+/*
+ * @unimplemented
+ */
 VOID STDCALL
 IoEnqueueIrp(IN PIRP Irp)
 {
@@ -363,6 +386,9 @@ IoEnqueueIrp(IN PIRP Irp)
 }
 
 
+/*
+ * @implemented
+ */
 VOID STDCALL
 IoSetTopLevelIrp(IN PIRP Irp)
 {
@@ -373,6 +399,9 @@ IoSetTopLevelIrp(IN PIRP Irp)
 }
 
 
+/*
+ * @implemented
+ */
 PIRP STDCALL
 IoGetTopLevelIrp(VOID)
 {
@@ -380,44 +409,13 @@ IoGetTopLevelIrp(VOID)
 }
 
 
+/*
+ * @unimplemented
+ */
 VOID STDCALL
 IoQueueThreadIrp(IN PIRP Irp)
 {
   UNIMPLEMENTED;
 }
 
-/*
-NTSTATUS
-STDCALL
-IoSetDeviceInterfaceState(IN PUNICODE_STRING SymbolicLinkName, IN BOOLEAN Enable)
-{
-  UNIMPLEMENTED;
-       return 0;
-}
-
-NTSTATUS
-STDCALL
-IoGetDeviceProperty(
-  IN PDEVICE_OBJECT DeviceObject,
-  IN DEVICE_REGISTRY_PROPERTY DeviceProperty,
-  IN ULONG BufferLength,
-  OUT PVOID PropertyBuffer,
-  OUT PULONG ResultLength)
-{
-  UNIMPLEMENTED;
-       return 0;
-}
-
-NTSTATUS
-STDCALL
-IoOpenDeviceRegistryKey(
-  IN PDEVICE_OBJECT DeviceObject,
-  IN ULONG DevInstKeyType,
-  IN ACCESS_MASK DesiredAccess,
-  OUT PHANDLE DevInstRegKey)
-{
-  UNIMPLEMENTED;
-       return 0;
-}
- */
 /* EOF */