2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: ntoskrnl/io/fs.c
5 * PURPOSE: Filesystem functions
6 * PROGRAMMER: David Welch (welch@mcmail.com)
11 /* INCLUDES *****************************************************************/
13 #include <ddk/ntddk.h>
14 #include <internal/io.h>
17 #include <internal/debug.h>
19 /* TYPES *******************************************************************/
23 PDEVICE_OBJECT DeviceObject
;
27 /* GLOBALS ******************************************************************/
29 static KSPIN_LOCK FileSystemListLock
= {0,};
30 static LIST_ENTRY FileSystemListHead
= {NULL
,NULL
};
32 /* FUNCTIONS *****************************************************************/
37 IN HANDLE DeviceHandle
,
38 IN HANDLE EventHandle OPTIONAL
,
39 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
40 IN PVOID ApcContext OPTIONAL
,
41 OUT PIO_STATUS_BLOCK IoStatusBlock
,
42 IN ULONG IoControlCode
,
44 IN ULONG InputBufferSize
,
45 OUT PVOID OutputBuffer
,
46 IN ULONG OutputBufferSize
49 return(ZwFsControlFile(DeviceHandle
,
64 IN HANDLE DeviceHandle
,
65 IN HANDLE EventHandle OPTIONAL
,
66 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
67 IN PVOID ApcContext OPTIONAL
,
68 OUT PIO_STATUS_BLOCK IoStatusBlock
,
69 IN ULONG IoControlCode
,
71 IN ULONG InputBufferSize
,
72 OUT PVOID OutputBuffer
,
73 IN ULONG OutputBufferSize
77 PFILE_OBJECT FileObject
;
79 PIO_STACK_LOCATION StackPtr
;
83 if ( InputBufferSize
> 0 ) {
85 Status
= ObReferenceObjectByHandle(DeviceHandle
,
86 FILE_WRITE_DATA
|FILE_READ_DATA
,
89 (PVOID
*) &FileObject
,
91 if (Status
!= STATUS_SUCCESS
)
96 KeInitializeEvent(&Event
,NotificationEvent
,FALSE
);
97 Irp
= IoBuildSynchronousFsdRequest(IRP_MJ_DEVICE_CONTROL
,
98 FileObject
->DeviceObject
,
104 StackPtr
= IoGetNextIrpStackLocation(Irp
);
105 if ( StackPtr
== NULL
)
107 StackPtr
->Parameters
.DeviceIoControl
.IoControlCode
= IoControlCode
;
108 StackPtr
->FileObject
= FileObject
;
109 StackPtr
->Parameters
.Write
.Length
= InputBufferSize
;
110 DPRINT("FileObject->DeviceObject %x\n",FileObject
->DeviceObject
);
111 Status
= IoCallDriver(FileObject
->DeviceObject
,Irp
);
112 if (Status
==STATUS_PENDING
&& (FileObject
->Flags
& FO_SYNCHRONOUS_IO
))
114 KeWaitForSingleObject(&Event
,Executive
,KernelMode
,FALSE
,NULL
);
115 return Irp
->IoStatus
.Status
;
119 if ( OutputBufferSize
> 0 ) {
121 Status
= ObReferenceObjectByHandle(DeviceHandle
,
122 FILE_WRITE_DATA
|FILE_READ_DATA
,
125 (PVOID
*) &FileObject
,
127 if (Status
!= STATUS_SUCCESS
)
132 KeInitializeEvent(&Event
,NotificationEvent
,FALSE
);
134 Irp
= IoBuildSynchronousFsdRequest(IRP_MJ_DEVICE_CONTROL
,
135 FileObject
->DeviceObject
,
142 StackPtr
= IoGetNextIrpStackLocation(Irp
);
143 if ( StackPtr
== NULL
)
145 StackPtr
->Parameters
.DeviceIoControl
.IoControlCode
= IoControlCode
;
146 StackPtr
->FileObject
= FileObject
;
147 StackPtr
->Parameters
.Read
.Length
= OutputBufferSize
;
148 DPRINT("FileObject->DeviceObject %x\n",FileObject
->DeviceObject
);
149 Status
= IoCallDriver(FileObject
->DeviceObject
,Irp
);
150 if (Status
==STATUS_PENDING
&& (FileObject
->Flags
& FO_SYNCHRONOUS_IO
))
152 KeWaitForSingleObject(&Event
,Executive
,KernelMode
,FALSE
,NULL
);
153 return Irp
->IoStatus
.Status
;
160 VOID
IoInitFileSystemImplementation(VOID
)
162 InitializeListHead(&FileSystemListHead
);
163 KeInitializeSpinLock(&FileSystemListLock
);
166 NTSTATUS
IoAskFileSystemToMountDevice(PDEVICE_OBJECT DeviceObject
,
167 PDEVICE_OBJECT DeviceToMount
)
171 IO_STATUS_BLOCK IoStatusBlock
;
174 DPRINT("IoAskFileSystemToMountDevice(DeviceObject %x, DeviceToMount %x)\n",
175 DeviceObject
,DeviceToMount
);
177 KeInitializeEvent(&Event
,NotificationEvent
,FALSE
);
178 Irp
= IoBuildFilesystemControlRequest(IRP_MN_MOUNT_VOLUME
,
183 Status
= IoCallDriver(DeviceObject
,Irp
);
184 if (Status
==STATUS_PENDING
)
186 KeWaitForSingleObject(&Event
,Executive
,KernelMode
,FALSE
,NULL
);
187 Status
= IoStatusBlock
.Status
;
192 NTSTATUS
IoAskFileSystemToLoad(PDEVICE_OBJECT DeviceObject
)
197 NTSTATUS
IoTryToMountStorageDevice(PDEVICE_OBJECT DeviceObject
)
199 * FUNCTION: Trys to mount a storage device
201 * DeviceObject = Device to try and mount
206 PLIST_ENTRY current_entry
;
207 FILE_SYSTEM_OBJECT
* current
;
210 DPRINT("IoTryToMountStorageDevice(DeviceObject %x)\n",DeviceObject
);
212 KeAcquireSpinLock(&FileSystemListLock
,&oldlvl
);
213 current_entry
= FileSystemListHead
.Flink
;
214 while (current_entry
!=(&FileSystemListHead
))
216 current
= CONTAINING_RECORD(current_entry
,FILE_SYSTEM_OBJECT
,Entry
);
217 Status
= IoAskFileSystemToMountDevice(current
->DeviceObject
,
221 case STATUS_FS_DRIVER_REQUIRED
:
222 KeReleaseSpinLock(&FileSystemListLock
,oldlvl
);
223 (void)IoAskFileSystemToLoad(DeviceObject
);
224 KeAcquireSpinLock(&FileSystemListLock
,&oldlvl
);
225 current_entry
= FileSystemListHead
.Flink
;
229 DeviceObject
->Vpb
->Flags
= DeviceObject
->Vpb
->Flags
|
231 KeReleaseSpinLock(&FileSystemListLock
,oldlvl
);
232 return(STATUS_SUCCESS
);
234 case STATUS_UNRECOGNIZED_VOLUME
:
236 current_entry
= current_entry
->Flink
;
239 KeReleaseSpinLock(&FileSystemListLock
,oldlvl
);
240 return(STATUS_UNRECOGNIZED_VOLUME
);
243 VOID
IoRegisterFileSystem(PDEVICE_OBJECT DeviceObject
)
245 FILE_SYSTEM_OBJECT
* fs
;
247 DPRINT("IoRegisterFileSystem(DeviceObject %x)\n",DeviceObject
);
249 fs
=ExAllocatePool(NonPagedPool
,sizeof(FILE_SYSTEM_OBJECT
));
252 fs
->DeviceObject
= DeviceObject
;
253 ExInterlockedInsertTailList(&FileSystemListHead
,&fs
->Entry
,
254 &FileSystemListLock
);
257 VOID
IoUnregisterFileSystem(PDEVICE_OBJECT DeviceObject
)
260 PLIST_ENTRY current_entry
;
261 FILE_SYSTEM_OBJECT
* current
;
263 DPRINT("IoUnregisterFileSystem(DeviceObject %x)\n",DeviceObject
);
265 KeAcquireSpinLock(&FileSystemListLock
,&oldlvl
);
266 current_entry
= FileSystemListHead
.Flink
;
267 while (current_entry
!=(&FileSystemListHead
))
269 current
= CONTAINING_RECORD(current_entry
,FILE_SYSTEM_OBJECT
,Entry
);
270 if (current
->DeviceObject
== DeviceObject
)
272 RemoveEntryList(current_entry
);
274 KeReleaseSpinLock(&FileSystemListLock
,oldlvl
);
277 current_entry
= current_entry
->Flink
;
279 KeReleaseSpinLock(&FileSystemListLock
,oldlvl
);