* FILE: drivers/filesystems/fs_rec/ext2.c
* PURPOSE: EXT2 Recognizer
* PROGRAMMER: Eric Kohl
+ * Pierre Schweitzer (pierre@reactos.org)
*/
/* INCLUDES *****************************************************************/
#include "fs_rec.h"
+#include "ext2.h"
#define NDEBUG
#include <debug.h>
BOOLEAN
NTAPI
-FsRecIsExt2Volume(IN PVOID PackedBootSector)
+FsRecIsExt2Volume(IN PEXT2_SUPER_BLOCK SuperBlock)
{
- UNREFERENCED_PARAMETER(PackedBootSector);
- /* For now, always return failure... */
- return FALSE;
+ /* Just check for magic */
+ return (SuperBlock->Magic == EXT2_SUPER_MAGIC);
}
NTSTATUS
PIO_STACK_LOCATION Stack;
NTSTATUS Status;
PDEVICE_OBJECT MountDevice;
- PVOID Bpb = NULL;
+ PEXT2_SUPER_BLOCK Spb = NULL;
ULONG SectorSize;
- LARGE_INTEGER Offset = {{0, 0}};
+ LARGE_INTEGER Offset;
BOOLEAN DeviceError = FALSE;
PAGED_CODE();
MountDevice = Stack->Parameters.MountVolume.DeviceObject;
if (FsRecGetDeviceSectorSize(MountDevice, &SectorSize))
{
- /* Try to read the BPB */
+ /* Try to read the superblock */
+ Offset.QuadPart = 0x400;
if (FsRecReadBlock(MountDevice,
&Offset,
- 512,
+ 0x400,
SectorSize,
- (PVOID)&Bpb,
+ (PVOID)&Spb,
&DeviceError))
{
/* Check if it's an actual EXT2 volume */
- if (FsRecIsExt2Volume(Bpb))
+ if (FsRecIsExt2Volume(Spb))
{
/* It is! */
Status = STATUS_FS_DRIVER_REQUIRED;
}
/* Free the boot sector if we have one */
- ExFreePool(Bpb);
+ ExFreePool(Spb);
}
else
{
--- /dev/null
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS File System Recognizer
+ * FILE: drivers/filesystems/fs_rec/ext2.h
+ * PURPOSE: EXT2 Header File
+ * PROGRAMMER: Pierre Schweitzer (pierre@reactos.org)
+ */
+
+#include <pshpack1.h>
+typedef struct _EXT2_SUPER_BLOCK {
+ ULONG InodesCount;
+ ULONG BlocksCount;
+ ULONG ReservedBlocksCount;
+ ULONG FreeBlocksCount;
+ ULONG FreeInodesCount;
+ ULONG FirstDataBlock;
+ ULONG LogBlockSize;
+ LONG LogFragSize;
+ ULONG BlocksPerGroup;
+ ULONG FragsPerGroup;
+ ULONG InodesPerGroup;
+ ULONG MountTime;
+ ULONG WriteTime;
+ USHORT MountCount;
+ SHORT MaxMountCount;
+ USHORT Magic;
+ USHORT State;
+ USHORT Errors;
+ USHORT MinorRevLevel;
+ ULONG LastCheck;
+ ULONG CheckInterval;
+ ULONG CreatorOS;
+ ULONG RevLevel;
+ USHORT DefResUid;
+ USHORT DefResGid;
+ // Partial
+} EXT2_SUPER_BLOCK, *PEXT2_SUPER_BLOCK;
+#include <poppack.h>
+
+C_ASSERT(FIELD_OFFSET(EXT2_SUPER_BLOCK, FreeInodesCount) == 0x10);
+C_ASSERT(FIELD_OFFSET(EXT2_SUPER_BLOCK, BlocksPerGroup) == 0x20);
+C_ASSERT(FIELD_OFFSET(EXT2_SUPER_BLOCK, WriteTime) == 0x30);
+C_ASSERT(FIELD_OFFSET(EXT2_SUPER_BLOCK, LastCheck) == 0x40);
+C_ASSERT(FIELD_OFFSET(EXT2_SUPER_BLOCK, DefResUid) == 0x50);
+
+#define EXT2_SUPER_MAGIC 0xEF53