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
;
159 DbgPrint("Ext2 FSD 0.0.1\n");
161 DriverObject
= _DriverObject
;
163 RtlInitUnicodeString(&DeviceName
,
164 L
"\\Device\\Ext2Fsd");
165 ret
= IoCreateDevice(DriverObject
,
168 FILE_DEVICE_FILE_SYSTEM
,
172 if (ret
!=STATUS_SUCCESS
)
177 DeviceObject
->Flags
=0;
178 DriverObject
->MajorFunction
[IRP_MJ_CLOSE
] = Ext2Close
;
179 DriverObject
->MajorFunction
[IRP_MJ_CREATE
] = Ext2Create
;
180 DriverObject
->MajorFunction
[IRP_MJ_READ
] = Ext2Read
;
181 DriverObject
->MajorFunction
[IRP_MJ_WRITE
] = Ext2Write
;
182 DriverObject
->MajorFunction
[IRP_MJ_FILE_SYSTEM_CONTROL
] =
183 Ext2FileSystemControl
;
184 DriverObject
->MajorFunction
[IRP_MJ_DIRECTORY_CONTROL
] =
185 Ext2DirectoryControl
;
186 DriverObject
->MajorFunction
[IRP_MJ_QUERY_INFORMATION
] =
187 Ext2QueryInformation
;
188 DriverObject
->MajorFunction
[IRP_MJ_SET_INFORMATION
] = Ext2SetInformation
;
189 DriverObject
->MajorFunction
[IRP_MJ_FLUSH_BUFFERS
] = Ext2FlushBuffers
;
190 DriverObject
->MajorFunction
[IRP_MJ_SHUTDOWN
] = Ext2Shutdown
;
191 DriverObject
->MajorFunction
[IRP_MJ_CLEANUP
] = Ext2Cleanup
;
192 DriverObject
->MajorFunction
[IRP_MJ_QUERY_SECURITY
] = Ext2QuerySecurity
;
193 DriverObject
->MajorFunction
[IRP_MJ_SET_SECURITY
] = Ext2SetSecurity
;
194 DriverObject
->MajorFunction
[IRP_MJ_QUERY_QUOTA
] = Ext2QueryQuota
;
195 DriverObject
->MajorFunction
[IRP_MJ_SET_QUOTA
] = Ext2SetQuota
;
197 DriverObject
->DriverUnload
= NULL
;
199 IoRegisterFileSystem(DeviceObject
);
201 return(STATUS_SUCCESS
);