Hi Colin,

Thanks for your work. This commit is likely breaking UDFS recognition
when media has a protective CDFS partition with UDFS afterwards, while
both FSD are unloaded.
You'll first match the CDFS recognizer and not the UDFS recognizer.

I would suggest you modify FsRecRegisterFs() so that you can register
low priority FS.

Cheers,
Pierre

Le 20/08/2017 à 17:30, cfi...@svn.reactos.org a écrit :
> Author: cfinck
> Date: Sun Aug 20 15:30:59 2017
> New Revision: 75630
> 
> URL: http://svn.reactos.org/svn/reactos?rev=75630&view=rev
> Log:
> [FS_REC]
> - Add a detection routine for CDFS (ISO-9660) volumes that verifies the 
> Primary Volume Descriptor.
> - Use this to also detect CDFS on disks and load the CDFS driver if it has 
> not been loaded yet (e.g. when a bootcd/livecd flashed USB drive is inserted 
> at boot of an installed ReactOS).
> - Fix a comment in udfs.c.
> 
> Added:
>     trunk/reactos/drivers/filesystems/fs_rec/cdfs.h   (with props)
> Modified:
>     trunk/reactos/drivers/filesystems/fs_rec/cdfs.c
>     trunk/reactos/drivers/filesystems/fs_rec/fs_rec.c
>     trunk/reactos/drivers/filesystems/fs_rec/udfs.c
> 
> Modified: trunk/reactos/drivers/filesystems/fs_rec/cdfs.c
> URL: 
> http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fs_rec/cdfs.c?rev=75630&r1=75629&r2=75630&view=diff
> ==============================================================================
> --- trunk/reactos/drivers/filesystems/fs_rec/cdfs.c   [iso-8859-1] (original)
> +++ trunk/reactos/drivers/filesystems/fs_rec/cdfs.c   [iso-8859-1] Sun Aug 20 
> 15:30:59 2017
> @@ -1,10 +1,10 @@
>  /*
> - * 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.ione...@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.ione...@reactos.org>
> + *              Copyright 2017 Colin Finck <co...@reactos.org>
>   */
>  
>  /* INCLUDES 
> *****************************************************************/
> @@ -14,13 +14,60 @@
>  #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();
> @@ -31,8 +78,21 @@
>      {
>          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:
> 
> Added: trunk/reactos/drivers/filesystems/fs_rec/cdfs.h
> URL: 
> http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fs_rec/cdfs.h?rev=75630
> ==============================================================================
> --- trunk/reactos/drivers/filesystems/fs_rec/cdfs.h   (added)
> +++ trunk/reactos/drivers/filesystems/fs_rec/cdfs.h   [iso-8859-1] Sun Aug 20 
> 15:30:59 2017
> @@ -0,0 +1,24 @@
> +/*
> + * PROJECT:     ReactOS File System Recognizer
> + * LICENSE:     GPL-2.0 (https://spdx.org/licenses/GPL-2.0+)
> + * PURPOSE:     CDFS Recognizer
> + * COPYRIGHT:   Copyright 2017 Colin Finck <co...@reactos.org>
> + */
> +
> +// Information from http://wiki.osdev.org/ISO_9660#Volume_Descriptors
> +
> +// Structures
> +typedef struct _VD_HEADER
> +{
> +    char Type;
> +    char Identifier[5];
> +    char Version;
> +}
> +VD_HEADER, *PVD_HEADER;
> +
> +// Constants
> +#define VD_HEADER_OFFSET        32768       // Offset of the VD Header
> +#define VD_IDENTIFIER           "CD001"     // Identifier that must be in 
> the Volume Descriptor
> +#define VD_IDENTIFIER_LENGTH    5           // Character count of 
> VD_IDENTIFIER
> +#define VD_TYPE_PRIMARY         1           // Type code for Primary Volume 
> Descriptor
> +#define VD_VERSION              1           // Volume Descriptor Version
> 
> Propchange: trunk/reactos/drivers/filesystems/fs_rec/cdfs.h
> ------------------------------------------------------------------------------
>     svn:eol-style = native
> 
> Modified: trunk/reactos/drivers/filesystems/fs_rec/fs_rec.c
> URL: 
> http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fs_rec/fs_rec.c?rev=75630&r1=75629&r2=75630&view=diff
> ==============================================================================
> --- trunk/reactos/drivers/filesystems/fs_rec/fs_rec.c [iso-8859-1] (original)
> +++ trunk/reactos/drivers/filesystems/fs_rec/fs_rec.c [iso-8859-1] Sun Aug 20 
> 15:30:59 2017
> @@ -316,6 +316,7 @@
>  {
>      ULONG DeviceCount = 0;
>      NTSTATUS Status;
> +    PDEVICE_OBJECT CdfsObject;
>      PDEVICE_OBJECT UdfsObject;
>      PAGED_CODE();
>  
> @@ -340,14 +341,24 @@
>      DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = FsRecFsControl;
>      DriverObject->DriverUnload = FsRecUnload;
>  
> -    /* Register CDFS */
> -    Status = FsRecRegisterFs(DriverObject,
> -                             NULL,
> -                             NULL,
> +    /* Register CDFS for CDs */
> +    Status = FsRecRegisterFs(DriverObject,
> +                             NULL,
> +                             &CdfsObject,
>                               L"\\Cdfs",
>                               L"\\FileSystem\\CdfsRecognizer",
>                               FS_TYPE_CDFS,
>                               FILE_DEVICE_CD_ROM_FILE_SYSTEM);
> +    if (NT_SUCCESS(Status)) DeviceCount++;
> +
> +    /* Register CDFS for HDDs */
> +    Status = FsRecRegisterFs(DriverObject,
> +                             CdfsObject,
> +                             NULL,
> +                             L"\\CdfsHdd",
> +                             L"\\FileSystem\\CdfsHddRecognizer",
> +                             FS_TYPE_CDFS,
> +                             FILE_DEVICE_DISK_FILE_SYSTEM);
>      if (NT_SUCCESS(Status)) DeviceCount++;
>  
>      /* Register UDFS for CDs */
> 
> Modified: trunk/reactos/drivers/filesystems/fs_rec/udfs.c
> URL: 
> http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fs_rec/udfs.c?rev=75630&r1=75629&r2=75630&view=diff
> ==============================================================================
> --- trunk/reactos/drivers/filesystems/fs_rec/udfs.c   [iso-8859-1] (original)
> +++ trunk/reactos/drivers/filesystems/fs_rec/udfs.c   [iso-8859-1] Sun Aug 20 
> 15:30:59 2017
> @@ -125,7 +125,7 @@
>              MountDevice = Stack->Parameters.MountVolume.DeviceObject;
>              if (FsRecGetDeviceSectorSize(MountDevice, &SectorSize))
>              {
> -                /* Check if it's an actual FAT volume */
> +                /* Check if it's an actual UDF volume */
>                  if (FsRecIsUdfsVolume(MountDevice, SectorSize))
>                  {
>                      /* It is! */
> 
> 


-- 
Pierre Schweitzer <pierre at reactos.org>
System & Network Administrator
Senior Kernel Developer
ReactOS Deutschland e.V.

_______________________________________________
Ros-dev mailing list
Ros-dev@reactos.org
http://www.reactos.org/mailman/listinfo/ros-dev

Reply via email to