1 /* 2 * COPYRIGHT: See COPYING in the top level directory 3 * PROJECT: ReactOS File System Recognizer 4 * FILE: drivers/filesystems/fs_rec/ext.c 5 * PURPOSE: EXT Recognizer 6 * PROGRAMMER: Eric Kohl 7 * Pierre Schweitzer (pierre@reactos.org) 8 */ 9 10 /* INCLUDES *****************************************************************/ 11 12 #include "fs_rec.h" 13 #include "ext.h" 14 15 #define NDEBUG 16 #include <debug.h> 17 18 /* FUNCTIONS ****************************************************************/ 19 20 BOOLEAN 21 NTAPI 22 FsRecIsExtVolume(IN PEXT_SUPER_BLOCK SuperBlock) 23 { 24 /* Just check for magic */ 25 return (SuperBlock->Magic == EXT_SUPER_MAGIC); 26 } 27 28 NTSTATUS 29 NTAPI 30 FsRecExtFsControl(IN PDEVICE_OBJECT DeviceObject, 31 IN PIRP Irp) 32 { 33 PIO_STACK_LOCATION Stack; 34 NTSTATUS Status; 35 PDEVICE_OBJECT MountDevice; 36 PEXT_SUPER_BLOCK Spb = NULL; 37 ULONG SectorSize; 38 LARGE_INTEGER Offset; 39 BOOLEAN DeviceError = FALSE; 40 PAGED_CODE(); 41 42 /* Get the I/O Stack and check the function type */ 43 Stack = IoGetCurrentIrpStackLocation(Irp); 44 switch (Stack->MinorFunction) 45 { 46 case IRP_MN_MOUNT_VOLUME: 47 48 /* Assume failure */ 49 Status = STATUS_UNRECOGNIZED_VOLUME; 50 51 /* Get the device object and request the sector size */ 52 MountDevice = Stack->Parameters.MountVolume.DeviceObject; 53 if (FsRecGetDeviceSectorSize(MountDevice, &SectorSize)) 54 { 55 /* Try to read the superblock */ 56 Offset.QuadPart = EXT_SB_OFFSET; 57 if (FsRecReadBlock(MountDevice, 58 &Offset, 59 EXT_SB_SIZE, 60 SectorSize, 61 (PVOID)&Spb, 62 &DeviceError)) 63 { 64 /* Check if it's an actual EXT volume */ 65 if (FsRecIsExtVolume(Spb)) 66 { 67 /* It is! */ 68 Status = STATUS_FS_DRIVER_REQUIRED; 69 } 70 } 71 72 /* Free the boot sector if we have one */ 73 ExFreePool(Spb); 74 } 75 else 76 { 77 /* We have some sort of failure in the storage stack */ 78 DeviceError = TRUE; 79 } 80 81 /* Check if we have an error on the stack */ 82 if (DeviceError) 83 { 84 /* Was this because of a floppy? */ 85 if (MountDevice->Characteristics & FILE_FLOPPY_DISKETTE) 86 { 87 /* Let the FS try anyway */ 88 Status = STATUS_FS_DRIVER_REQUIRED; 89 } 90 } 91 92 break; 93 94 case IRP_MN_LOAD_FILE_SYSTEM: 95 96 /* Load the file system */ 97 Status = FsRecLoadFileSystem(DeviceObject, 98 L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\Ext2fs"); 99 break; 100 101 default: 102 103 /* Invalid request */ 104 Status = STATUS_INVALID_DEVICE_REQUEST; 105 } 106 107 /* Return Status */ 108 return Status; 109 } 110 111 /* EOF */ 112