[NTFS] Fix 2 Clang-Cl warnings about CurrentKey->IndexEntry->Flags
[reactos.git] / drivers / filesystems / fs_rec / cdfs.c
index 5b2fbb4..79fcca6 100644 (file)
@@ -1,25 +1,73 @@
 /*
- * COPYRIGHT:        See COPYING in the top level directory
- * PROJECT:          ReactOS File System Recognizer
- * FILE:             drivers/filesystems/fs_rec/cdfs.c
- * PURPOSE:          CDFS Recognizer
- * PROGRAMMER:       Alex Ionescu (alex.ionescu@reactos.org)
- *                   Eric Kohl
+ * PROJECT:     ReactOS File System Recognizer
+ * LICENSE:     GPL-2.0 (https://spdx.org/licenses/GPL-2.0)
+ * PURPOSE:     CDFS Recognizer
+ * COPYRIGHT:   Copyright 2002 Eric Kohl
+ *              Copyright 2007 Alex Ionescu <alex.ionescu@reactos.org>
+ *              Copyright 2017 Colin Finck <colin@reactos.org>
  */
 
 /* INCLUDES *****************************************************************/
 
 #include "fs_rec.h"
+
 #define NDEBUG
 #include <debug.h>
 
+#include "cdfs.h"
+
 /* FUNCTIONS ****************************************************************/
 
+BOOLEAN
+NTAPI
+FsRecIsCdfsVolume(IN PDEVICE_OBJECT DeviceObject,
+                  IN ULONG SectorSize)
+{
+    BOOLEAN bReturnValue = FALSE;
+    LARGE_INTEGER Offset;
+    PVD_HEADER pVdHeader = NULL;
+    PAGED_CODE();
+
+    // Read the Primary Volume Descriptor.
+    Offset.QuadPart = VD_HEADER_OFFSET;
+    if (!FsRecReadBlock(DeviceObject, &Offset, sizeof(VD_HEADER), SectorSize, (PVOID*)&pVdHeader, NULL))
+    {
+        // We cannot read this block, so no reason to let the CDFS driver try it.
+        goto Cleanup;
+    }
+
+    // Verify the fields.
+    if (pVdHeader->Type != VD_TYPE_PRIMARY)
+        goto Cleanup;
+
+    DPRINT("pVdHeader->Type verified!\n");
+
+    if (RtlCompareMemory(pVdHeader->Identifier, VD_IDENTIFIER, VD_IDENTIFIER_LENGTH) != VD_IDENTIFIER_LENGTH)
+        goto Cleanup;
+
+    DPRINT("pVdHeader->Identifier verified!\n");
+
+    if (pVdHeader->Version != VD_VERSION)
+        goto Cleanup;
+
+    DPRINT("pVdHeader->Version verified! This is a CDFS volume!\n");
+
+    bReturnValue = TRUE;
+
+Cleanup:
+    if (pVdHeader)
+        ExFreePool(pVdHeader);
+
+    return bReturnValue;
+}
+
 NTSTATUS
 NTAPI
 FsRecCdfsFsControl(IN PDEVICE_OBJECT DeviceObject,
                    IN PIRP Irp)
 {
+    PDEVICE_OBJECT MountDevice;
+    ULONG SectorSize;
     PIO_STACK_LOCATION Stack;
     NTSTATUS Status;
     PAGED_CODE();
@@ -30,8 +78,21 @@ FsRecCdfsFsControl(IN PDEVICE_OBJECT DeviceObject,
     {
         case IRP_MN_MOUNT_VOLUME:
 
-            /* We don't validate */
-            Status = STATUS_FS_DRIVER_REQUIRED;
+            /* Assume failure */
+            Status = STATUS_UNRECOGNIZED_VOLUME;
+
+            /* Get the device object and request the sector size */
+            MountDevice = Stack->Parameters.MountVolume.DeviceObject;
+            if (FsRecGetDeviceSectorSize(MountDevice, &SectorSize))
+            {
+                /* Check if it's an actual CDFS (ISO-9660) volume */
+                if (FsRecIsCdfsVolume(MountDevice, SectorSize))
+                {
+                    /* It is! */
+                    Status = STATUS_FS_DRIVER_REQUIRED;
+                }
+            }
+
             break;
 
         case IRP_MN_LOAD_FILE_SYSTEM: