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! */