2 * FILE: drivers/fs/vfat/fastio.c
3 * PURPOSE: Fast IO routines.
4 * COPYRIGHT: See COPYING in the top level directory
5 * PROJECT: ReactOS kernel
6 * PROGRAMMER: Herve Poussineau (hpoussin@reactos.org)
13 VfatFastIoCheckIfPossible(IN PFILE_OBJECT FileObject
,
14 IN PLARGE_INTEGER FileOffset
,
18 IN BOOLEAN CheckForReadOperation
,
19 OUT PIO_STATUS_BLOCK IoStatus
,
20 IN PDEVICE_OBJECT DeviceObject
)
22 /* Prevent all Fast I/O requests */
23 DPRINT("VfatFastIoCheckIfPossible(): returning FALSE.\n");
28 VfatFastIoRead(IN PFILE_OBJECT FileObject
,
29 IN PLARGE_INTEGER FileOffset
,
34 OUT PIO_STATUS_BLOCK IoStatus
,
35 IN PDEVICE_OBJECT DeviceObject
)
37 DPRINT("VfatFastIoRead()\n");
42 VfatFastIoWrite(IN PFILE_OBJECT FileObject
,
43 IN PLARGE_INTEGER FileOffset
,
48 OUT PIO_STATUS_BLOCK IoStatus
,
49 IN PDEVICE_OBJECT DeviceObject
)
51 DPRINT("VfatFastIoWrite()\n");
56 VfatFastIoQueryBasicInfo(IN PFILE_OBJECT FileObject
,
58 OUT PFILE_BASIC_INFORMATION Buffer
,
59 OUT PIO_STATUS_BLOCK IoStatus
,
60 IN PDEVICE_OBJECT DeviceObject
)
62 DPRINT("VfatFastIoQueryBasicInfo()\n");
67 VfatFastIoQueryStandardInfo(IN PFILE_OBJECT FileObject
,
69 OUT PFILE_STANDARD_INFORMATION Buffer
,
70 OUT PIO_STATUS_BLOCK IoStatus
,
71 IN PDEVICE_OBJECT DeviceObject
)
73 DPRINT("VfatFastIoQueryStandardInfo\n");
78 VfatFastIoLock(IN PFILE_OBJECT FileObject
,
79 IN PLARGE_INTEGER FileOffset
,
80 IN PLARGE_INTEGER Length
,
83 BOOLEAN FailImmediately
,
84 BOOLEAN ExclusiveLock
,
85 OUT PIO_STATUS_BLOCK IoStatus
,
86 IN PDEVICE_OBJECT DeviceObject
)
88 DPRINT("VfatFastIoLock\n");
93 VfatFastIoUnlockSingle(IN PFILE_OBJECT FileObject
,
94 IN PLARGE_INTEGER FileOffset
,
95 IN PLARGE_INTEGER Length
,
98 OUT PIO_STATUS_BLOCK IoStatus
,
99 IN PDEVICE_OBJECT DeviceObject
)
101 DPRINT("VfatFastIoUnlockSingle\n");
106 VfatFastIoUnlockAll(IN PFILE_OBJECT FileObject
,
108 OUT PIO_STATUS_BLOCK IoStatus
,
109 IN PDEVICE_OBJECT DeviceObject
)
111 DPRINT("VfatFastIoUnlockAll\n");
116 VfatFastIoUnlockAllByKey(IN PFILE_OBJECT FileObject
,
119 OUT PIO_STATUS_BLOCK IoStatus
,
120 IN PDEVICE_OBJECT DeviceObject
)
122 DPRINT("VfatFastIoUnlockAllByKey\n");
127 VfatFastIoDeviceControl(IN PFILE_OBJECT FileObject
,
129 IN PVOID InputBuffer OPTIONAL
,
130 IN ULONG InputBufferLength
,
131 OUT PVOID OutputBuffer OPTIONAL
,
132 IN ULONG OutputBufferLength
,
133 IN ULONG IoControlCode
,
134 OUT PIO_STATUS_BLOCK IoStatus
,
135 IN PDEVICE_OBJECT DeviceObject
)
137 DPRINT("VfatFastIoDeviceControl\n");
142 VfatAcquireFileForNtCreateSection(IN PFILE_OBJECT FileObject
)
144 DPRINT("VfatAcquireFileForNtCreateSection\n");
148 VfatReleaseFileForNtCreateSection(IN PFILE_OBJECT FileObject
)
150 DPRINT("VfatReleaseFileForNtCreateSection\n");
154 VfatFastIoDetachDevice(IN PDEVICE_OBJECT SourceDevice
,
155 IN PDEVICE_OBJECT TargetDevice
)
157 DPRINT("VfatFastIoDetachDevice\n");
161 VfatFastIoQueryNetworkOpenInfo(IN PFILE_OBJECT FileObject
,
163 OUT PFILE_NETWORK_OPEN_INFORMATION Buffer
,
164 OUT PIO_STATUS_BLOCK IoStatus
,
165 IN PDEVICE_OBJECT DeviceObject
)
167 DPRINT("VfatFastIoQueryNetworkOpenInfo\n");
171 static NTSTATUS NTAPI
172 VfatAcquireForModWrite(IN PFILE_OBJECT FileObject
,
173 IN PLARGE_INTEGER EndingOffset
,
174 OUT PERESOURCE
* ResourceToRelease
,
175 IN PDEVICE_OBJECT DeviceObject
)
177 DPRINT("VfatAcquireForModWrite\n");
178 return STATUS_INVALID_DEVICE_REQUEST
;
182 VfatMdlRead(IN PFILE_OBJECT FileObject
,
183 IN PLARGE_INTEGER FileOffset
,
187 OUT PIO_STATUS_BLOCK IoStatus
,
188 IN PDEVICE_OBJECT DeviceObject
)
190 DPRINT("VfatMdlRead\n");
195 VfatMdlReadComplete(IN PFILE_OBJECT FileObject
,
197 IN PDEVICE_OBJECT DeviceObject
)
199 DPRINT("VfatMdlReadComplete\n");
204 VfatPrepareMdlWrite(IN PFILE_OBJECT FileObject
,
205 IN PLARGE_INTEGER FileOffset
,
209 OUT PIO_STATUS_BLOCK IoStatus
,
210 IN PDEVICE_OBJECT DeviceObject
)
212 DPRINT("VfatPrepareMdlWrite\n");
217 VfatMdlWriteComplete(IN PFILE_OBJECT FileObject
,
218 IN PLARGE_INTEGER FileOffset
,
220 IN PDEVICE_OBJECT DeviceObject
)
222 DPRINT("VfatMdlWriteComplete\n");
227 VfatFastIoReadCompressed(IN PFILE_OBJECT FileObject
,
228 IN PLARGE_INTEGER FileOffset
,
233 OUT PIO_STATUS_BLOCK IoStatus
,
234 OUT PCOMPRESSED_DATA_INFO CompressedDataInfo
,
235 IN ULONG CompressedDataInfoLength
,
236 IN PDEVICE_OBJECT DeviceObject
)
238 DPRINT("VfatFastIoReadCompressed\n");
243 VfatFastIoWriteCompressed(IN PFILE_OBJECT FileObject
,
244 IN PLARGE_INTEGER FileOffset
,
249 OUT PIO_STATUS_BLOCK IoStatus
,
250 IN PCOMPRESSED_DATA_INFO CompressedDataInfo
,
251 IN ULONG CompressedDataInfoLength
,
252 IN PDEVICE_OBJECT DeviceObject
)
254 DPRINT("VfatFastIoWriteCompressed\n");
259 VfatMdlReadCompleteCompressed(IN PFILE_OBJECT FileObject
,
261 IN PDEVICE_OBJECT DeviceObject
)
263 DPRINT("VfatMdlReadCompleteCompressed\n");
268 VfatMdlWriteCompleteCompressed(IN PFILE_OBJECT FileObject
,
269 IN PLARGE_INTEGER FileOffset
,
271 IN PDEVICE_OBJECT DeviceObject
)
273 DPRINT("VfatMdlWriteCompleteCompressed\n");
278 VfatFastIoQueryOpen(IN PIRP Irp
,
279 OUT PFILE_NETWORK_OPEN_INFORMATION NetworkInformation
,
280 IN PDEVICE_OBJECT DeviceObject
)
282 DPRINT("VfatFastIoQueryOpen\n");
286 static NTSTATUS NTAPI
287 VfatReleaseForModWrite(IN PFILE_OBJECT FileObject
,
288 IN PERESOURCE ResourceToRelease
,
289 IN PDEVICE_OBJECT DeviceObject
)
291 DPRINT("VfatReleaseForModWrite\n");
292 return STATUS_INVALID_DEVICE_REQUEST
;
295 static NTSTATUS NTAPI
296 VfatAcquireForCcFlush(IN PFILE_OBJECT FileObject
,
297 IN PDEVICE_OBJECT DeviceObject
)
299 PVFATFCB Fcb
= (PVFATFCB
)FileObject
->FsContext
;
301 DPRINT("VfatAcquireForCcFlush\n");
303 /* Make sure it is not a volume lock */
304 ASSERT(!(Fcb
->Flags
& FCB_IS_VOLUME
));
306 /* Acquire the resource */
307 ExAcquireResourceExclusiveLite(&(Fcb
->MainResource
), TRUE
);
309 return STATUS_SUCCESS
;
312 static NTSTATUS NTAPI
313 VfatReleaseForCcFlush(IN PFILE_OBJECT FileObject
,
314 IN PDEVICE_OBJECT DeviceObject
)
316 PVFATFCB Fcb
= (PVFATFCB
)FileObject
->FsContext
;
318 DPRINT("VfatReleaseForCcFlush\n");
320 /* Make sure it is not a volume lock */
321 ASSERT(!(Fcb
->Flags
& FCB_IS_VOLUME
));
323 /* Release the resource */
324 ExReleaseResourceLite(&(Fcb
->MainResource
));
326 return STATUS_SUCCESS
;
330 VfatAcquireForLazyWrite(IN PVOID Context
,
333 PVFATFCB Fcb
= (PVFATFCB
)Context
;
335 DPRINT("VfatAcquireForLazyWrite(): Fcb %p\n", Fcb
);
337 if (!ExAcquireResourceExclusiveLite(&(Fcb
->MainResource
), Wait
))
339 DPRINT("VfatAcquireForLazyWrite(): ExReleaseResourceLite failed.\n");
346 VfatReleaseFromLazyWrite(IN PVOID Context
)
348 PVFATFCB Fcb
= (PVFATFCB
)Context
;
350 DPRINT("VfatReleaseFromLazyWrite(): Fcb %p\n", Fcb
);
352 ExReleaseResourceLite(&(Fcb
->MainResource
));
356 VfatAcquireForReadAhead(IN PVOID Context
,
359 PVFATFCB Fcb
= (PVFATFCB
)Context
;
361 DPRINT("VfatAcquireForReadAhead(): Fcb %p\n", Fcb
);
363 if (!ExAcquireResourceExclusiveLite(&(Fcb
->MainResource
), Wait
))
365 DPRINT("VfatAcquireForReadAhead(): ExReleaseResourceLite failed.\n");
372 VfatReleaseFromReadAhead(IN PVOID Context
)
374 PVFATFCB Fcb
= (PVFATFCB
)Context
;
376 DPRINT("VfatReleaseFromReadAhead(): Fcb %p\n", Fcb
);
378 ExReleaseResourceLite(&(Fcb
->MainResource
));
382 VfatInitFastIoRoutines(PFAST_IO_DISPATCH FastIoDispatch
)
384 FastIoDispatch
->SizeOfFastIoDispatch
= sizeof(FAST_IO_DISPATCH
);
385 FastIoDispatch
->FastIoCheckIfPossible
= VfatFastIoCheckIfPossible
;
386 FastIoDispatch
->FastIoRead
= VfatFastIoRead
;
387 FastIoDispatch
->FastIoWrite
= VfatFastIoWrite
;
388 FastIoDispatch
->FastIoQueryBasicInfo
= VfatFastIoQueryBasicInfo
;
389 FastIoDispatch
->FastIoQueryStandardInfo
= VfatFastIoQueryStandardInfo
;
390 FastIoDispatch
->FastIoLock
= VfatFastIoLock
;
391 FastIoDispatch
->FastIoUnlockSingle
= VfatFastIoUnlockSingle
;
392 FastIoDispatch
->FastIoUnlockAll
= VfatFastIoUnlockAll
;
393 FastIoDispatch
->FastIoUnlockAllByKey
= VfatFastIoUnlockAllByKey
;
394 FastIoDispatch
->FastIoDeviceControl
= VfatFastIoDeviceControl
;
395 FastIoDispatch
->AcquireFileForNtCreateSection
= VfatAcquireFileForNtCreateSection
;
396 FastIoDispatch
->ReleaseFileForNtCreateSection
= VfatReleaseFileForNtCreateSection
;
397 FastIoDispatch
->FastIoDetachDevice
= VfatFastIoDetachDevice
;
398 FastIoDispatch
->FastIoQueryNetworkOpenInfo
= VfatFastIoQueryNetworkOpenInfo
;
399 FastIoDispatch
->MdlRead
= VfatMdlRead
;
400 FastIoDispatch
->MdlReadComplete
= VfatMdlReadComplete
;
401 FastIoDispatch
->PrepareMdlWrite
= VfatPrepareMdlWrite
;
402 FastIoDispatch
->MdlWriteComplete
= VfatMdlWriteComplete
;
403 FastIoDispatch
->FastIoReadCompressed
= VfatFastIoReadCompressed
;
404 FastIoDispatch
->FastIoWriteCompressed
= VfatFastIoWriteCompressed
;
405 FastIoDispatch
->MdlReadCompleteCompressed
= VfatMdlReadCompleteCompressed
;
406 FastIoDispatch
->MdlWriteCompleteCompressed
= VfatMdlWriteCompleteCompressed
;
407 FastIoDispatch
->FastIoQueryOpen
= VfatFastIoQueryOpen
;
408 FastIoDispatch
->AcquireForModWrite
= VfatAcquireForModWrite
;
409 FastIoDispatch
->ReleaseForModWrite
= VfatReleaseForModWrite
;
410 FastIoDispatch
->AcquireForCcFlush
= VfatAcquireForCcFlush
;
411 FastIoDispatch
->ReleaseForCcFlush
= VfatReleaseForCcFlush
;