[FASTFAT]
[reactos.git] / reactos / drivers / filesystems / fastfat / vfat.h
1 #ifndef _FASTFAT_PCH_
2 #define _FASTFAT_PCH_
3
4 #include <ntifs.h>
5 #include <ntdddisk.h>
6 #include <dos.h>
7 #include <pseh/pseh2.h>
8
9 #define USE_ROS_CC_AND_FS
10 #if 0
11 #ifndef _MSC_VER
12 #define ENABLE_SWAPOUT
13 #endif
14 #endif
15
16 #define ROUND_DOWN(n, align) \
17 (((ULONG)n) & ~((align) - 1l))
18
19 #define ROUND_UP(n, align) \
20 ROUND_DOWN(((ULONG)n) + (align) - 1, (align))
21
22 #include <pshpack1.h>
23 struct _BootSector
24 {
25 unsigned char magic0, res0, magic1;
26 unsigned char OEMName[8];
27 unsigned short BytesPerSector;
28 unsigned char SectorsPerCluster;
29 unsigned short ReservedSectors;
30 unsigned char FATCount;
31 unsigned short RootEntries, Sectors;
32 unsigned char Media;
33 unsigned short FATSectors, SectorsPerTrack, Heads;
34 unsigned long HiddenSectors, SectorsHuge;
35 unsigned char Drive, Res1, Sig;
36 unsigned long VolumeID;
37 unsigned char VolumeLabel[11], SysType[8];
38 unsigned char Res2[448];
39 unsigned short Signatur1;
40 };
41
42 struct _BootSector32
43 {
44 unsigned char magic0, res0, magic1; // 0
45 unsigned char OEMName[8]; // 3
46 unsigned short BytesPerSector; // 11
47 unsigned char SectorsPerCluster; // 13
48 unsigned short ReservedSectors; // 14
49 unsigned char FATCount; // 16
50 unsigned short RootEntries, Sectors; // 17
51 unsigned char Media; // 21
52 unsigned short FATSectors, SectorsPerTrack, Heads; // 22
53 unsigned long HiddenSectors, SectorsHuge; // 28
54 unsigned long FATSectors32; // 36
55 unsigned short ExtFlag; // 40
56 unsigned short FSVersion; // 42
57 unsigned long RootCluster; // 44
58 unsigned short FSInfoSector; // 48
59 unsigned short BootBackup; // 50
60 unsigned char Res3[12]; // 52
61 unsigned char Drive; // 64
62 unsigned char Res4; // 65
63 unsigned char ExtBootSignature; // 66
64 unsigned long VolumeID; // 67
65 unsigned char VolumeLabel[11], SysType[8]; // 71
66 unsigned char Res2[420]; // 90
67 unsigned short Signature1; // 510
68 };
69
70 struct _BootSectorFatX
71 {
72 unsigned char SysType[4]; // 0
73 unsigned long VolumeID; // 4
74 unsigned long SectorsPerCluster; // 8
75 unsigned short FATCount; // 12
76 unsigned long Unknown; // 14
77 unsigned char Unused[4078]; // 18
78 };
79
80 struct _FsInfoSector
81 {
82 unsigned long ExtBootSignature2; // 0
83 unsigned char Res6[480]; // 4
84 unsigned long FSINFOSignature; // 484
85 unsigned long FreeCluster; // 488
86 unsigned long NextCluster; // 492
87 unsigned char Res7[12]; // 496
88 unsigned long Signatur2; // 508
89 };
90
91 typedef struct _BootSector BootSector;
92
93 struct _FATDirEntry
94 {
95 union
96 {
97 struct { unsigned char Filename[8], Ext[3]; };
98 unsigned char ShortName[11];
99 };
100 unsigned char Attrib;
101 unsigned char lCase;
102 unsigned char CreationTimeMs;
103 unsigned short CreationTime,CreationDate,AccessDate;
104 union
105 {
106 unsigned short FirstClusterHigh; // FAT32
107 unsigned short ExtendedAttributes; // FAT12/FAT16
108 };
109 unsigned short UpdateTime; //time create/update
110 unsigned short UpdateDate; //date create/update
111 unsigned short FirstCluster;
112 unsigned long FileSize;
113 };
114
115 #define FAT_EAFILE "EA DATA. SF"
116
117 typedef struct _EAFileHeader FAT_EA_FILE_HEADER, *PFAT_EA_FILE_HEADER;
118
119 struct _EAFileHeader
120 {
121 unsigned short Signature; // ED
122 unsigned short Unknown[15];
123 unsigned short EASetTable[240];
124 };
125
126 typedef struct _EASetHeader FAT_EA_SET_HEADER, *PFAT_EA_SET_HEADER;
127
128 struct _EASetHeader
129 {
130 unsigned short Signature; // EA
131 unsigned short Offset; // relative offset, same value as in the EASetTable
132 unsigned short Unknown1[2];
133 char TargetFileName[12];
134 unsigned short Unknown2[3];
135 unsigned int EALength;
136 // EA Header
137 };
138
139 typedef struct _EAHeader FAT_EA_HEADER, *PFAT_EA_HEADER;
140
141 struct _EAHeader
142 {
143 unsigned char Unknown;
144 unsigned char EANameLength;
145 unsigned short EAValueLength;
146 // Name Data
147 // Value Data
148 };
149
150 typedef struct _FATDirEntry FAT_DIR_ENTRY, *PFAT_DIR_ENTRY;
151
152 struct _FATXDirEntry
153 {
154 unsigned char FilenameLength; // 0
155 unsigned char Attrib; // 1
156 unsigned char Filename[42]; // 2
157 unsigned long FirstCluster; // 44
158 unsigned long FileSize; // 48
159 unsigned short UpdateTime; // 52
160 unsigned short UpdateDate; // 54
161 unsigned short CreationTime; // 56
162 unsigned short CreationDate; // 58
163 unsigned short AccessTime; // 60
164 unsigned short AccessDate; // 62
165 };
166
167 struct _slot
168 {
169 unsigned char id; // sequence number for slot
170 WCHAR name0_4[5]; // first 5 characters in name
171 unsigned char attr; // attribute byte
172 unsigned char reserved; // always 0
173 unsigned char alias_checksum; // checksum for 8.3 alias
174 WCHAR name5_10[6]; // 6 more characters in name
175 unsigned char start[2]; // starting cluster number
176 WCHAR name11_12[2]; // last 2 characters in name
177 };
178
179 typedef struct _slot slot;
180
181 #include <poppack.h>
182
183 #define VFAT_CASE_LOWER_BASE 8 // base is lower case
184 #define VFAT_CASE_LOWER_EXT 16 // extension is lower case
185
186 #define LONGNAME_MAX_LENGTH 256 // max length for a long filename
187
188 #define ENTRY_DELETED(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_DELETED(&((DirEntry)->FatX)) : FAT_ENTRY_DELETED(&((DirEntry)->Fat)))
189 #define ENTRY_VOLUME(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_VOLUME(&((DirEntry)->FatX)) : FAT_ENTRY_VOLUME(&((DirEntry)->Fat)))
190 #define ENTRY_END(DeviceExt, DirEntry) ((DeviceExt)->Flags & VCB_IS_FATX ? FATX_ENTRY_END(&((DirEntry)->FatX)) : FAT_ENTRY_END(&((DirEntry)->Fat)))
191
192 #define FAT_ENTRY_DELETED(DirEntry) ((DirEntry)->Filename[0] == 0xe5)
193 #define FAT_ENTRY_END(DirEntry) ((DirEntry)->Filename[0] == 0)
194 #define FAT_ENTRY_LONG(DirEntry) (((DirEntry)->Attrib & 0x3f) == 0x0f)
195 #define FAT_ENTRY_VOLUME(DirEntry) (((DirEntry)->Attrib & 0x1f) == 0x08)
196
197 #define FATX_ENTRY_DELETED(DirEntry) ((DirEntry)->FilenameLength == 0xe5)
198 #define FATX_ENTRY_END(DirEntry) ((DirEntry)->FilenameLength == 0xff)
199 #define FATX_ENTRY_LONG(DirEntry) (FALSE)
200 #define FATX_ENTRY_VOLUME(DirEntry) (((DirEntry)->Attrib & 0x1f) == 0x08)
201
202 #define FAT_ENTRIES_PER_PAGE (PAGE_SIZE / sizeof (FAT_DIR_ENTRY))
203 #define FATX_ENTRIES_PER_PAGE (PAGE_SIZE / sizeof (FATX_DIR_ENTRY))
204
205 typedef struct _FATXDirEntry FATX_DIR_ENTRY, *PFATX_DIR_ENTRY;
206
207 union _DIR_ENTRY
208 {
209 FAT_DIR_ENTRY Fat;
210 FATX_DIR_ENTRY FatX;
211 };
212
213 typedef union _DIR_ENTRY DIR_ENTRY, *PDIR_ENTRY;
214
215 #define BLOCKSIZE 512
216
217 #define FAT16 (1)
218 #define FAT12 (2)
219 #define FAT32 (3)
220 #define FATX16 (4)
221 #define FATX32 (5)
222
223 #define VCB_VOLUME_LOCKED 0x0001
224 #define VCB_DISMOUNT_PENDING 0x0002
225 #define VCB_IS_FATX 0x0004
226 #define VCB_IS_DIRTY 0x4000 /* Volume is dirty */
227 #define VCB_CLEAR_DIRTY 0x8000 /* Clean dirty flag at shutdown */
228
229 typedef struct
230 {
231 ULONG VolumeID;
232 ULONG FATStart;
233 ULONG FATCount;
234 ULONG FATSectors;
235 ULONG rootDirectorySectors;
236 ULONG rootStart;
237 ULONG dataStart;
238 ULONG RootCluster;
239 ULONG SectorsPerCluster;
240 ULONG BytesPerSector;
241 ULONG BytesPerCluster;
242 ULONG NumberOfClusters;
243 ULONG FatType;
244 ULONG Sectors;
245 BOOLEAN FixedMedia;
246 } FATINFO, *PFATINFO;
247
248 struct _VFATFCB;
249 struct _VFAT_DIRENTRY_CONTEXT;
250
251 typedef struct _HASHENTRY
252 {
253 ULONG Hash;
254 struct _VFATFCB* self;
255 struct _HASHENTRY* next;
256 }
257 HASHENTRY;
258
259 #define FCB_HASH_TABLE_SIZE 65536
260
261 typedef struct DEVICE_EXTENSION *PDEVICE_EXTENSION;
262
263 typedef NTSTATUS (*PGET_NEXT_CLUSTER)(PDEVICE_EXTENSION,ULONG,PULONG);
264 typedef NTSTATUS (*PFIND_AND_MARK_AVAILABLE_CLUSTER)(PDEVICE_EXTENSION,PULONG);
265 typedef NTSTATUS (*PWRITE_CLUSTER)(PDEVICE_EXTENSION,ULONG,ULONG,PULONG);
266
267 typedef NTSTATUS (*PGET_NEXT_DIR_ENTRY)(PVOID*,PVOID*,struct _VFATFCB*,struct _VFAT_DIRENTRY_CONTEXT*,BOOLEAN);
268
269 typedef struct DEVICE_EXTENSION
270 {
271 ERESOURCE DirResource;
272 ERESOURCE FatResource;
273
274 KSPIN_LOCK FcbListLock;
275 LIST_ENTRY FcbListHead;
276 ULONG HashTableSize;
277 struct _HASHENTRY **FcbHashTable;
278
279 PDEVICE_OBJECT VolumeDevice;
280 PDEVICE_OBJECT StorageDevice;
281 PFILE_OBJECT FATFileObject;
282 FATINFO FatInfo;
283 ULONG LastAvailableCluster;
284 ULONG AvailableClusters;
285 BOOLEAN AvailableClustersValid;
286 ULONG Flags;
287 struct _VFATFCB *VolumeFcb;
288
289 /* Pointers to functions for manipulating FAT. */
290 PGET_NEXT_CLUSTER GetNextCluster;
291 PFIND_AND_MARK_AVAILABLE_CLUSTER FindAndMarkAvailableCluster;
292 PWRITE_CLUSTER WriteCluster;
293 ULONG CleanShutBitMask;
294
295 /* Pointers to functions for manipulating directory entries. */
296 PGET_NEXT_DIR_ENTRY GetNextDirEntry;
297
298 ULONG BaseDateYear;
299
300 LIST_ENTRY VolumeListEntry;
301
302 /* Notifications */
303 LIST_ENTRY NotifyList;
304 PNOTIFY_SYNC NotifySync;
305
306 /* Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLOSE */
307 ULONG OpenHandleCount;
308
309 /* VPBs for dismount */
310 PVPB IoVPB;
311 PVPB SpareVPB;
312 } DEVICE_EXTENSION, VCB, *PVCB;
313
314 typedef struct
315 {
316 PDRIVER_OBJECT DriverObject;
317 PDEVICE_OBJECT DeviceObject;
318 ULONG Flags;
319 ERESOURCE VolumeListLock;
320 LIST_ENTRY VolumeListHead;
321 NPAGED_LOOKASIDE_LIST FcbLookasideList;
322 NPAGED_LOOKASIDE_LIST CcbLookasideList;
323 NPAGED_LOOKASIDE_LIST IrpContextLookasideList;
324 FAST_IO_DISPATCH FastIoDispatch;
325 CACHE_MANAGER_CALLBACKS CacheMgrCallbacks;
326 } VFAT_GLOBAL_DATA, *PVFAT_GLOBAL_DATA;
327
328 extern PVFAT_GLOBAL_DATA VfatGlobalData;
329
330 #define FCB_CACHE_INITIALIZED 0x0001
331 #define FCB_DELETE_PENDING 0x0002
332 #define FCB_IS_FAT 0x0004
333 #define FCB_IS_PAGE_FILE 0x0008
334 #define FCB_IS_VOLUME 0x0010
335 #define FCB_IS_DIRTY 0x0020
336 #define FCB_IS_FATX_ENTRY 0x0040
337
338 typedef struct _VFATFCB
339 {
340 /* FCB header required by ROS/NT */
341 FSRTL_COMMON_FCB_HEADER RFCB;
342 SECTION_OBJECT_POINTERS SectionObjectPointers;
343 ERESOURCE MainResource;
344 ERESOURCE PagingIoResource;
345 /* end FCB header required by ROS/NT */
346
347 /* directory entry for this file or directory */
348 DIR_ENTRY entry;
349
350 /* Pointer to attributes in entry */
351 PUCHAR Attributes;
352
353 /* long file name, points into PathNameBuffer */
354 UNICODE_STRING LongNameU;
355
356 /* short file name */
357 UNICODE_STRING ShortNameU;
358
359 /* directory name, points into PathNameBuffer */
360 UNICODE_STRING DirNameU;
361
362 /* path + long file name 260 max*/
363 UNICODE_STRING PathNameU;
364
365 /* buffer for PathNameU */
366 PWCHAR PathNameBuffer;
367
368 /* buffer for ShortNameU */
369 WCHAR ShortNameBuffer[13];
370
371 /* */
372 LONG RefCount;
373
374 /* List of FCB's for this volume */
375 LIST_ENTRY FcbListEntry;
376
377 /* pointer to the parent fcb */
378 struct _VFATFCB *parentFcb;
379
380 /* Flags for the fcb */
381 ULONG Flags;
382
383 /* pointer to the file object which has initialized the fcb */
384 PFILE_OBJECT FileObject;
385
386 /* Directory index for the short name entry */
387 ULONG dirIndex;
388
389 /* Directory index where the long name starts */
390 ULONG startIndex;
391
392 /* Share access for the file object */
393 SHARE_ACCESS FCBShareAccess;
394
395 /* Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP */
396 ULONG OpenHandleCount;
397
398 /* Entry into the hash table for the path + long name */
399 HASHENTRY Hash;
400
401 /* Entry into the hash table for the path + short name */
402 HASHENTRY ShortHash;
403
404 /* List of byte-range locks for this file */
405 FILE_LOCK FileLock;
406
407 /*
408 * Optimalization: caching of last read/write cluster+offset pair. Can't
409 * be in VFATCCB because it must be reset everytime the allocated clusters
410 * change.
411 */
412 FAST_MUTEX LastMutex;
413 ULONG LastCluster;
414 ULONG LastOffset;
415 } VFATFCB, *PVFATFCB;
416
417 typedef struct _VFATCCB
418 {
419 LARGE_INTEGER CurrentByteOffset;
420 /* for DirectoryControl */
421 ULONG Entry;
422 /* for DirectoryControl */
423 UNICODE_STRING SearchPattern;
424 } VFATCCB, *PVFATCCB;
425
426 #define TAG_CCB 'BCCV'
427 #define TAG_FCB 'BCFV'
428 #define TAG_IRP 'PRIV'
429 #define TAG_VFAT 'TAFV'
430
431 #define ENTRIES_PER_SECTOR (BLOCKSIZE / sizeof(FATDirEntry))
432
433 typedef struct __DOSTIME
434 {
435 USHORT Second:5;
436 USHORT Minute:6;
437 USHORT Hour:5;
438 }
439 DOSTIME, *PDOSTIME;
440
441 typedef struct __DOSDATE
442 {
443 USHORT Day:5;
444 USHORT Month:4;
445 USHORT Year:7;
446 }
447 DOSDATE, *PDOSDATE;
448
449 #define IRPCONTEXT_CANWAIT 0x0001
450 #define IRPCONTEXT_PENDINGRETURNED 0x0002
451
452 typedef struct
453 {
454 PIRP Irp;
455 PDEVICE_OBJECT DeviceObject;
456 PDEVICE_EXTENSION DeviceExt;
457 ULONG Flags;
458 WORK_QUEUE_ITEM WorkQueueItem;
459 PIO_STACK_LOCATION Stack;
460 UCHAR MajorFunction;
461 UCHAR MinorFunction;
462 PFILE_OBJECT FileObject;
463 ULONG RefCount;
464 KEVENT Event;
465 } VFAT_IRP_CONTEXT, *PVFAT_IRP_CONTEXT;
466
467 typedef struct _VFAT_DIRENTRY_CONTEXT
468 {
469 ULONG StartIndex;
470 ULONG DirIndex;
471 DIR_ENTRY DirEntry;
472 UNICODE_STRING LongNameU;
473 UNICODE_STRING ShortNameU;
474 } VFAT_DIRENTRY_CONTEXT, *PVFAT_DIRENTRY_CONTEXT;
475
476 typedef struct _VFAT_MOVE_CONTEXT
477 {
478 ULONG FirstCluster;
479 ULONG FileSize;
480 USHORT CreationDate;
481 USHORT CreationTime;
482 } VFAT_MOVE_CONTEXT, *PVFAT_MOVE_CONTEXT;
483
484 /* blockdev.c */
485
486 NTSTATUS
487 VfatReadDisk(
488 IN PDEVICE_OBJECT pDeviceObject,
489 IN PLARGE_INTEGER ReadOffset,
490 IN ULONG ReadLength,
491 IN PUCHAR Buffer,
492 IN BOOLEAN Override);
493
494 NTSTATUS
495 VfatReadDiskPartial(
496 IN PVFAT_IRP_CONTEXT IrpContext,
497 IN PLARGE_INTEGER ReadOffset,
498 IN ULONG ReadLength,
499 IN ULONG BufferOffset,
500 IN BOOLEAN Wait);
501
502 NTSTATUS
503 VfatWriteDiskPartial(
504 IN PVFAT_IRP_CONTEXT IrpContext,
505 IN PLARGE_INTEGER WriteOffset,
506 IN ULONG WriteLength,
507 IN ULONG BufferOffset,
508 IN BOOLEAN Wait);
509
510 NTSTATUS
511 VfatBlockDeviceIoControl(
512 IN PDEVICE_OBJECT DeviceObject,
513 IN ULONG CtlCode,
514 IN PVOID InputBuffer,
515 IN ULONG InputBufferSize,
516 IN OUT PVOID OutputBuffer,
517 IN OUT PULONG pOutputBufferSize,
518 IN BOOLEAN Override);
519
520 /* cleanup.c */
521
522 NTSTATUS
523 VfatCleanup(
524 PVFAT_IRP_CONTEXT IrpContext);
525
526 /* close.c */
527
528 NTSTATUS
529 VfatClose(
530 PVFAT_IRP_CONTEXT IrpContext);
531
532 NTSTATUS
533 VfatCloseFile(
534 PDEVICE_EXTENSION DeviceExt,
535 PFILE_OBJECT FileObject);
536
537 /* create.c */
538
539 NTSTATUS
540 VfatCreate(
541 PVFAT_IRP_CONTEXT IrpContext);
542
543 NTSTATUS
544 FindFile(
545 PDEVICE_EXTENSION DeviceExt,
546 PVFATFCB Parent,
547 PUNICODE_STRING FileToFindU,
548 PVFAT_DIRENTRY_CONTEXT DirContext,
549 BOOLEAN First);
550
551 VOID
552 vfat8Dot3ToString(
553 PFAT_DIR_ENTRY pEntry,
554 PUNICODE_STRING NameU);
555
556 NTSTATUS
557 ReadVolumeLabel(
558 PDEVICE_EXTENSION DeviceExt,
559 PVPB Vpb);
560
561 /* dir.c */
562
563 NTSTATUS
564 VfatDirectoryControl(
565 PVFAT_IRP_CONTEXT IrpContext);
566
567 BOOLEAN
568 FsdDosDateTimeToSystemTime(
569 PDEVICE_EXTENSION DeviceExt,
570 USHORT DosDate,
571 USHORT DosTime,
572 PLARGE_INTEGER SystemTime);
573
574 BOOLEAN
575 FsdSystemTimeToDosDateTime(
576 PDEVICE_EXTENSION DeviceExt,
577 PLARGE_INTEGER SystemTime,
578 USHORT *pDosDate,
579 USHORT *pDosTime);
580
581 /* direntry.c */
582
583 ULONG
584 vfatDirEntryGetFirstCluster(
585 PDEVICE_EXTENSION pDeviceExt,
586 PDIR_ENTRY pDirEntry);
587
588 BOOLEAN
589 VfatIsDirectoryEmpty(
590 PVFATFCB Fcb);
591
592 NTSTATUS
593 FATGetNextDirEntry(
594 PVOID *pContext,
595 PVOID *pPage,
596 IN PVFATFCB pDirFcb,
597 IN PVFAT_DIRENTRY_CONTEXT DirContext,
598 BOOLEAN First);
599
600 NTSTATUS
601 FATXGetNextDirEntry(
602 PVOID *pContext,
603 PVOID *pPage,
604 IN PVFATFCB pDirFcb,
605 IN PVFAT_DIRENTRY_CONTEXT DirContext,
606 BOOLEAN First);
607
608 /* dirwr.c */
609
610 NTSTATUS
611 VfatAddEntry(
612 PDEVICE_EXTENSION DeviceExt,
613 PUNICODE_STRING PathNameU,
614 PVFATFCB* Fcb,
615 PVFATFCB ParentFcb,
616 ULONG RequestedOptions,
617 UCHAR ReqAttr,
618 PVFAT_MOVE_CONTEXT MoveContext);
619
620 NTSTATUS
621 VfatUpdateEntry(
622 PVFATFCB pFcb);
623
624 NTSTATUS
625 VfatDelEntry(
626 PDEVICE_EXTENSION,
627 PVFATFCB,
628 PVFAT_MOVE_CONTEXT);
629
630 BOOLEAN
631 vfatFindDirSpace(
632 PDEVICE_EXTENSION DeviceExt,
633 PVFATFCB pDirFcb,
634 ULONG nbSlots,
635 PULONG start);
636
637 NTSTATUS
638 vfatRenameEntry(
639 IN PDEVICE_EXTENSION DeviceExt,
640 IN PVFATFCB pFcb,
641 IN PUNICODE_STRING FileName,
642 IN BOOLEAN CaseChangeOnly);
643
644 NTSTATUS
645 VfatMoveEntry(
646 IN PDEVICE_EXTENSION DeviceExt,
647 IN PVFATFCB pFcb,
648 IN PUNICODE_STRING FileName,
649 IN PVFATFCB ParentFcb);
650
651 /* ea.h */
652
653 NTSTATUS
654 VfatSetExtendedAttributes(
655 PFILE_OBJECT FileObject,
656 PVOID Ea,
657 ULONG EaLength);
658
659 /* fastio.c */
660
661 VOID
662 VfatInitFastIoRoutines(
663 PFAST_IO_DISPATCH FastIoDispatch);
664
665 BOOLEAN
666 NTAPI
667 VfatAcquireForLazyWrite(
668 IN PVOID Context,
669 IN BOOLEAN Wait);
670
671 VOID
672 NTAPI
673 VfatReleaseFromLazyWrite(
674 IN PVOID Context);
675
676 BOOLEAN
677 NTAPI
678 VfatAcquireForReadAhead(
679 IN PVOID Context,
680 IN BOOLEAN Wait);
681
682 VOID
683 NTAPI
684 VfatReleaseFromReadAhead(
685 IN PVOID Context);
686
687 /* fat.c */
688
689 NTSTATUS
690 FAT12GetNextCluster(
691 PDEVICE_EXTENSION DeviceExt,
692 ULONG CurrentCluster,
693 PULONG NextCluster);
694
695 NTSTATUS
696 FAT12FindAndMarkAvailableCluster(
697 PDEVICE_EXTENSION DeviceExt,
698 PULONG Cluster);
699
700 NTSTATUS
701 FAT12WriteCluster(
702 PDEVICE_EXTENSION DeviceExt,
703 ULONG ClusterToWrite,
704 ULONG NewValue,
705 PULONG OldValue);
706
707 NTSTATUS
708 FAT16GetNextCluster(
709 PDEVICE_EXTENSION DeviceExt,
710 ULONG CurrentCluster,
711 PULONG NextCluster);
712
713 NTSTATUS
714 FAT16FindAndMarkAvailableCluster(
715 PDEVICE_EXTENSION DeviceExt,
716 PULONG Cluster);
717
718 NTSTATUS
719 FAT16WriteCluster(
720 PDEVICE_EXTENSION DeviceExt,
721 ULONG ClusterToWrite,
722 ULONG NewValue,
723 PULONG OldValue);
724
725 NTSTATUS
726 FAT32GetNextCluster(
727 PDEVICE_EXTENSION DeviceExt,
728 ULONG CurrentCluster,
729 PULONG NextCluster);
730
731 NTSTATUS
732 FAT32FindAndMarkAvailableCluster(
733 PDEVICE_EXTENSION DeviceExt,
734 PULONG Cluster);
735
736 NTSTATUS
737 FAT32WriteCluster(
738 PDEVICE_EXTENSION DeviceExt,
739 ULONG ClusterToWrite,
740 ULONG NewValue,
741 PULONG OldValue);
742
743 NTSTATUS
744 OffsetToCluster(
745 PDEVICE_EXTENSION DeviceExt,
746 ULONG FirstCluster,
747 ULONG FileOffset,
748 PULONG Cluster,
749 BOOLEAN Extend);
750
751 ULONGLONG
752 ClusterToSector(
753 PDEVICE_EXTENSION DeviceExt,
754 ULONG Cluster);
755
756 NTSTATUS
757 GetNextCluster(
758 PDEVICE_EXTENSION DeviceExt,
759 ULONG CurrentCluster,
760 PULONG NextCluster);
761
762 NTSTATUS
763 GetNextClusterExtend(
764 PDEVICE_EXTENSION DeviceExt,
765 ULONG CurrentCluster,
766 PULONG NextCluster);
767
768 NTSTATUS
769 CountAvailableClusters(
770 PDEVICE_EXTENSION DeviceExt,
771 PLARGE_INTEGER Clusters);
772
773 NTSTATUS
774 WriteCluster(
775 PDEVICE_EXTENSION DeviceExt,
776 ULONG ClusterToWrite,
777 ULONG NewValue);
778
779 /* fcb.c */
780
781 PVFATFCB
782 vfatNewFCB(
783 PDEVICE_EXTENSION pVCB,
784 PUNICODE_STRING pFileNameU);
785
786 NTSTATUS
787 vfatUpdateFCB(
788 PDEVICE_EXTENSION pVCB,
789 PVFATFCB Fcb,
790 PUNICODE_STRING LongName,
791 PUNICODE_STRING ShortName,
792 PVFATFCB ParentFcb);
793
794 VOID
795 vfatDestroyFCB(
796 PVFATFCB pFCB);
797
798 VOID
799 vfatDestroyCCB(
800 PVFATCCB pCcb);
801
802 VOID
803 vfatGrabFCB(
804 PDEVICE_EXTENSION pVCB,
805 PVFATFCB pFCB);
806
807 VOID
808 vfatReleaseFCB(
809 PDEVICE_EXTENSION pVCB,
810 PVFATFCB pFCB);
811
812 PVFATFCB
813 vfatGrabFCBFromTable(
814 PDEVICE_EXTENSION pDeviceExt,
815 PUNICODE_STRING pFileNameU);
816
817 PVFATFCB
818 vfatMakeRootFCB(
819 PDEVICE_EXTENSION pVCB);
820
821 PVFATFCB
822 vfatOpenRootFCB(
823 PDEVICE_EXTENSION pVCB);
824
825 BOOLEAN
826 vfatFCBIsDirectory(
827 PVFATFCB FCB);
828
829 BOOLEAN
830 vfatFCBIsRoot(
831 PVFATFCB FCB);
832
833 NTSTATUS
834 vfatAttachFCBToFileObject(
835 PDEVICE_EXTENSION vcb,
836 PVFATFCB fcb,
837 PFILE_OBJECT fileObject);
838
839 NTSTATUS
840 vfatDirFindFile(
841 PDEVICE_EXTENSION pVCB,
842 PVFATFCB parentFCB,
843 PUNICODE_STRING FileToFindU,
844 PVFATFCB *fileFCB);
845
846 NTSTATUS
847 vfatGetFCBForFile(
848 PDEVICE_EXTENSION pVCB,
849 PVFATFCB *pParentFCB,
850 PVFATFCB *pFCB,
851 PUNICODE_STRING pFileNameU);
852
853 NTSTATUS
854 vfatMakeFCBFromDirEntry(
855 PVCB vcb,
856 PVFATFCB directoryFCB,
857 PVFAT_DIRENTRY_CONTEXT DirContext,
858 PVFATFCB *fileFCB);
859
860 /* finfo.c */
861
862 NTSTATUS
863 VfatQueryInformation(
864 PVFAT_IRP_CONTEXT IrpContext);
865
866 NTSTATUS
867 VfatSetInformation(
868 PVFAT_IRP_CONTEXT IrpContext);
869
870 NTSTATUS
871 VfatSetAllocationSizeInformation(
872 PFILE_OBJECT FileObject,
873 PVFATFCB Fcb,
874 PDEVICE_EXTENSION DeviceExt,
875 PLARGE_INTEGER AllocationSize);
876
877 /* flush.c */
878
879 NTSTATUS
880 VfatFlush(
881 PVFAT_IRP_CONTEXT IrpContext);
882
883 NTSTATUS
884 VfatFlushVolume(
885 PDEVICE_EXTENSION DeviceExt,
886 PVFATFCB VolumeFcb);
887
888 /* fsctl.c */
889
890 NTSTATUS
891 VfatFileSystemControl(
892 PVFAT_IRP_CONTEXT IrpContext);
893
894 /* iface.c */
895
896 NTSTATUS
897 NTAPI
898 DriverEntry(
899 PDRIVER_OBJECT DriverObject,
900 PUNICODE_STRING RegistryPath);
901
902
903 /* misc.c */
904
905 NTSTATUS
906 VfatQueueRequest(
907 PVFAT_IRP_CONTEXT IrpContext);
908
909 PVFAT_IRP_CONTEXT
910 VfatAllocateIrpContext(
911 PDEVICE_OBJECT DeviceObject,
912 PIRP Irp);
913
914 VOID
915 VfatFreeIrpContext(
916 PVFAT_IRP_CONTEXT IrpContext);
917
918 DRIVER_DISPATCH
919 VfatBuildRequest;
920
921 NTSTATUS
922 NTAPI
923 VfatBuildRequest(
924 PDEVICE_OBJECT DeviceObject,
925 PIRP Irp);
926
927 PVOID
928 VfatGetUserBuffer(
929 IN PIRP);
930
931 NTSTATUS
932 VfatLockUserBuffer(
933 IN PIRP,
934 IN ULONG,
935 IN LOCK_OPERATION);
936
937 BOOLEAN
938 VfatCheckForDismount(
939 IN PDEVICE_EXTENSION DeviceExt,
940 IN BOOLEAN Create);
941
942 /* pnp.c */
943
944 NTSTATUS
945 VfatPnp(
946 PVFAT_IRP_CONTEXT IrpContext);
947
948 /* rw.c */
949
950 NTSTATUS
951 VfatRead(
952 PVFAT_IRP_CONTEXT IrpContext);
953
954 NTSTATUS
955 VfatWrite(
956 PVFAT_IRP_CONTEXT IrpContext);
957
958 NTSTATUS
959 NextCluster(
960 PDEVICE_EXTENSION DeviceExt,
961 ULONG FirstCluster,
962 PULONG CurrentCluster,
963 BOOLEAN Extend);
964
965 /* shutdown.c */
966
967 DRIVER_DISPATCH
968 VfatShutdown;
969
970 NTSTATUS
971 NTAPI
972 VfatShutdown(
973 PDEVICE_OBJECT DeviceObject,
974 PIRP Irp);
975
976 /* string.c */
977
978 VOID
979 vfatSplitPathName(
980 PUNICODE_STRING PathNameU,
981 PUNICODE_STRING DirNameU,
982 PUNICODE_STRING FileNameU);
983
984 BOOLEAN
985 vfatIsLongIllegal(
986 WCHAR c);
987
988 BOOLEAN
989 wstrcmpjoki(
990 PWSTR s1,
991 PWSTR s2);
992
993 /* volume.c */
994
995 NTSTATUS
996 VfatQueryVolumeInformation(
997 PVFAT_IRP_CONTEXT IrpContext);
998
999 NTSTATUS
1000 VfatSetVolumeInformation(
1001 PVFAT_IRP_CONTEXT IrpContext);
1002
1003 #endif /* _FASTFAT_PCH_ */