Author: pschweitzer
Date: Sun Jun 29 03:33:47 2008
New Revision: 34175
URL:
http://svn.reactos.org/svn/reactos?rev=34175&view=rev
Log:
fs_rec.sys is now able to recognize Ext2 partitions and so, to launch Ext2 driver.
Defines have been taken from Linux Kernel Source
Modified:
branches/pierre-fsd/drivers/filesystems/fs_rec/ext2.c
branches/pierre-fsd/drivers/filesystems/fs_rec/fs_rec.h
Modified: branches/pierre-fsd/drivers/filesystems/fs_rec/ext2.c
URL:
http://svn.reactos.org/svn/reactos/branches/pierre-fsd/drivers/filesystems/…
==============================================================================
--- branches/pierre-fsd/drivers/filesystems/fs_rec/ext2.c [iso-8859-1] (original)
+++ branches/pierre-fsd/drivers/filesystems/fs_rec/ext2.c [iso-8859-1] Sun Jun 29 03:33:47
2008
@@ -4,6 +4,7 @@
* FILE: drivers/filesystems/fs_rec/ext2.c
* PURPOSE: EXT2 Recognizer
* PROGRAMMER: Eric Kohl
+ * Pierre Schweitzer
*/
/* INCLUDES *****************************************************************/
@@ -16,10 +17,15 @@
BOOLEAN
NTAPI
-FsRecIsExt2Volume(IN PVOID PackedBootSector)
+FsRecIsExt2Volume(IN pext2_super_block SuperBlock)
{
- /* For now, always return failure... */
- return FALSE;
+ BOOLEAN Result = TRUE;
+ PAGED_CODE();
+
+ if (SuperBlock->s_magic != EXT2_SUPER_MAGIC)
+ Result = FALSE;
+
+ return Result;
}
NTSTATUS
@@ -30,9 +36,9 @@
PIO_STACK_LOCATION Stack;
NTSTATUS Status;
PDEVICE_OBJECT MountDevice;
- PVOID Bpb = NULL;
+ PVOID SuperBlock = NULL;
ULONG SectorSize;
- LARGE_INTEGER Offset = {{0}};
+ LARGE_INTEGER Offset = {{1024}};
BOOLEAN DeviceError = FALSE;
PAGED_CODE();
@@ -49,24 +55,24 @@
MountDevice = Stack->Parameters.MountVolume.DeviceObject;
if (FsRecGetDeviceSectorSize(MountDevice, &SectorSize))
{
- /* Try to read the BPB */
+ /* Try to read the Super Block */
if (FsRecReadBlock(MountDevice,
&Offset,
- 512,
+ 1024,
SectorSize,
- (PVOID)&Bpb,
+ (PVOID)&SuperBlock,
&DeviceError))
{
/* Check if it's an actual EXT2 volume */
- if (FsRecIsExt2Volume(Bpb))
+ if (FsRecIsExt2Volume(SuperBlock))
{
/* It is! */
Status = STATUS_FS_DRIVER_REQUIRED;
}
}
- /* Free the boot sector if we have one */
- ExFreePool(Bpb);
+ /* Free the Super Block if we have one */
+ ExFreePool(SuperBlock);
}
else
{
Modified: branches/pierre-fsd/drivers/filesystems/fs_rec/fs_rec.h
URL:
http://svn.reactos.org/svn/reactos/branches/pierre-fsd/drivers/filesystems/…
==============================================================================
--- branches/pierre-fsd/drivers/filesystems/fs_rec/fs_rec.h [iso-8859-1] (original)
+++ branches/pierre-fsd/drivers/filesystems/fs_rec/fs_rec.h [iso-8859-1] Sun Jun 29
03:33:47 2008
@@ -25,6 +25,12 @@
//
#define UDFS_VRS_START_SECTOR 16
#define UDFS_AVDP_SECTOR 256
+
+//
+// Ext2 Magic
+// Taken from Linux Kernel
+//
+#define EXT2_SUPER_MAGIC 0xEF53
//
// Conversion types and macros taken from internal ntifs headers
@@ -172,6 +178,73 @@
#include <poppack.h>
//
+// Ext2 Structure
+// Taken from Linux Kernel and adapted for ReactOS
+//
+/*
+ * Structure of the super block
+ */
+typedef struct _ext2_super_block
+{
+ ULONG s_inodes_count; /* Inodes count */
+ ULONG s_blocks_count; /* Blocks count */
+ ULONG s_r_blocks_count; /* Reserved blocks count */
+ ULONG s_free_blocks_count; /* Free blocks count */
+ ULONG s_free_inodes_count; /* Free inodes count */
+ ULONG s_first_data_block; /* First Data Block */
+ ULONG s_log_block_size; /* Block size */
+ LONG s_log_frag_size; /* Fragment size */
+ ULONG s_blocks_per_group; /* # Blocks per group */
+ ULONG s_frags_per_group; /* # Fragments per group */
+ ULONG s_inodes_per_group; /* # Inodes per group */
+ ULONG s_mtime; /* Mount time */
+ ULONG s_wtime; /* Write time */
+ USHORT s_mnt_count; /* Mount count */
+ SHORT s_max_mnt_count; /* Maximal mount count */
+ USHORT s_magic; /* Magic signature */
+ USHORT s_state; /* File system state */
+ USHORT s_errors; /* Behaviour when detecting errors */
+ USHORT s_minor_rev_level; /* minor revision level */
+ ULONG s_lastcheck; /* time of last check */
+ ULONG s_checkinterval; /* max. time between checks */
+ ULONG s_creator_os; /* OS */
+ ULONG s_rev_level; /* Revision level */
+ USHORT s_def_resuid; /* Default uid for reserved blocks */
+ USHORT s_def_resgid; /* Default gid for reserved blocks */
+ /*
+ * These fields are for EXT2_DYNAMIC_REV superblocks only.
+ *
+ * Note: the difference between the compatible feature set and
+ * the incompatible feature set is that if there is a bit set
+ * in the incompatible feature set that the kernel doesn't
+ * know about, it should refuse to mount the filesystem.
+ *
+ * e2fsck's requirements are more strict; if it doesn't know
+ * about a feature in either the compatible or incompatible
+ * feature set, it must abort and not try to meddle with
+ * things it doesn't understand...
+ */
+ ULONG s_first_ino; /* First non-reserved inode */
+ USHORT s_inode_size; /* size of inode structure */
+ USHORT s_block_group_nr; /* block group # of this superblock */
+ ULONG s_feature_compat; /* compatible feature set */
+ ULONG s_feature_incompat; /* incompatible feature set */
+ ULONG s_feature_ro_compat; /* readonly-compatible feature set */
+ UCHAR s_uuid[16]; /* 128-bit uuid for volume */
+ char s_volume_name[16]; /* volume name */
+ char s_last_mounted[64]; /* directory where last mounted */
+ ULONG s_algorithm_usage_bitmap; /* For compression */
+ /*
+ * Performance hints. Directory preallocation should only
+ * happen if the EXT2_COMPAT_PREALLOC flag is on.
+ */
+ UCHAR s_prealloc_blocks; /* Nr of blocks to try to preallocate*/
+ UCHAR s_prealloc_dir_blocks; /* Nr to preallocate for dirs */
+ USHORT s_padding1;
+ ULONG s_reserved[204]; /* Padding to the end of the block */
+} ext2_super_block, *pext2_super_block;
+
+//
// Filesystem Types
//
typedef enum _FILE_SYSTEM_TYPE