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)
14 VfatFastIoCheckIfPossible(IN PFILE_OBJECT FileObject
,
15 IN PLARGE_INTEGER FileOffset
,
19 IN BOOLEAN CheckForReadOperation
,
20 OUT PIO_STATUS_BLOCK IoStatus
,
21 IN PDEVICE_OBJECT DeviceObject
)
23 /* Prevent all Fast I/O requests */
24 DPRINT("VfatFastIoCheckIfPossible(): returning FALSE.\n");
29 VfatFastIoRead(IN PFILE_OBJECT FileObject
,
30 IN PLARGE_INTEGER FileOffset
,
35 OUT PIO_STATUS_BLOCK IoStatus
,
36 IN PDEVICE_OBJECT DeviceObject
)
38 DPRINT("VfatFastIoRead()\n");
43 VfatFastIoWrite(IN PFILE_OBJECT FileObject
,
44 IN PLARGE_INTEGER FileOffset
,
49 OUT PIO_STATUS_BLOCK IoStatus
,
50 IN PDEVICE_OBJECT DeviceObject
)
52 DPRINT("VfatFastIoWrite()\n");
57 VfatFastIoQueryBasicInfo(IN PFILE_OBJECT FileObject
,
59 OUT PFILE_BASIC_INFORMATION Buffer
,
60 OUT PIO_STATUS_BLOCK IoStatus
,
61 IN PDEVICE_OBJECT DeviceObject
)
63 DPRINT("VfatFastIoQueryBasicInfo()\n");
68 VfatFastIoQueryStandardInfo(IN PFILE_OBJECT FileObject
,
70 OUT PFILE_STANDARD_INFORMATION Buffer
,
71 OUT PIO_STATUS_BLOCK IoStatus
,
72 IN PDEVICE_OBJECT DeviceObject
)
74 DPRINT("VfatFastIoQueryStandardInfo\n");
79 VfatFastIoLock(IN PFILE_OBJECT FileObject
,
80 IN PLARGE_INTEGER FileOffset
,
81 IN PLARGE_INTEGER Length
,
84 BOOLEAN FailImmediately
,
85 BOOLEAN ExclusiveLock
,
86 OUT PIO_STATUS_BLOCK IoStatus
,
87 IN PDEVICE_OBJECT DeviceObject
)
89 DPRINT("VfatFastIoLock\n");
94 VfatFastIoUnlockSingle(IN PFILE_OBJECT FileObject
,
95 IN PLARGE_INTEGER FileOffset
,
96 IN PLARGE_INTEGER Length
,
99 OUT PIO_STATUS_BLOCK IoStatus
,
100 IN PDEVICE_OBJECT DeviceObject
)
102 DPRINT("VfatFastIoUnlockSingle\n");
107 VfatFastIoUnlockAll(IN PFILE_OBJECT FileObject
,
109 OUT PIO_STATUS_BLOCK IoStatus
,
110 IN PDEVICE_OBJECT DeviceObject
)
112 DPRINT("VfatFastIoUnlockAll\n");
117 VfatFastIoUnlockAllByKey(IN PFILE_OBJECT FileObject
,
120 OUT PIO_STATUS_BLOCK IoStatus
,
121 IN PDEVICE_OBJECT DeviceObject
)
123 DPRINT("VfatFastIoUnlockAllByKey\n");
128 VfatFastIoDeviceControl(IN PFILE_OBJECT FileObject
,
130 IN PVOID InputBuffer OPTIONAL
,
131 IN ULONG InputBufferLength
,
132 OUT PVOID OutputBuffer OPTIONAL
,
133 IN ULONG OutputBufferLength
,
134 IN ULONG IoControlCode
,
135 OUT PIO_STATUS_BLOCK IoStatus
,
136 IN PDEVICE_OBJECT DeviceObject
)
138 DPRINT("VfatFastIoDeviceControl\n");
143 VfatAcquireFileForNtCreateSection(IN PFILE_OBJECT FileObject
)
145 DPRINT("VfatAcquireFileForNtCreateSection\n");
149 VfatReleaseFileForNtCreateSection(IN PFILE_OBJECT FileObject
)
151 DPRINT("VfatReleaseFileForNtCreateSection\n");
155 VfatFastIoDetachDevice(IN PDEVICE_OBJECT SourceDevice
,
156 IN PDEVICE_OBJECT TargetDevice
)
158 DPRINT("VfatFastIoDetachDevice\n");
162 VfatFastIoQueryNetworkOpenInfo(IN PFILE_OBJECT FileObject
,
164 OUT PFILE_NETWORK_OPEN_INFORMATION Buffer
,
165 OUT PIO_STATUS_BLOCK IoStatus
,
166 IN PDEVICE_OBJECT DeviceObject
)
168 DPRINT("VfatFastIoQueryNetworkOpenInfo\n");
172 static NTSTATUS NTAPI
173 VfatAcquireForModWrite(IN PFILE_OBJECT FileObject
,
174 IN PLARGE_INTEGER EndingOffset
,
175 OUT PERESOURCE
* ResourceToRelease
,
176 IN PDEVICE_OBJECT DeviceObject
)
178 DPRINT("VfatAcquireForModWrite\n");
179 return STATUS_UNSUCCESSFUL
;
183 VfatMdlRead(IN PFILE_OBJECT FileObject
,
184 IN PLARGE_INTEGER FileOffset
,
188 OUT PIO_STATUS_BLOCK IoStatus
,
189 IN PDEVICE_OBJECT DeviceObject
)
191 DPRINT("VfatMdlRead\n");
196 VfatMdlReadComplete(IN PFILE_OBJECT FileObject
,
198 IN PDEVICE_OBJECT DeviceObject
)
200 DPRINT("VfatMdlReadComplete\n");
205 VfatPrepareMdlWrite(IN PFILE_OBJECT FileObject
,
206 IN PLARGE_INTEGER FileOffset
,
210 OUT PIO_STATUS_BLOCK IoStatus
,
211 IN PDEVICE_OBJECT DeviceObject
)
213 DPRINT("VfatPrepareMdlWrite\n");
218 VfatMdlWriteComplete(IN PFILE_OBJECT FileObject
,
219 IN PLARGE_INTEGER FileOffset
,
221 IN PDEVICE_OBJECT DeviceObject
)
223 DPRINT("VfatMdlWriteComplete\n");
228 VfatFastIoReadCompressed(IN PFILE_OBJECT FileObject
,
229 IN PLARGE_INTEGER FileOffset
,
234 OUT PIO_STATUS_BLOCK IoStatus
,
235 OUT PCOMPRESSED_DATA_INFO CompressedDataInfo
,
236 IN ULONG CompressedDataInfoLength
,
237 IN PDEVICE_OBJECT DeviceObject
)
239 DPRINT("VfatFastIoReadCompressed\n");
244 VfatFastIoWriteCompressed(IN PFILE_OBJECT FileObject
,
245 IN PLARGE_INTEGER FileOffset
,
250 OUT PIO_STATUS_BLOCK IoStatus
,
251 IN PCOMPRESSED_DATA_INFO CompressedDataInfo
,
252 IN ULONG CompressedDataInfoLength
,
253 IN PDEVICE_OBJECT DeviceObject
)
255 DPRINT("VfatFastIoWriteCompressed\n");
260 VfatMdlReadCompleteCompressed(IN PFILE_OBJECT FileObject
,
262 IN PDEVICE_OBJECT DeviceObject
)
264 DPRINT("VfatMdlReadCompleteCompressed\n");
269 VfatMdlWriteCompleteCompressed(IN PFILE_OBJECT FileObject
,
270 IN PLARGE_INTEGER FileOffset
,
272 IN PDEVICE_OBJECT DeviceObject
)
274 DPRINT("VfatMdlWriteCompleteCompressed\n");
279 VfatFastIoQueryOpen(IN PIRP Irp
,
280 OUT PFILE_NETWORK_OPEN_INFORMATION NetworkInformation
,
281 IN PDEVICE_OBJECT DeviceObject
)
283 DPRINT("VfatFastIoQueryOpen\n");
287 static NTSTATUS NTAPI
288 VfatReleaseForModWrite(IN PFILE_OBJECT FileObject
,
289 IN PERESOURCE ResourceToRelease
,
290 IN PDEVICE_OBJECT DeviceObject
)
292 DPRINT("VfatReleaseForModWrite\n");
293 return STATUS_UNSUCCESSFUL
;
296 static NTSTATUS NTAPI
297 VfatAcquireForCcFlush(IN PFILE_OBJECT FileObject
,
298 IN PDEVICE_OBJECT DeviceObject
)
300 DPRINT("VfatAcquireForCcFlush\n");
301 return STATUS_UNSUCCESSFUL
;
304 static NTSTATUS NTAPI
305 VfatReleaseForCcFlush(IN PFILE_OBJECT FileObject
,
306 IN PDEVICE_OBJECT DeviceObject
)
308 DPRINT("VfatReleaseForCcFlush\n");
309 return STATUS_UNSUCCESSFUL
;
313 VfatAcquireForLazyWrite(IN PVOID Context
,
316 PVFATFCB Fcb
= (PVFATFCB
)Context
;
318 DPRINT("VfatAcquireForLazyWrite(): Fcb %p\n", Fcb
);
320 if (!ExAcquireResourceExclusiveLite(&(Fcb
->MainResource
), Wait
))
322 DPRINT("VfatAcquireForLazyWrite(): ExReleaseResourceLite failed.\n");
329 VfatReleaseFromLazyWrite(IN PVOID Context
)
331 PVFATFCB Fcb
= (PVFATFCB
)Context
;
333 DPRINT("VfatReleaseFromLazyWrite(): Fcb %p\n", Fcb
);
335 ExReleaseResourceLite(&(Fcb
->MainResource
));
339 VfatAcquireForReadAhead(IN PVOID Context
,
342 PVFATFCB Fcb
= (PVFATFCB
)Context
;
344 DPRINT("VfatAcquireForReadAhead(): Fcb %p\n", Fcb
);
346 if (!ExAcquireResourceExclusiveLite(&(Fcb
->MainResource
), Wait
))
348 DPRINT("VfatAcquireForReadAhead(): ExReleaseResourceLite failed.\n");
355 VfatReleaseFromReadAhead(IN PVOID Context
)
357 PVFATFCB Fcb
= (PVFATFCB
)Context
;
359 DPRINT("VfatReleaseFromReadAhead(): Fcb %p\n", Fcb
);
361 ExReleaseResourceLite(&(Fcb
->MainResource
));
365 VfatInitFastIoRoutines(PFAST_IO_DISPATCH FastIoDispatch
)
367 FastIoDispatch
->SizeOfFastIoDispatch
= sizeof(FAST_IO_DISPATCH
);
368 FastIoDispatch
->FastIoCheckIfPossible
= VfatFastIoCheckIfPossible
;
369 FastIoDispatch
->FastIoRead
= VfatFastIoRead
;
370 FastIoDispatch
->FastIoWrite
= VfatFastIoWrite
;
371 FastIoDispatch
->FastIoQueryBasicInfo
= VfatFastIoQueryBasicInfo
;
372 FastIoDispatch
->FastIoQueryStandardInfo
= VfatFastIoQueryStandardInfo
;
373 FastIoDispatch
->FastIoLock
= VfatFastIoLock
;
374 FastIoDispatch
->FastIoUnlockSingle
= VfatFastIoUnlockSingle
;
375 FastIoDispatch
->FastIoUnlockAll
= VfatFastIoUnlockAll
;
376 FastIoDispatch
->FastIoUnlockAllByKey
= VfatFastIoUnlockAllByKey
;
377 FastIoDispatch
->FastIoDeviceControl
= VfatFastIoDeviceControl
;
378 FastIoDispatch
->AcquireFileForNtCreateSection
= VfatAcquireFileForNtCreateSection
;
379 FastIoDispatch
->ReleaseFileForNtCreateSection
= VfatReleaseFileForNtCreateSection
;
380 FastIoDispatch
->FastIoDetachDevice
= VfatFastIoDetachDevice
;
381 FastIoDispatch
->FastIoQueryNetworkOpenInfo
= VfatFastIoQueryNetworkOpenInfo
;
382 FastIoDispatch
->AcquireForModWrite
= VfatAcquireForModWrite
;
383 FastIoDispatch
->MdlRead
= VfatMdlRead
;
384 FastIoDispatch
->MdlReadComplete
= VfatMdlReadComplete
;
385 FastIoDispatch
->PrepareMdlWrite
= VfatPrepareMdlWrite
;
386 FastIoDispatch
->MdlWriteComplete
= VfatMdlWriteComplete
;
387 FastIoDispatch
->FastIoReadCompressed
= VfatFastIoReadCompressed
;
388 FastIoDispatch
->FastIoWriteCompressed
= VfatFastIoWriteCompressed
;
389 FastIoDispatch
->MdlReadCompleteCompressed
= VfatMdlReadCompleteCompressed
;
390 FastIoDispatch
->MdlWriteCompleteCompressed
= VfatMdlWriteCompleteCompressed
;
391 FastIoDispatch
->FastIoQueryOpen
= VfatFastIoQueryOpen
;
392 FastIoDispatch
->ReleaseForModWrite
= VfatReleaseForModWrite
;
393 FastIoDispatch
->AcquireForCcFlush
= VfatAcquireForCcFlush
;
394 FastIoDispatch
->ReleaseForCcFlush
= VfatReleaseForCcFlush
;