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>
13 #include <rosrtl/string.h>
20 /* GLOBALS *****************************************************************/
22 static PDRIVER_OBJECT DriverObject
;
24 /* FUNCTIONS ****************************************************************/
27 Ext2Close(PDEVICE_OBJECT DeviceObject
, PIRP Irp
)
29 PIO_STACK_LOCATION Stack
;
30 PFILE_OBJECT FileObject
;
31 PDEVICE_EXTENSION DeviceExtension
;
35 DbgPrint("Ext2Close(DeviceObject %x, Irp %x)\n",DeviceObject
,Irp
);
37 Stack
= IoGetCurrentIrpStackLocation(Irp
);
38 FileObject
= Stack
->FileObject
;
39 DeviceExtension
= DeviceObject
->DeviceExtension
;
41 if (FileObject
== DeviceExtension
->FileObject
)
43 Status
= STATUS_SUCCESS
;
45 Irp
->IoStatus
.Status
= Status
;
46 Irp
->IoStatus
.Information
= 0;
48 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
52 Fcb
= (PEXT2_FCB
)FileObject
->FsContext
;
57 CcRosReleaseFileCache(FileObject
, Fcb
->Bcb
);
60 FileObject
->FsContext
= NULL
;
63 Status
= STATUS_SUCCESS
;
65 Irp
->IoStatus
.Status
= Status
;
66 Irp
->IoStatus
.Information
= 0;
68 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
72 NTSTATUS
Ext2Mount(PDEVICE_OBJECT DeviceToMount
)
74 PDEVICE_OBJECT DeviceObject
;
75 PDEVICE_EXTENSION DeviceExt
;
77 struct ext2_super_block
* superblock
;
79 DPRINT("Ext2Mount(DeviceToMount %x)\n",DeviceToMount
);
81 BlockBuffer
= ExAllocatePool(NonPagedPool
,BLOCKSIZE
);
82 Ext2ReadSectors(DeviceToMount
,
86 superblock
= BlockBuffer
;
88 if (superblock
->s_magic
!= EXT2_SUPER_MAGIC
)
90 ExFreePool(BlockBuffer
);
91 return(STATUS_UNRECOGNIZED_VOLUME
);
93 DPRINT("Volume recognized\n");
94 DPRINT("s_inodes_count %d\n",superblock
->s_inodes_count
);
95 DPRINT("s_blocks_count %d\n",superblock
->s_blocks_count
);
97 IoCreateDevice(DriverObject
,
98 sizeof(DEVICE_EXTENSION
),
100 FILE_DEVICE_FILE_SYSTEM
,
104 DPRINT("DeviceObject %x\n",DeviceObject
);
105 DeviceObject
->Flags
= DeviceObject
->Flags
| DO_DIRECT_IO
;
106 DeviceExt
= (PVOID
)DeviceObject
->DeviceExtension
;
107 DPRINT("DeviceExt %x\n",DeviceExt
);
109 DeviceExt
->StorageDevice
= DeviceToMount
;
110 DeviceExt
->StorageDevice
->Vpb
->DeviceObject
= DeviceObject
;
111 DeviceExt
->StorageDevice
->Vpb
->RealDevice
= DeviceExt
->StorageDevice
;
112 DeviceExt
->StorageDevice
->Vpb
->Flags
|= VPB_MOUNTED
;
113 DeviceObject
->StackSize
= DeviceExt
->StorageDevice
->StackSize
+ 1;
114 DeviceObject
->Flags
&= ~DO_DEVICE_INITIALIZING
;
116 DPRINT("DeviceExt->StorageDevice %x\n", DeviceExt
->StorageDevice
);
117 DeviceExt
->FileObject
= IoCreateStreamFileObject(NULL
, DeviceObject
);
118 DeviceExt
->superblock
= superblock
;
119 CcRosInitializeFileCache(DeviceExt
->FileObject
,
123 DPRINT("Ext2Mount() = STATUS_SUCCESS\n");
125 return(STATUS_SUCCESS
);
129 Ext2FileSystemControl(PDEVICE_OBJECT DeviceObject
, PIRP Irp
)
131 PIO_STACK_LOCATION Stack
= IoGetCurrentIrpStackLocation(Irp
);
132 PVPB vpb
= Stack
->Parameters
.Mount
.Vpb
;
133 PDEVICE_OBJECT DeviceToMount
= Stack
->Parameters
.Mount
.DeviceObject
;
136 Status
= Ext2Mount(DeviceToMount
);
138 Irp
->IoStatus
.Status
= Status
;
139 Irp
->IoStatus
.Information
= 0;
141 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
146 DriverEntry(PDRIVER_OBJECT _DriverObject
,
147 PUNICODE_STRING RegistryPath
)
149 * FUNCTION: Called by the system to initalize the driver
151 * DriverObject = object describing this driver
152 * RegistryPath = path to our configuration entries
153 * RETURNS: Success or failure
156 PDEVICE_OBJECT DeviceObject
;
158 UNICODE_STRING DeviceName
= ROS_STRING_INITIALIZER(L
"\\Device\\Ext2Fsd");
160 DbgPrint("Ext2 FSD 0.0.1\n");
162 DriverObject
= _DriverObject
;
164 ret
= IoCreateDevice(DriverObject
,
167 FILE_DEVICE_FILE_SYSTEM
,
171 if (ret
!=STATUS_SUCCESS
)
176 DeviceObject
->Flags
=0;
177 DriverObject
->MajorFunction
[IRP_MJ_CLOSE
] = Ext2Close
;
178 DriverObject
->MajorFunction
[IRP_MJ_CREATE
] = Ext2Create
;
179 DriverObject
->MajorFunction
[IRP_MJ_READ
] = Ext2Read
;
180 DriverObject
->MajorFunction
[IRP_MJ_WRITE
] = Ext2Write
;
181 DriverObject
->MajorFunction
[IRP_MJ_FILE_SYSTEM_CONTROL
] =
182 Ext2FileSystemControl
;
183 DriverObject
->MajorFunction
[IRP_MJ_DIRECTORY_CONTROL
] =
184 Ext2DirectoryControl
;
185 DriverObject
->MajorFunction
[IRP_MJ_QUERY_INFORMATION
] =
186 Ext2QueryInformation
;
187 DriverObject
->MajorFunction
[IRP_MJ_SET_INFORMATION
] = Ext2SetInformation
;
188 DriverObject
->MajorFunction
[IRP_MJ_FLUSH_BUFFERS
] = Ext2FlushBuffers
;
189 DriverObject
->MajorFunction
[IRP_MJ_SHUTDOWN
] = Ext2Shutdown
;
190 DriverObject
->MajorFunction
[IRP_MJ_CLEANUP
] = Ext2Cleanup
;
191 DriverObject
->MajorFunction
[IRP_MJ_QUERY_SECURITY
] = Ext2QuerySecurity
;
192 DriverObject
->MajorFunction
[IRP_MJ_SET_SECURITY
] = Ext2SetSecurity
;
193 DriverObject
->MajorFunction
[IRP_MJ_QUERY_QUOTA
] = Ext2QueryQuota
;
194 DriverObject
->MajorFunction
[IRP_MJ_SET_QUOTA
] = Ext2SetQuota
;
196 DriverObject
->DriverUnload
= NULL
;
198 IoRegisterFileSystem(DeviceObject
);
200 return(STATUS_SUCCESS
);