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