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