2 * PROJECT: ReactOS File System Recognizer
3 * LICENSE: GPL-2.0 (https://spdx.org/licenses/GPL-2.0)
4 * PURPOSE: CDFS Recognizer
5 * COPYRIGHT: Copyright 2002 Eric Kohl
6 * Copyright 2007 Alex Ionescu <alex.ionescu@reactos.org>
7 * Copyright 2017 Colin Finck <colin@reactos.org>
10 /* INCLUDES *****************************************************************/
19 /* FUNCTIONS ****************************************************************/
23 FsRecIsCdfsVolume(IN PDEVICE_OBJECT DeviceObject
,
26 BOOLEAN bReturnValue
= FALSE
;
28 PVD_HEADER pVdHeader
= NULL
;
31 // Read the Primary Volume Descriptor.
32 Offset
.QuadPart
= VD_HEADER_OFFSET
;
33 if (!FsRecReadBlock(DeviceObject
, &Offset
, sizeof(VD_HEADER
), SectorSize
, (PVOID
*)&pVdHeader
, NULL
))
35 // We cannot read this block, so no reason to let the CDFS driver try it.
40 if (pVdHeader
->Type
!= VD_TYPE_PRIMARY
)
43 DPRINT("pVdHeader->Type verified!\n");
45 if (RtlCompareMemory(pVdHeader
->Identifier
, VD_IDENTIFIER
, VD_IDENTIFIER_LENGTH
) != VD_IDENTIFIER_LENGTH
)
48 DPRINT("pVdHeader->Identifier verified!\n");
50 if (pVdHeader
->Version
!= VD_VERSION
)
53 DPRINT("pVdHeader->Version verified! This is a CDFS volume!\n");
59 ExFreePool(pVdHeader
);
66 FsRecCdfsFsControl(IN PDEVICE_OBJECT DeviceObject
,
69 PDEVICE_OBJECT MountDevice
;
71 PIO_STACK_LOCATION Stack
;
75 /* Get the I/O Stack and check the function type */
76 Stack
= IoGetCurrentIrpStackLocation(Irp
);
77 switch (Stack
->MinorFunction
)
79 case IRP_MN_MOUNT_VOLUME
:
82 Status
= STATUS_UNRECOGNIZED_VOLUME
;
84 /* Get the device object and request the sector size */
85 MountDevice
= Stack
->Parameters
.MountVolume
.DeviceObject
;
86 if (FsRecGetDeviceSectorSize(MountDevice
, &SectorSize
))
88 /* Check if it's an actual CDFS (ISO-9660) volume */
89 if (FsRecIsCdfsVolume(MountDevice
, SectorSize
))
92 Status
= STATUS_FS_DRIVER_REQUIRED
;
98 case IRP_MN_LOAD_FILE_SYSTEM
:
100 /* Load the file system */
101 Status
= FsRecLoadFileSystem(DeviceObject
,
102 L
"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\Cdfs");
107 /* Invalid request */
108 Status
= STATUS_INVALID_DEVICE_REQUEST
;