[NTOSKRNL]
authorEric Kohl <eric.kohl@reactos.org>
Mon, 16 Feb 2015 15:33:34 +0000 (15:33 +0000)
committerEric Kohl <eric.kohl@reactos.org>
Mon, 16 Feb 2015 15:33:34 +0000 (15:33 +0000)
NtQueryInformationFile: Implement the FileModeInformation case according to 'File System Internals' page 485.

svn path=/trunk/; revision=66319

reactos/ntoskrnl/io/iomgr/iofunc.c

index c04b4e6..d243711 100644 (file)
@@ -865,6 +865,35 @@ IopOpenLinkOrRenameTarget(OUT PHANDLE Handle,
     return STATUS_SUCCESS;
 }
 
+static
+ULONG
+IopGetFileMode(IN PFILE_OBJECT FileObject)
+{
+    ULONG Mode = 0;
+
+    if (FileObject->Flags & FO_WRITE_THROUGH)
+        Mode |= FILE_WRITE_THROUGH;
+
+    if (FileObject->Flags & FO_SEQUENTIAL_ONLY)
+        Mode |= FILE_SEQUENTIAL_ONLY;
+
+    if (FileObject->Flags & FO_NO_INTERMEDIATE_BUFFERING)
+        Mode |= FILE_NO_INTERMEDIATE_BUFFERING;
+
+    if (FileObject->Flags & FO_SYNCHRONOUS_IO)
+    {
+        if (FileObject->Flags & FO_ALERTABLE_IO)
+            Mode |= FILE_SYNCHRONOUS_IO_ALERT;
+        else
+            Mode |= FILE_SYNCHRONOUS_IO_NONALERT;
+    }
+
+    if (FileObject->Flags & FO_DELETE_ON_CLOSE)
+        Mode |= FILE_DELETE_ON_CLOSE;
+
+    return Mode;
+}
+
 /* PUBLIC FUNCTIONS **********************************************************/
 
 /*
@@ -1865,6 +1894,7 @@ NtQueryInformationFile(IN HANDLE FileHandle,
     IO_STATUS_BLOCK KernelIosb;
     BOOLEAN CallDriver = TRUE;
     PFILE_ACCESS_INFORMATION AccessBuffer;
+    PFILE_MODE_INFORMATION ModeBuffer;
     PFILE_ALIGNMENT_INFORMATION AlignmentBuffer;
     PAGED_CODE();
     IOTRACE(IO_API_DEBUG, "FileHandle: %p\n", FileHandle);
@@ -2055,6 +2085,13 @@ NtQueryInformationFile(IN HANDLE FileHandle,
         Irp->IoStatus.Information = sizeof(FILE_ACCESS_INFORMATION);
         CallDriver = FALSE;
     }
+    else if (FileInformationClass == FileModeInformation)
+    {
+        ModeBuffer = Irp->AssociatedIrp.SystemBuffer;
+        ModeBuffer->Mode = IopGetFileMode(FileObject);
+        Irp->IoStatus.Information = sizeof(FILE_MODE_INFORMATION);
+        CallDriver = FALSE;
+    }
     else if (FileInformationClass == FileAlignmentInformation)
     {
         AlignmentBuffer = Irp->AssociatedIrp.SystemBuffer;