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