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, cfinck@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/... ============================================================================== --- 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.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 *****************************************************************/ @@ -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/... ============================================================================== --- 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 colin@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 = nativeModified: trunk/reactos/drivers/filesystems/fs_rec/fs_rec.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fs_rec/... ============================================================================== --- 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/... ============================================================================== --- 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! */