2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: services/fs/ext2/super.c
5 * PURPOSE: ext2 filesystem
6 * PROGRAMMER: David Welch (welch@mcmail.com)
10 /* INCLUDES *****************************************************************/
12 #include <ddk/ntddk.h>
19 /* GLOBALS *****************************************************************/
21 static PDRIVER_OBJECT DriverObject;
23 /* FUNCTIONS ****************************************************************/
26 Ext2Close(PDEVICE_OBJECT DeviceObject, PIRP Irp)
28 PIO_STACK_LOCATION Stack;
29 PFILE_OBJECT FileObject;
30 PDEVICE_EXTENSION DeviceExtension;
34 DbgPrint("Ext2Close(DeviceObject %x, Irp %x)\n",DeviceObject,Irp);
36 Stack = IoGetCurrentIrpStackLocation(Irp);
37 FileObject = Stack->FileObject;
38 DeviceExtension = DeviceObject->DeviceExtension;
40 if (FileObject == DeviceExtension->FileObject)
42 Status = STATUS_SUCCESS;
44 Irp->IoStatus.Status = Status;
45 Irp->IoStatus.Information = 0;
47 IoCompleteRequest(Irp, IO_NO_INCREMENT);
51 Fcb = (PEXT2_FCB)FileObject->FsContext;
56 CcRosReleaseFileCache(FileObject, Fcb->Bcb);
59 FileObject->FsContext = NULL;
62 Status = STATUS_SUCCESS;
64 Irp->IoStatus.Status = Status;
65 Irp->IoStatus.Information = 0;
67 IoCompleteRequest(Irp, IO_NO_INCREMENT);
71 NTSTATUS Ext2Mount(PDEVICE_OBJECT DeviceToMount)
73 PDEVICE_OBJECT DeviceObject;
74 PDEVICE_EXTENSION DeviceExt;
76 struct ext2_super_block* superblock;
78 DPRINT("Ext2Mount(DeviceToMount %x)\n",DeviceToMount);
80 BlockBuffer = ExAllocatePool(NonPagedPool,BLOCKSIZE);
81 Ext2ReadSectors(DeviceToMount,
85 superblock = BlockBuffer;
87 if (superblock->s_magic != EXT2_SUPER_MAGIC)
89 ExFreePool(BlockBuffer);
90 return(STATUS_UNRECOGNIZED_VOLUME);
92 DPRINT("Volume recognized\n");
93 DPRINT("s_inodes_count %d\n",superblock->s_inodes_count);
94 DPRINT("s_blocks_count %d\n",superblock->s_blocks_count);
96 IoCreateDevice(DriverObject,
97 sizeof(DEVICE_EXTENSION),
99 FILE_DEVICE_FILE_SYSTEM,
103 DPRINT("DeviceObject %x\n",DeviceObject);
104 DeviceObject->Flags = DeviceObject->Flags | DO_DIRECT_IO;
105 DeviceExt = (PVOID)DeviceObject->DeviceExtension;
106 DPRINT("DeviceExt %x\n",DeviceExt);
108 DeviceExt->StorageDevice = DeviceToMount;
109 DeviceExt->StorageDevice->Vpb->DeviceObject = DeviceObject;
110 DeviceExt->StorageDevice->Vpb->RealDevice = DeviceExt->StorageDevice;
111 DeviceExt->StorageDevice->Vpb->Flags |= VPB_MOUNTED;
112 DeviceObject->StackSize = DeviceExt->StorageDevice->StackSize + 1;
113 DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
115 DPRINT("DeviceExt->StorageDevice %x\n", DeviceExt->StorageDevice);
116 DeviceExt->FileObject = IoCreateStreamFileObject(NULL, DeviceObject);
117 DeviceExt->superblock = superblock;
118 CcRosInitializeFileCache(DeviceExt->FileObject,
122 DPRINT("Ext2Mount() = STATUS_SUCCESS\n");
124 return(STATUS_SUCCESS);
128 Ext2FileSystemControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
130 PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp);
131 PVPB vpb = Stack->Parameters.Mount.Vpb;
132 PDEVICE_OBJECT DeviceToMount = Stack->Parameters.Mount.DeviceObject;
135 Status = Ext2Mount(DeviceToMount);
137 Irp->IoStatus.Status = Status;
138 Irp->IoStatus.Information = 0;
140 IoCompleteRequest(Irp, IO_NO_INCREMENT);
145 DriverEntry(PDRIVER_OBJECT _DriverObject,
146 PUNICODE_STRING RegistryPath)
148 * FUNCTION: Called by the system to initalize the driver
150 * DriverObject = object describing this driver
151 * RegistryPath = path to our configuration entries
152 * RETURNS: Success or failure
155 PDEVICE_OBJECT DeviceObject;
157 UNICODE_STRING DeviceName = UNICODE_STRING_INITIALIZER(L"\\Device\\Ext2Fsd");
159 DbgPrint("Ext2 FSD 0.0.1\n");
161 DriverObject = _DriverObject;
163 ret = IoCreateDevice(DriverObject,
166 FILE_DEVICE_FILE_SYSTEM,
170 if (ret!=STATUS_SUCCESS)
175 DeviceObject->Flags=0;
176 DriverObject->MajorFunction[IRP_MJ_CLOSE] = Ext2Close;
177 DriverObject->MajorFunction[IRP_MJ_CREATE] = Ext2Create;
178 DriverObject->MajorFunction[IRP_MJ_READ] = Ext2Read;
179 DriverObject->MajorFunction[IRP_MJ_WRITE] = Ext2Write;
180 DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] =
181 Ext2FileSystemControl;
182 DriverObject->MajorFunction[IRP_MJ_DIRECTORY_CONTROL] =
183 Ext2DirectoryControl;
184 DriverObject->MajorFunction[IRP_MJ_QUERY_INFORMATION] =
185 Ext2QueryInformation;
186 DriverObject->MajorFunction[IRP_MJ_SET_INFORMATION] = Ext2SetInformation;
187 DriverObject->MajorFunction[IRP_MJ_FLUSH_BUFFERS] = Ext2FlushBuffers;
188 DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] = Ext2Shutdown;
189 DriverObject->MajorFunction[IRP_MJ_CLEANUP] = Ext2Cleanup;
190 DriverObject->MajorFunction[IRP_MJ_QUERY_SECURITY] = Ext2QuerySecurity;
191 DriverObject->MajorFunction[IRP_MJ_SET_SECURITY] = Ext2SetSecurity;
192 DriverObject->MajorFunction[IRP_MJ_QUERY_QUOTA] = Ext2QueryQuota;
193 DriverObject->MajorFunction[IRP_MJ_SET_QUOTA] = Ext2SetQuota;
195 DriverObject->DriverUnload = NULL;
197 IoRegisterFileSystem(DeviceObject);
199 return(STATUS_SUCCESS);