Added .Type and .Size attributes to the IRP object: so far nothing
[reactos.git] / reactos / ntoskrnl / io / fs.c
index de1fe26..1da59e1 100644 (file)
@@ -1,4 +1,5 @@
-/*
+/* $Id: fs.c,v 1.11 2000/03/06 01:02:30 ea Exp $
+ *
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS kernel
  * FILE:            ntoskrnl/io/fs.c
@@ -26,48 +27,25 @@ typedef struct
 
 /* GLOBALS ******************************************************************/
 
-static KSPIN_LOCK FileSystemListLock = {0,};
-static LIST_ENTRY FileSystemListHead = {NULL,NULL};
+static KSPIN_LOCK FileSystemListLock;
+static LIST_ENTRY FileSystemListHead;
 
 /* FUNCTIONS *****************************************************************/
 
 NTSTATUS
 STDCALL
-NtFsControlFile(
-       IN HANDLE DeviceHandle,
-       IN HANDLE EventHandle OPTIONAL, 
-       IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, 
-       IN PVOID ApcContext OPTIONAL, 
-       OUT PIO_STATUS_BLOCK IoStatusBlock, 
-       IN ULONG IoControlCode,
-       IN PVOID InputBuffer, 
-       IN ULONG InputBufferSize,
-       OUT PVOID OutputBuffer,
-       IN ULONG OutputBufferSize
+NtFsControlFile (
+       IN      HANDLE                  DeviceHandle,
+       IN      HANDLE                  EventHandle     OPTIONAL, 
+       IN      PIO_APC_ROUTINE         ApcRoutine      OPTIONAL, 
+       IN      PVOID                   ApcContext      OPTIONAL, 
+       OUT     PIO_STATUS_BLOCK        IoStatusBlock, 
+       IN      ULONG                   IoControlCode,
+       IN      PVOID                   InputBuffer, 
+       IN      ULONG                   InputBufferSize,
+       OUT     PVOID                   OutputBuffer,
+       IN      ULONG                   OutputBufferSize
        )
-{
-   return(ZwFsControlFile(DeviceHandle,
-                         EventHandle,
-                         ApcRoutine,
-                         ApcContext,
-                         IoStatusBlock,
-                         IoControlCode,
-                         InputBuffer,
-                         InputBufferSize,
-                         OutputBuffer,
-                         OutputBufferSize));
-}
-
-NTSTATUS STDCALL ZwFsControlFile(IN HANDLE DeviceHandle,
-                                IN HANDLE EventHandle OPTIONAL, 
-                                IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, 
-                                IN PVOID ApcContext OPTIONAL, 
-                                OUT PIO_STATUS_BLOCK IoStatusBlock, 
-                                IN ULONG IoControlCode,
-                                IN PVOID InputBuffer, 
-                                IN ULONG InputBufferSize,
-                                OUT PVOID OutputBuffer,
-                                IN ULONG OutputBufferSize)
 {
    NTSTATUS Status = -1;
    PFILE_OBJECT FileObject;
@@ -296,3 +274,64 @@ VOID IoUnregisterFileSystem(PDEVICE_OBJECT DeviceObject)
 }
 
 
+/**********************************************************************
+ * NAME                                                        EXPORTED
+ *     IoGetBaseFileSystemDeviceObject@4
+ *
+ * DESCRIPTION
+ *     Get the DEVICE_OBJECT associated to
+ *     a FILE_OBJECT.
+ *
+ * ARGUMENTS
+ *     FileObject
+ *
+ * RETURN VALUE
+ *
+ * NOTE
+ *     From Bo Branten's ntifs.h v13.
+ */
+PDEVICE_OBJECT
+STDCALL
+IoGetBaseFileSystemDeviceObject (
+       IN      PFILE_OBJECT    FileObject
+       )
+{
+       PDEVICE_OBJECT  DeviceObject = NULL;
+       PVPB            Vpb = NULL;
+
+       /*
+        * If the FILE_OBJECT's VPB is defined,
+        * get the device from it.
+        */
+       if (NULL != (Vpb = FileObject->Vpb)) 
+       {
+               if (NULL != (DeviceObject = Vpb->DeviceObject))
+               {
+                       /* Vpb->DeviceObject DEFINED! */
+                       return DeviceObject;
+               }
+       }
+       /*
+        * If that failed, try the VPB
+        * in the FILE_OBJECT's DeviceObject.
+        */
+       DeviceObject = FileObject->DeviceObject;
+       if (NULL == (Vpb = DeviceObject->Vpb)) 
+       {
+               /* DeviceObject->Vpb UNDEFINED! */
+               return DeviceObject;
+       }
+       /*
+        * If that pointer to the VPB is again
+        * undefined, return directly the
+        * device object from the FILE_OBJECT.
+        */
+       return (
+               (NULL == Vpb->DeviceObject)
+                       ? DeviceObject
+                       : Vpb->DeviceObject
+               );
+}
+
+
+/* EOF */