Added forgotten ext2.c
Added: branches/ext2/reactos/drivers/fs/fs_rec/ext2.c
_____
Added: branches/ext2/reactos/drivers/fs/fs_rec/ext2.c
--- branches/ext2/reactos/drivers/fs/fs_rec/ext2.c 2005-01-13
02:26:05 UTC (rev 13012)
+++ branches/ext2/reactos/drivers/fs/fs_rec/ext2.c 2005-01-13
02:39:38 UTC (rev 13013)
@@ -0,0 +1,136 @@
+/*
+ * ReactOS kernel
+ * Copyright (C) 2002,2003 ReactOS Team
+ *
+ * This program is free software; you can redistribute it and/or
modify
+ * it under the terms of the GNU General Public License as published
by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/* $Id: fat.c 9284 2004-05-02 20:12:38Z hbirr $
+ *
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS kernel
+ * FILE: drivers/fs/fs_rec/ext2.c (based on vfat.c)
+ * PURPOSE: Filesystem recognizer driver
+ * PROGRAMMER: Eric Kohl
+ */
+
+/* INCLUDES
*****************************************************************/
+
+#include <ddk/ntddk.h>
+#include <rosrtl/string.h>
+
+#define NDEBUG
+#include <debug.h>
+
+#include "fs_rec.h"
+
+
+/* FUNCTIONS
****************************************************************/
+
+static NTSTATUS
+FsRecIsExt2Volume(IN PDEVICE_OBJECT DeviceObject)
+{
+ NTSTATUS Status;
+ PARTITION_INFORMATION PartitionInfo;
+ DISK_GEOMETRY DiskGeometry;
+ ULONG Size;
+ BOOL RecognizedFS = FALSE;
+ Size = sizeof(DISK_GEOMETRY);
+
+ Status = FsRecDeviceIoControl(DeviceObject,
+ IOCTL_DISK_GET_DRIVE_GEOMETRY,
+ NULL,
+ 0,
+ &DiskGeometry,
+ &Size);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT("FsRecDeviceIoControl faild (%x)\n", Status);
+ return Status;
+ }
+ if (DiskGeometry.MediaType == FixedMedia || DiskGeometry.MediaType
== RemovableMedia)
+ {
+ // We have found a hard disk
+ Size = sizeof(PARTITION_INFORMATION);
+ Status = FsRecDeviceIoControl(DeviceObject,
+ IOCTL_DISK_GET_PARTITION_INFO,
+ NULL,
+ 0,
+ &PartitionInfo,
+ &Size);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT("FsRecDeviceIoControl faild (%x)\n", Status);
+ return Status;
+ }
+
+ if (PartitionInfo.PartitionType)
+ {
+ if (PartitionInfo.PartitionType == PARTITION_EXT2)
+ {
+ RecognizedFS = TRUE;
+ }
+ }
+ }
+
+ return RecognizedFS ? STATUS_SUCCESS : STATUS_UNRECOGNIZED_VOLUME;
+}
+
+
+NTSTATUS
+FsRecExt2FsControl(IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ PIO_STACK_LOCATION Stack;
+ UNICODE_STRING RegistryPath;
+ NTSTATUS Status;
+
+ Stack = IoGetCurrentIrpStackLocation(Irp);
+
+ switch (Stack->MinorFunction)
+ {
+ case IRP_MN_MOUNT_VOLUME:
+ DPRINT("FAT: IRP_MN_MOUNT_VOLUME\n");
+ Status =
FsRecIsExt2Volume(Stack->Parameters.MountVolume.DeviceObject);
+ if (NT_SUCCESS(Status))
+ {
+ DPRINT("Identified FAT volume\n");
+ Status = STATUS_FS_DRIVER_REQUIRED;
+ }
+ break;
+
+ case IRP_MN_LOAD_FILE_SYSTEM:
+ DPRINT("FAT: IRP_MN_LOAD_FILE_SYSTEM\n");
+ RtlRosInitUnicodeStringFromLiteral(&RegistryPath,
+
L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\Ext2");
+ Status = ZwLoadDriver(&RegistryPath);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT("ZwLoadDriver failed (Status %x)\n", Status);
+ }
+ else
+ {
+ IoUnregisterFileSystem(DeviceObject);
+ }
+ break;
+
+ default:
+ DPRINT("FAT: Unknown minor function %lx\n",
Stack->MinorFunction);
+ Status = STATUS_INVALID_DEVICE_REQUEST;
+ break;
+ }
+ return(Status);
+}
+
+/* EOF */