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 Event 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 Event 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
79 VOID
IoInitFileSystemImplementation(VOID
)
81 InitializeListHead(&FileSystemListHead
);
82 KeInitializeSpinLock(&FileSystemListLock
);
85 NTSTATUS
IoAskFileSystemToMountDevice(PDEVICE_OBJECT DeviceObject
,
86 PDEVICE_OBJECT DeviceToMount
)
90 IO_STATUS_BLOCK IoStatusBlock
;
93 DPRINT("IoAskFileSystemToMountDevice(DeviceObject %x, DeviceToMount %x)\n",
94 DeviceObject
,DeviceToMount
);
96 KeInitializeEvent(&Event
,NotificationEvent
,FALSE
);
97 Irp
= IoBuildFilesystemControlRequest(IRP_MN_MOUNT_VOLUME
,
102 Status
= IoCallDriver(DeviceObject
,Irp
);
103 if (Status
==STATUS_PENDING
)
105 KeWaitForSingleObject(&Event
,Executive
,KernelMode
,FALSE
,NULL
);
106 Status
= IoStatusBlock
.Status
;
111 NTSTATUS
IoAskFileSystemToLoad(PDEVICE_OBJECT DeviceObject
)
116 NTSTATUS
IoTryToMountStorageDevice(PDEVICE_OBJECT DeviceObject
)
118 * FUNCTION: Trys to mount a storage device
120 * DeviceObject = Device to try and mount
125 PLIST_ENTRY current_entry
;
126 FILE_SYSTEM_OBJECT
* current
;
129 DPRINT("IoTryToMountStorageDevice(DeviceObject %x)\n",DeviceObject
);
131 KeAcquireSpinLock(&FileSystemListLock
,&oldlvl
);
132 current_entry
= FileSystemListHead
.Flink
;
133 while (current_entry
!=(&FileSystemListHead
))
135 current
= CONTAINING_RECORD(current_entry
,FILE_SYSTEM_OBJECT
,Entry
);
136 Status
= IoAskFileSystemToMountDevice(current
->DeviceObject
,
140 case STATUS_FS_DRIVER_REQUIRED
:
141 KeReleaseSpinLock(&FileSystemListLock
,oldlvl
);
142 (void)IoAskFileSystemToLoad(DeviceObject
);
143 KeAcquireSpinLock(&FileSystemListLock
,&oldlvl
);
144 current_entry
= FileSystemListHead
.Flink
;
148 DeviceObject
->Vpb
->Flags
= DeviceObject
->Vpb
->Flags
|
150 KeReleaseSpinLock(&FileSystemListLock
,oldlvl
);
151 return(STATUS_SUCCESS
);
153 case STATUS_UNRECOGNIZED_VOLUME
:
155 current_entry
= current_entry
->Flink
;
159 KeReleaseSpinLock(&FileSystemListLock
,oldlvl
);
161 return(STATUS_UNRECOGNIZED_VOLUME
);
164 VOID
IoRegisterFileSystem(PDEVICE_OBJECT DeviceObject
)
166 FILE_SYSTEM_OBJECT
* fs
;
168 DPRINT("IoRegisterFileSystem(DeviceObject %x)\n",DeviceObject
);
170 fs
=ExAllocatePool(NonPagedPool
,sizeof(FILE_SYSTEM_OBJECT
));
173 fs
->DeviceObject
= DeviceObject
;
174 ExInterlockedInsertTailList(&FileSystemListHead
,&fs
->Entry
,
175 &FileSystemListLock
);
178 VOID
IoUnregisterFileSystem(PDEVICE_OBJECT DeviceObject
)
181 PLIST_ENTRY current_entry
;
182 FILE_SYSTEM_OBJECT
* current
;
184 DPRINT("IoUnregisterFileSystem(DeviceObject %x)\n",DeviceObject
);
186 KeAcquireSpinLock(&FileSystemListLock
,&oldlvl
);
187 current_entry
= FileSystemListHead
.Flink
;
188 while (current_entry
!=(&FileSystemListHead
))
190 current
= CONTAINING_RECORD(current_entry
,FILE_SYSTEM_OBJECT
,Entry
);
191 if (current
->DeviceObject
== DeviceObject
)
193 RemoveEntryList(current_entry
);
195 KeReleaseSpinLock(&FileSystemListLock
,oldlvl
);
198 current_entry
= current_entry
->Flink
;
200 KeReleaseSpinLock(&FileSystemListLock
,oldlvl
);