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