xref: /reactos/drivers/filesystems/vfatfs/fastio.c (revision 1734f297)
1 /*
2  * PROJECT:     VFAT Filesystem
3  * LICENSE:     GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4  * PURPOSE:     Fast IO routines
5  * COPYRIGHT:   Copyright 2005 Hervé Poussineau <hpoussin@reactos.org>
6  *              Copyright 2015-2018 Pierre Schweitzer <pierre@reactos.org>
7  */
8 
9 #include "vfat.h"
10 
11 #define NDEBUG
12 #include <debug.h>
13 
14 static FAST_IO_CHECK_IF_POSSIBLE VfatFastIoCheckIfPossible;
15 
16 static
17 BOOLEAN
18 NTAPI
19 VfatFastIoCheckIfPossible(
20     IN PFILE_OBJECT FileObject,
21     IN PLARGE_INTEGER FileOffset,
22     IN ULONG Length,
23     IN BOOLEAN Wait,
24     IN ULONG LockKey,
25     IN BOOLEAN CheckForReadOperation,
26     OUT PIO_STATUS_BLOCK IoStatus,
27     IN PDEVICE_OBJECT DeviceObject)
28 {
29     /* Prevent all Fast I/O requests */
30     DPRINT("VfatFastIoCheckIfPossible(): returning FALSE.\n");
31 
32     UNREFERENCED_PARAMETER(FileObject);
33     UNREFERENCED_PARAMETER(FileOffset);
34     UNREFERENCED_PARAMETER(Length);
35     UNREFERENCED_PARAMETER(Wait);
36     UNREFERENCED_PARAMETER(LockKey);
37     UNREFERENCED_PARAMETER(CheckForReadOperation);
38     UNREFERENCED_PARAMETER(IoStatus);
39     UNREFERENCED_PARAMETER(DeviceObject);
40 
41     return FALSE;
42 }
43 
44 static FAST_IO_READ VfatFastIoRead;
45 
46 static
47 BOOLEAN
48 NTAPI
49 VfatFastIoRead(
50     IN PFILE_OBJECT FileObject,
51     IN PLARGE_INTEGER FileOffset,
52     IN ULONG Length,
53     IN BOOLEAN Wait,
54     IN ULONG LockKey,
55     OUT PVOID Buffer,
56     OUT PIO_STATUS_BLOCK IoStatus,
57     IN PDEVICE_OBJECT DeviceObject)
58 {
59     DPRINT("VfatFastIoRead()\n");
60 
61     UNREFERENCED_PARAMETER(FileObject);
62     UNREFERENCED_PARAMETER(FileOffset);
63     UNREFERENCED_PARAMETER(Length);
64     UNREFERENCED_PARAMETER(Wait);
65     UNREFERENCED_PARAMETER(LockKey);
66     UNREFERENCED_PARAMETER(Buffer);
67     UNREFERENCED_PARAMETER(IoStatus);
68     UNREFERENCED_PARAMETER(DeviceObject);
69 
70     return FALSE;
71 }
72 
73 static FAST_IO_WRITE VfatFastIoWrite;
74 
75 static
76 BOOLEAN
77 NTAPI
78 VfatFastIoWrite(
79     IN PFILE_OBJECT FileObject,
80     IN PLARGE_INTEGER FileOffset,
81     IN ULONG Length,
82     IN BOOLEAN Wait,
83     IN ULONG LockKey,
84     OUT PVOID Buffer,
85     OUT PIO_STATUS_BLOCK IoStatus,
86     IN PDEVICE_OBJECT DeviceObject)
87 {
88     DPRINT("VfatFastIoWrite()\n");
89 
90     UNREFERENCED_PARAMETER(FileObject);
91     UNREFERENCED_PARAMETER(FileOffset);
92     UNREFERENCED_PARAMETER(Length);
93     UNREFERENCED_PARAMETER(Wait);
94     UNREFERENCED_PARAMETER(LockKey);
95     UNREFERENCED_PARAMETER(Buffer);
96     UNREFERENCED_PARAMETER(IoStatus);
97     UNREFERENCED_PARAMETER(DeviceObject);
98 
99     return FALSE;
100 }
101 
102 static FAST_IO_QUERY_BASIC_INFO VfatFastIoQueryBasicInfo;
103 
104 static
105 BOOLEAN
106 NTAPI
107 VfatFastIoQueryBasicInfo(
108     IN PFILE_OBJECT FileObject,
109     IN BOOLEAN Wait,
110     OUT PFILE_BASIC_INFORMATION Buffer,
111     OUT PIO_STATUS_BLOCK IoStatus,
112     IN PDEVICE_OBJECT DeviceObject)
113 {
114     NTSTATUS Status;
115     PVFATFCB FCB = NULL;
116     BOOLEAN Success = FALSE;
117     ULONG BufferLength = sizeof(FILE_BASIC_INFORMATION);
118 
119     DPRINT("VfatFastIoQueryBasicInfo()\n");
120 
121     FCB = (PVFATFCB)FileObject->FsContext;
122     if (FCB == NULL)
123     {
124         return FALSE;
125     }
126 
127     FsRtlEnterFileSystem();
128 
129     if (!BooleanFlagOn(FCB->Flags, FCB_IS_PAGE_FILE))
130     {
131         if (!ExAcquireResourceSharedLite(&FCB->MainResource, Wait))
132         {
133             FsRtlExitFileSystem();
134             return FALSE;
135         }
136     }
137 
138     Status = VfatGetBasicInformation(FileObject,
139                                      FCB,
140                                      DeviceObject->DeviceExtension,
141                                      Buffer,
142                                      &BufferLength);
143 
144     if (!BooleanFlagOn(FCB->Flags, FCB_IS_PAGE_FILE))
145     {
146         ExReleaseResourceLite(&FCB->MainResource);
147     }
148 
149     if (NT_SUCCESS(Status))
150     {
151         IoStatus->Status = STATUS_SUCCESS;
152         IoStatus->Information = sizeof(FILE_BASIC_INFORMATION) - BufferLength;
153         Success = TRUE;
154     }
155 
156     FsRtlExitFileSystem();
157 
158     return Success;
159 }
160 
161 static FAST_IO_QUERY_STANDARD_INFO VfatFastIoQueryStandardInfo;
162 
163 static
164 BOOLEAN
165 NTAPI
166 VfatFastIoQueryStandardInfo(
167     IN PFILE_OBJECT FileObject,
168     IN BOOLEAN Wait,
169     OUT PFILE_STANDARD_INFORMATION Buffer,
170     OUT PIO_STATUS_BLOCK IoStatus,
171     IN PDEVICE_OBJECT DeviceObject)
172 {
173     NTSTATUS Status;
174     PVFATFCB FCB = NULL;
175     BOOLEAN Success = FALSE;
176     ULONG BufferLength = sizeof(FILE_STANDARD_INFORMATION);
177 
178     DPRINT("VfatFastIoQueryStandardInfo()\n");
179 
180     UNREFERENCED_PARAMETER(DeviceObject);
181 
182     FCB = (PVFATFCB)FileObject->FsContext;
183     if (FCB == NULL)
184     {
185         return FALSE;
186     }
187 
188     FsRtlEnterFileSystem();
189 
190     if (!BooleanFlagOn(FCB->Flags, FCB_IS_PAGE_FILE))
191     {
192         if (!ExAcquireResourceSharedLite(&FCB->MainResource, Wait))
193         {
194             FsRtlExitFileSystem();
195             return FALSE;
196         }
197     }
198 
199     Status = VfatGetStandardInformation(FCB,
200                                         Buffer,
201                                         &BufferLength);
202 
203     if (!BooleanFlagOn(FCB->Flags, FCB_IS_PAGE_FILE))
204     {
205         ExReleaseResourceLite(&FCB->MainResource);
206     }
207 
208     if (NT_SUCCESS(Status))
209     {
210         IoStatus->Status = STATUS_SUCCESS;
211         IoStatus->Information = sizeof(FILE_STANDARD_INFORMATION) - BufferLength;
212         Success = TRUE;
213     }
214 
215     FsRtlExitFileSystem();
216 
217     return Success;
218 }
219 
220 static FAST_IO_LOCK VfatFastIoLock;
221 
222 static
223 BOOLEAN
224 NTAPI
225 VfatFastIoLock(
226     IN PFILE_OBJECT FileObject,
227     IN PLARGE_INTEGER FileOffset,
228     IN PLARGE_INTEGER Length,
229     PEPROCESS ProcessId,
230     ULONG Key,
231     BOOLEAN FailImmediately,
232     BOOLEAN ExclusiveLock,
233     OUT PIO_STATUS_BLOCK IoStatus,
234     IN PDEVICE_OBJECT DeviceObject)
235 {
236     DPRINT("VfatFastIoLock\n");
237 
238     UNREFERENCED_PARAMETER(FileObject);
239     UNREFERENCED_PARAMETER(FileOffset);
240     UNREFERENCED_PARAMETER(Length);
241     UNREFERENCED_PARAMETER(ProcessId);
242     UNREFERENCED_PARAMETER(Key);
243     UNREFERENCED_PARAMETER(FailImmediately);
244     UNREFERENCED_PARAMETER(ExclusiveLock);
245     UNREFERENCED_PARAMETER(IoStatus);
246     UNREFERENCED_PARAMETER(DeviceObject);
247 
248     return FALSE;
249 }
250 
251 static FAST_IO_UNLOCK_SINGLE VfatFastIoUnlockSingle;
252 
253 static
254 BOOLEAN
255 NTAPI
256 VfatFastIoUnlockSingle(
257     IN PFILE_OBJECT FileObject,
258     IN PLARGE_INTEGER FileOffset,
259     IN PLARGE_INTEGER Length,
260     PEPROCESS ProcessId,
261     ULONG Key,
262     OUT PIO_STATUS_BLOCK IoStatus,
263     IN PDEVICE_OBJECT DeviceObject)
264 {
265     DPRINT("VfatFastIoUnlockSingle\n");
266 
267     UNREFERENCED_PARAMETER(FileObject);
268     UNREFERENCED_PARAMETER(FileOffset);
269     UNREFERENCED_PARAMETER(Length);
270     UNREFERENCED_PARAMETER(ProcessId);
271     UNREFERENCED_PARAMETER(Key);
272     UNREFERENCED_PARAMETER(IoStatus);
273     UNREFERENCED_PARAMETER(DeviceObject);
274 
275     return FALSE;
276 }
277 
278 static FAST_IO_UNLOCK_ALL VfatFastIoUnlockAll;
279 
280 static
281 BOOLEAN
282 NTAPI
283 VfatFastIoUnlockAll(
284     IN PFILE_OBJECT FileObject,
285     PEPROCESS ProcessId,
286     OUT PIO_STATUS_BLOCK IoStatus,
287     IN PDEVICE_OBJECT DeviceObject)
288 {
289     DPRINT("VfatFastIoUnlockAll\n");
290 
291     UNREFERENCED_PARAMETER(FileObject);
292     UNREFERENCED_PARAMETER(ProcessId);
293     UNREFERENCED_PARAMETER(IoStatus);
294     UNREFERENCED_PARAMETER(DeviceObject);
295 
296     return FALSE;
297 }
298 
299 static FAST_IO_UNLOCK_ALL_BY_KEY VfatFastIoUnlockAllByKey;
300 
301 static
302 BOOLEAN
303 NTAPI
304 VfatFastIoUnlockAllByKey(
305     IN PFILE_OBJECT FileObject,
306     PVOID ProcessId,
307     ULONG Key,
308     OUT PIO_STATUS_BLOCK IoStatus,
309     IN PDEVICE_OBJECT DeviceObject)
310 {
311     DPRINT("VfatFastIoUnlockAllByKey\n");
312 
313     UNREFERENCED_PARAMETER(FileObject);
314     UNREFERENCED_PARAMETER(ProcessId);
315     UNREFERENCED_PARAMETER(Key);
316     UNREFERENCED_PARAMETER(IoStatus);
317     UNREFERENCED_PARAMETER(DeviceObject);
318 
319     return FALSE;
320 }
321 
322 static FAST_IO_DEVICE_CONTROL VfatFastIoDeviceControl;
323 
324 static
325 BOOLEAN
326 NTAPI
327 VfatFastIoDeviceControl(
328     IN PFILE_OBJECT FileObject,
329     IN BOOLEAN Wait,
330     IN PVOID InputBuffer OPTIONAL,
331     IN ULONG InputBufferLength,
332     OUT PVOID OutputBuffer OPTIONAL,
333     IN ULONG OutputBufferLength,
334     IN ULONG IoControlCode,
335     OUT PIO_STATUS_BLOCK IoStatus,
336     IN PDEVICE_OBJECT DeviceObject)
337 {
338     DPRINT("VfatFastIoDeviceControl\n");
339 
340     UNREFERENCED_PARAMETER(FileObject);
341     UNREFERENCED_PARAMETER(Wait);
342     UNREFERENCED_PARAMETER(InputBuffer);
343     UNREFERENCED_PARAMETER(InputBufferLength);
344     UNREFERENCED_PARAMETER(OutputBuffer);
345     UNREFERENCED_PARAMETER(OutputBufferLength);
346     UNREFERENCED_PARAMETER(IoControlCode);
347     UNREFERENCED_PARAMETER(IoStatus);
348     UNREFERENCED_PARAMETER(DeviceObject);
349 
350     return FALSE;
351 }
352 
353 static FAST_IO_ACQUIRE_FILE VfatAcquireFileForNtCreateSection;
354 
355 static
356 VOID
357 NTAPI
358 VfatAcquireFileForNtCreateSection(
359     IN PFILE_OBJECT FileObject)
360 {
361     DPRINT("VfatAcquireFileForNtCreateSection\n");
362     UNREFERENCED_PARAMETER(FileObject);
363 }
364 
365 static FAST_IO_RELEASE_FILE VfatReleaseFileForNtCreateSection;
366 
367 static
368 VOID
369 NTAPI
370 VfatReleaseFileForNtCreateSection(
371     IN PFILE_OBJECT FileObject)
372 {
373     DPRINT("VfatReleaseFileForNtCreateSection\n");
374     UNREFERENCED_PARAMETER(FileObject);
375 }
376 
377 static FAST_IO_DETACH_DEVICE VfatFastIoDetachDevice;
378 
379 static
380 VOID
381 NTAPI
382 VfatFastIoDetachDevice(
383     IN PDEVICE_OBJECT SourceDevice,
384     IN PDEVICE_OBJECT TargetDevice)
385 {
386     DPRINT("VfatFastIoDetachDevice\n");
387     UNREFERENCED_PARAMETER(SourceDevice);
388     UNREFERENCED_PARAMETER(TargetDevice);
389 }
390 
391 static FAST_IO_QUERY_NETWORK_OPEN_INFO VfatFastIoQueryNetworkOpenInfo;
392 
393 static
394 BOOLEAN
395 NTAPI
396 VfatFastIoQueryNetworkOpenInfo(
397     IN PFILE_OBJECT FileObject,
398     IN BOOLEAN Wait,
399     OUT PFILE_NETWORK_OPEN_INFORMATION Buffer,
400     OUT PIO_STATUS_BLOCK IoStatus,
401     IN PDEVICE_OBJECT DeviceObject)
402 {
403     DPRINT("VfatFastIoQueryNetworkOpenInfo\n");
404 
405     UNREFERENCED_PARAMETER(FileObject);
406     UNREFERENCED_PARAMETER(Wait);
407     UNREFERENCED_PARAMETER(Buffer);
408     UNREFERENCED_PARAMETER(IoStatus);
409     UNREFERENCED_PARAMETER(DeviceObject);
410 
411     return FALSE;
412 }
413 
414 static FAST_IO_ACQUIRE_FOR_MOD_WRITE VfatAcquireForModWrite;
415 
416 static
417 NTSTATUS
418 NTAPI
419 VfatAcquireForModWrite(
420     IN PFILE_OBJECT FileObject,
421     IN PLARGE_INTEGER EndingOffset,
422     OUT PERESOURCE* ResourceToRelease,
423     IN PDEVICE_OBJECT DeviceObject)
424 {
425     DPRINT("VfatAcquireForModWrite\n");
426 
427     UNREFERENCED_PARAMETER(FileObject);
428     UNREFERENCED_PARAMETER(EndingOffset);
429     UNREFERENCED_PARAMETER(ResourceToRelease);
430     UNREFERENCED_PARAMETER(DeviceObject);
431 
432     return STATUS_INVALID_DEVICE_REQUEST;
433 }
434 
435 static FAST_IO_MDL_READ VfatMdlRead;
436 
437 static
438 BOOLEAN
439 NTAPI
440 VfatMdlRead(
441     IN PFILE_OBJECT FileObject,
442     IN PLARGE_INTEGER FileOffset,
443     IN ULONG Length,
444     IN ULONG LockKey,
445     OUT PMDL* MdlChain,
446     OUT PIO_STATUS_BLOCK IoStatus,
447     IN PDEVICE_OBJECT DeviceObject)
448 {
449     DPRINT("VfatMdlRead\n");
450 
451     UNREFERENCED_PARAMETER(FileObject);
452     UNREFERENCED_PARAMETER(FileOffset);
453     UNREFERENCED_PARAMETER(Length);
454     UNREFERENCED_PARAMETER(LockKey);
455     UNREFERENCED_PARAMETER(MdlChain);
456     UNREFERENCED_PARAMETER(IoStatus);
457     UNREFERENCED_PARAMETER(DeviceObject);
458 
459     return FALSE;
460 }
461 
462 static FAST_IO_MDL_READ_COMPLETE VfatMdlReadComplete;
463 
464 static
465 BOOLEAN
466 NTAPI
467 VfatMdlReadComplete(
468     IN PFILE_OBJECT FileObject,
469     IN PMDL MdlChain,
470     IN PDEVICE_OBJECT DeviceObject)
471 {
472     DPRINT("VfatMdlReadComplete\n");
473 
474     UNREFERENCED_PARAMETER(FileObject);
475     UNREFERENCED_PARAMETER(MdlChain);
476     UNREFERENCED_PARAMETER(DeviceObject);
477 
478     return FALSE;
479 }
480 
481 static FAST_IO_PREPARE_MDL_WRITE VfatPrepareMdlWrite;
482 
483 static
484 BOOLEAN
485 NTAPI
486 VfatPrepareMdlWrite(
487     IN PFILE_OBJECT FileObject,
488     IN PLARGE_INTEGER FileOffset,
489     IN ULONG Length,
490     IN ULONG LockKey,
491     OUT PMDL* MdlChain,
492     OUT PIO_STATUS_BLOCK IoStatus,
493     IN PDEVICE_OBJECT DeviceObject)
494 {
495     DPRINT("VfatPrepareMdlWrite\n");
496 
497     UNREFERENCED_PARAMETER(FileObject);
498     UNREFERENCED_PARAMETER(FileOffset);
499     UNREFERENCED_PARAMETER(Length);
500     UNREFERENCED_PARAMETER(LockKey);
501     UNREFERENCED_PARAMETER(MdlChain);
502     UNREFERENCED_PARAMETER(IoStatus);
503     UNREFERENCED_PARAMETER(DeviceObject);
504 
505     return FALSE;
506 }
507 
508 static FAST_IO_MDL_WRITE_COMPLETE VfatMdlWriteComplete;
509 
510 static
511 BOOLEAN
512 NTAPI
513 VfatMdlWriteComplete(
514     IN PFILE_OBJECT FileObject,
515     IN PLARGE_INTEGER FileOffset,
516     IN PMDL MdlChain,
517     IN PDEVICE_OBJECT DeviceObject)
518 {
519     DPRINT("VfatMdlWriteComplete\n");
520 
521     UNREFERENCED_PARAMETER(FileObject);
522     UNREFERENCED_PARAMETER(FileOffset);
523     UNREFERENCED_PARAMETER(MdlChain);
524     UNREFERENCED_PARAMETER(DeviceObject);
525 
526     return FALSE;
527 }
528 
529 static FAST_IO_READ_COMPRESSED VfatFastIoReadCompressed;
530 
531 static
532 BOOLEAN
533 NTAPI
534 VfatFastIoReadCompressed(
535     IN PFILE_OBJECT FileObject,
536     IN PLARGE_INTEGER FileOffset,
537     IN ULONG Length,
538     IN ULONG LockKey,
539     OUT PVOID Buffer,
540     OUT PMDL* MdlChain,
541     OUT PIO_STATUS_BLOCK IoStatus,
542     OUT PCOMPRESSED_DATA_INFO CompressedDataInfo,
543     IN ULONG CompressedDataInfoLength,
544     IN PDEVICE_OBJECT DeviceObject)
545 {
546     DPRINT("VfatFastIoReadCompressed\n");
547 
548     UNREFERENCED_PARAMETER(FileObject);
549     UNREFERENCED_PARAMETER(FileOffset);
550     UNREFERENCED_PARAMETER(Length);
551     UNREFERENCED_PARAMETER(LockKey);
552     UNREFERENCED_PARAMETER(Buffer);
553     UNREFERENCED_PARAMETER(MdlChain);
554     UNREFERENCED_PARAMETER(IoStatus);
555     UNREFERENCED_PARAMETER(CompressedDataInfo);
556     UNREFERENCED_PARAMETER(CompressedDataInfoLength);
557     UNREFERENCED_PARAMETER(DeviceObject);
558 
559     return FALSE;
560 }
561 
562 static FAST_IO_WRITE_COMPRESSED VfatFastIoWriteCompressed;
563 
564 static
565 BOOLEAN
566 NTAPI
567 VfatFastIoWriteCompressed(
568     IN PFILE_OBJECT FileObject,
569     IN PLARGE_INTEGER FileOffset,
570     IN ULONG Length,
571     IN ULONG LockKey,
572     IN PVOID Buffer,
573     OUT PMDL* MdlChain,
574     OUT PIO_STATUS_BLOCK IoStatus,
575     IN PCOMPRESSED_DATA_INFO CompressedDataInfo,
576     IN ULONG CompressedDataInfoLength,
577     IN PDEVICE_OBJECT DeviceObject)
578 {
579     DPRINT("VfatFastIoWriteCompressed\n");
580 
581     UNREFERENCED_PARAMETER(FileObject);
582     UNREFERENCED_PARAMETER(FileOffset);
583     UNREFERENCED_PARAMETER(Length);
584     UNREFERENCED_PARAMETER(LockKey);
585     UNREFERENCED_PARAMETER(Buffer);
586     UNREFERENCED_PARAMETER(MdlChain);
587     UNREFERENCED_PARAMETER(IoStatus);
588     UNREFERENCED_PARAMETER(CompressedDataInfo);
589     UNREFERENCED_PARAMETER(CompressedDataInfoLength);
590     UNREFERENCED_PARAMETER(DeviceObject);
591 
592     return FALSE;
593 }
594 
595 static FAST_IO_MDL_READ_COMPLETE_COMPRESSED VfatMdlReadCompleteCompressed;
596 
597 static
598 BOOLEAN
599 NTAPI
600 VfatMdlReadCompleteCompressed(
601     IN PFILE_OBJECT FileObject,
602     IN PMDL MdlChain,
603     IN PDEVICE_OBJECT DeviceObject)
604 {
605     DPRINT("VfatMdlReadCompleteCompressed\n");
606 
607     UNREFERENCED_PARAMETER(FileObject);
608     UNREFERENCED_PARAMETER(MdlChain);
609     UNREFERENCED_PARAMETER(DeviceObject);
610 
611     return FALSE;
612 }
613 
614 static FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED VfatMdlWriteCompleteCompressed;
615 
616 static
617 BOOLEAN
618 NTAPI
619 VfatMdlWriteCompleteCompressed(
620     IN PFILE_OBJECT FileObject,
621     IN PLARGE_INTEGER FileOffset,
622     IN PMDL MdlChain,
623     IN PDEVICE_OBJECT DeviceObject)
624 {
625     DPRINT("VfatMdlWriteCompleteCompressed\n");
626 
627     UNREFERENCED_PARAMETER(FileObject);
628     UNREFERENCED_PARAMETER(FileOffset);
629     UNREFERENCED_PARAMETER(MdlChain);
630     UNREFERENCED_PARAMETER(DeviceObject);
631 
632     return FALSE;
633 }
634 
635 static FAST_IO_QUERY_OPEN VfatFastIoQueryOpen;
636 
637 static
638 BOOLEAN
639 NTAPI
640 VfatFastIoQueryOpen(
641     IN PIRP Irp,
642     OUT PFILE_NETWORK_OPEN_INFORMATION  NetworkInformation,
643     IN PDEVICE_OBJECT DeviceObject)
644 {
645     DPRINT("VfatFastIoQueryOpen\n");
646 
647     UNREFERENCED_PARAMETER(Irp);
648     UNREFERENCED_PARAMETER(NetworkInformation);
649     UNREFERENCED_PARAMETER(DeviceObject);
650 
651     return FALSE;
652 }
653 
654 static FAST_IO_RELEASE_FOR_MOD_WRITE VfatReleaseForModWrite;
655 
656 static
657 NTSTATUS
658 NTAPI
659 VfatReleaseForModWrite(
660     IN PFILE_OBJECT FileObject,
661     IN PERESOURCE ResourceToRelease,
662     IN PDEVICE_OBJECT DeviceObject)
663 {
664     DPRINT("VfatReleaseForModWrite\n");
665 
666     UNREFERENCED_PARAMETER(FileObject);
667     UNREFERENCED_PARAMETER(ResourceToRelease);
668     UNREFERENCED_PARAMETER(DeviceObject);
669 
670     return STATUS_INVALID_DEVICE_REQUEST;
671 }
672 
673 static FAST_IO_ACQUIRE_FOR_CCFLUSH VfatAcquireForCcFlush;
674 
675 static
676 NTSTATUS
677 NTAPI
678 VfatAcquireForCcFlush(
679     IN PFILE_OBJECT FileObject,
680     IN PDEVICE_OBJECT DeviceObject)
681 {
682     PVFATFCB Fcb = (PVFATFCB)FileObject->FsContext;
683 
684     DPRINT("VfatAcquireForCcFlush\n");
685 
686     UNREFERENCED_PARAMETER(DeviceObject);
687 
688     /* Make sure it is not a volume lock */
689     ASSERT(!BooleanFlagOn(Fcb->Flags, FCB_IS_VOLUME));
690 
691     /* Acquire the resource */
692     ExAcquireResourceExclusiveLite(&(Fcb->MainResource), TRUE);
693 
694     return STATUS_SUCCESS;
695 }
696 
697 static FAST_IO_RELEASE_FOR_CCFLUSH VfatReleaseForCcFlush;
698 
699 static
700 NTSTATUS
701 NTAPI
702 VfatReleaseForCcFlush(
703     IN PFILE_OBJECT FileObject,
704     IN PDEVICE_OBJECT DeviceObject)
705 {
706     PVFATFCB Fcb = (PVFATFCB)FileObject->FsContext;
707 
708     DPRINT("VfatReleaseForCcFlush\n");
709 
710     UNREFERENCED_PARAMETER(DeviceObject);
711 
712     /* Make sure it is not a volume lock */
713     ASSERT(!BooleanFlagOn(Fcb->Flags, FCB_IS_VOLUME));
714 
715     /* Release the resource */
716     ExReleaseResourceLite(&(Fcb->MainResource));
717 
718     return STATUS_SUCCESS;
719 }
720 
721 BOOLEAN
722 NTAPI
723 VfatAcquireForLazyWrite(
724     IN PVOID Context,
725     IN BOOLEAN Wait)
726 {
727     PVFATFCB Fcb = (PVFATFCB)Context;
728     ASSERT(Fcb);
729     DPRINT("VfatAcquireForLazyWrite(): Fcb %p\n", Fcb);
730 
731     if (!ExAcquireResourceExclusiveLite(&(Fcb->MainResource), Wait))
732     {
733         DPRINT("VfatAcquireForLazyWrite(): ExReleaseResourceLite failed.\n");
734         return FALSE;
735     }
736     return TRUE;
737 }
738 
739 VOID
740 NTAPI
741 VfatReleaseFromLazyWrite(
742     IN PVOID Context)
743 {
744     PVFATFCB Fcb = (PVFATFCB)Context;
745     ASSERT(Fcb);
746     DPRINT("VfatReleaseFromLazyWrite(): Fcb %p\n", Fcb);
747 
748     ExReleaseResourceLite(&(Fcb->MainResource));
749 }
750 
751 CODE_SEG("INIT")
752 VOID
753 VfatInitFastIoRoutines(
754     PFAST_IO_DISPATCH FastIoDispatch)
755 {
756     FastIoDispatch->SizeOfFastIoDispatch = sizeof(FAST_IO_DISPATCH);
757     FastIoDispatch->FastIoCheckIfPossible = VfatFastIoCheckIfPossible;
758     FastIoDispatch->FastIoRead = VfatFastIoRead;
759     FastIoDispatch->FastIoWrite = VfatFastIoWrite;
760     FastIoDispatch->FastIoQueryBasicInfo = VfatFastIoQueryBasicInfo;
761     FastIoDispatch->FastIoQueryStandardInfo = VfatFastIoQueryStandardInfo;
762     FastIoDispatch->FastIoLock = VfatFastIoLock;
763     FastIoDispatch->FastIoUnlockSingle = VfatFastIoUnlockSingle;
764     FastIoDispatch->FastIoUnlockAll = VfatFastIoUnlockAll;
765     FastIoDispatch->FastIoUnlockAllByKey = VfatFastIoUnlockAllByKey;
766     FastIoDispatch->FastIoDeviceControl = VfatFastIoDeviceControl;
767     FastIoDispatch->AcquireFileForNtCreateSection = VfatAcquireFileForNtCreateSection;
768     FastIoDispatch->ReleaseFileForNtCreateSection = VfatReleaseFileForNtCreateSection;
769     FastIoDispatch->FastIoDetachDevice = VfatFastIoDetachDevice;
770     FastIoDispatch->FastIoQueryNetworkOpenInfo = VfatFastIoQueryNetworkOpenInfo;
771     FastIoDispatch->MdlRead = VfatMdlRead;
772     FastIoDispatch->MdlReadComplete = VfatMdlReadComplete;
773     FastIoDispatch->PrepareMdlWrite = VfatPrepareMdlWrite;
774     FastIoDispatch->MdlWriteComplete = VfatMdlWriteComplete;
775     FastIoDispatch->FastIoReadCompressed = VfatFastIoReadCompressed;
776     FastIoDispatch->FastIoWriteCompressed = VfatFastIoWriteCompressed;
777     FastIoDispatch->MdlReadCompleteCompressed = VfatMdlReadCompleteCompressed;
778     FastIoDispatch->MdlWriteCompleteCompressed = VfatMdlWriteCompleteCompressed;
779     FastIoDispatch->FastIoQueryOpen = VfatFastIoQueryOpen;
780     FastIoDispatch->AcquireForModWrite = VfatAcquireForModWrite;
781     FastIoDispatch->ReleaseForModWrite = VfatReleaseForModWrite;
782     FastIoDispatch->AcquireForCcFlush = VfatAcquireForCcFlush;
783     FastIoDispatch->ReleaseForCcFlush = VfatReleaseForCcFlush;
784 }
785