c35b73540b6e58e7f5a8e837164169dd0688f8d1
[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
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
300 /* Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP */
301 ULONG OpenHandleCount;
302 } DEVICE_EXTENSION, VCB, *PVCB;
303
304 typedef struct
305 {
306 PDRIVER_OBJECT DriverObject;
307 PDEVICE_OBJECT DeviceObject;
308 ULONG Flags;
309 ERESOURCE VolumeListLock;
310 LIST_ENTRY VolumeListHead;
311 NPAGED_LOOKASIDE_LIST FcbLookasideList;
312 NPAGED_LOOKASIDE_LIST CcbLookasideList;
313 NPAGED_LOOKASIDE_LIST IrpContextLookasideList;
314 FAST_IO_DISPATCH FastIoDispatch;
315 CACHE_MANAGER_CALLBACKS CacheMgrCallbacks;
316 } VFAT_GLOBAL_DATA, *PVFAT_GLOBAL_DATA;
317
318 extern PVFAT_GLOBAL_DATA VfatGlobalData;
319
320 #define FCB_CACHE_INITIALIZED 0x0001
321 #define FCB_DELETE_PENDING 0x0002
322 #define FCB_IS_FAT 0x0004
323 #define FCB_IS_PAGE_FILE 0x0008
324 #define FCB_IS_VOLUME 0x0010
325 #define FCB_IS_DIRTY 0x0020
326 #define FCB_IS_FATX_ENTRY 0x0040
327
328 typedef struct _VFATFCB
329 {
330 /* FCB header required by ROS/NT */
331 FSRTL_COMMON_FCB_HEADER RFCB;
332 SECTION_OBJECT_POINTERS SectionObjectPointers;
333 ERESOURCE MainResource;
334 ERESOURCE PagingIoResource;
335 /* end FCB header required by ROS/NT */
336
337 /* directory entry for this file or directory */
338 DIR_ENTRY entry;
339
340 /* Pointer to attributes in entry */
341 PUCHAR Attributes;
342
343 /* long file name, points into PathNameBuffer */
344 UNICODE_STRING LongNameU;
345
346 /* short file name */
347 UNICODE_STRING ShortNameU;
348
349 /* directory name, points into PathNameBuffer */
350 UNICODE_STRING DirNameU;
351
352 /* path + long file name 260 max*/
353 UNICODE_STRING PathNameU;
354
355 /* buffer for PathNameU */
356 PWCHAR PathNameBuffer;
357
358 /* buffer for ShortNameU */
359 WCHAR ShortNameBuffer[13];
360
361 /* */
362 LONG RefCount;
363
364 /* List of FCB's for this volume */
365 LIST_ENTRY FcbListEntry;
366
367 /* pointer to the parent fcb */
368 struct _VFATFCB *parentFcb;
369
370 /* Flags for the fcb */
371 ULONG Flags;
372
373 /* pointer to the file object which has initialized the fcb */
374 PFILE_OBJECT FileObject;
375
376 /* Directory index for the short name entry */
377 ULONG dirIndex;
378
379 /* Directory index where the long name starts */
380 ULONG startIndex;
381
382 /* Share access for the file object */
383 SHARE_ACCESS FCBShareAccess;
384
385 /* Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP */
386 ULONG OpenHandleCount;
387
388 /* Entry into the hash table for the path + long name */
389 HASHENTRY Hash;
390
391 /* Entry into the hash table for the path + short name */
392 HASHENTRY ShortHash;
393
394 /* List of byte-range locks for this file */
395 FILE_LOCK FileLock;
396
397 /*
398 * Optimalization: caching of last read/write cluster+offset pair. Can't
399 * be in VFATCCB because it must be reset everytime the allocated clusters
400 * change.
401 */
402 FAST_MUTEX LastMutex;
403 ULONG LastCluster;
404 ULONG LastOffset;
405 } VFATFCB, *PVFATFCB;
406
407 typedef struct _VFATCCB
408 {
409 LARGE_INTEGER CurrentByteOffset;
410 /* for DirectoryControl */
411 ULONG Entry;
412 /* for DirectoryControl */
413 UNICODE_STRING SearchPattern;
414 } VFATCCB, *PVFATCCB;
415
416 #define TAG_CCB 'BCCV'
417 #define TAG_FCB 'BCFV'
418 #define TAG_IRP 'PRIV'
419 #define TAG_VFAT 'TAFV'
420
421 #define ENTRIES_PER_SECTOR (BLOCKSIZE / sizeof(FATDirEntry))
422
423 typedef struct __DOSTIME
424 {
425 USHORT Second:5;
426 USHORT Minute:6;
427 USHORT Hour:5;
428 }
429 DOSTIME, *PDOSTIME;
430
431 typedef struct __DOSDATE
432 {
433 USHORT Day:5;
434 USHORT Month:4;
435 USHORT Year:7;
436 }
437 DOSDATE, *PDOSDATE;
438
439 #define IRPCONTEXT_CANWAIT 0x0001
440 #define IRPCONTEXT_PENDINGRETURNED 0x0002
441
442 typedef struct
443 {
444 PIRP Irp;
445 PDEVICE_OBJECT DeviceObject;
446 PDEVICE_EXTENSION DeviceExt;
447 ULONG Flags;
448 WORK_QUEUE_ITEM WorkQueueItem;
449 PIO_STACK_LOCATION Stack;
450 UCHAR MajorFunction;
451 UCHAR MinorFunction;
452 PFILE_OBJECT FileObject;
453 ULONG RefCount;
454 KEVENT Event;
455 } VFAT_IRP_CONTEXT, *PVFAT_IRP_CONTEXT;
456
457 typedef struct _VFAT_DIRENTRY_CONTEXT
458 {
459 ULONG StartIndex;
460 ULONG DirIndex;
461 DIR_ENTRY DirEntry;
462 UNICODE_STRING LongNameU;
463 UNICODE_STRING ShortNameU;
464 } VFAT_DIRENTRY_CONTEXT, *PVFAT_DIRENTRY_CONTEXT;
465
466 typedef struct _VFAT_MOVE_CONTEXT
467 {
468 ULONG FirstCluster;
469 ULONG FileSize;
470 USHORT CreationDate;
471 USHORT CreationTime;
472 } VFAT_MOVE_CONTEXT, *PVFAT_MOVE_CONTEXT;
473
474 /* blockdev.c */
475
476 NTSTATUS
477 VfatReadDisk(
478 IN PDEVICE_OBJECT pDeviceObject,
479 IN PLARGE_INTEGER ReadOffset,
480 IN ULONG ReadLength,
481 IN PUCHAR Buffer,
482 IN BOOLEAN Override);
483
484 NTSTATUS
485 VfatReadDiskPartial(
486 IN PVFAT_IRP_CONTEXT IrpContext,
487 IN PLARGE_INTEGER ReadOffset,
488 IN ULONG ReadLength,
489 IN ULONG BufferOffset,
490 IN BOOLEAN Wait);
491
492 NTSTATUS
493 VfatWriteDiskPartial(
494 IN PVFAT_IRP_CONTEXT IrpContext,
495 IN PLARGE_INTEGER WriteOffset,
496 IN ULONG WriteLength,
497 IN ULONG BufferOffset,
498 IN BOOLEAN Wait);
499
500 NTSTATUS
501 VfatBlockDeviceIoControl(
502 IN PDEVICE_OBJECT DeviceObject,
503 IN ULONG CtlCode,
504 IN PVOID InputBuffer,
505 IN ULONG InputBufferSize,
506 IN OUT PVOID OutputBuffer,
507 IN OUT PULONG pOutputBufferSize,
508 IN BOOLEAN Override);
509
510 /* cleanup.c */
511
512 NTSTATUS
513 VfatCleanup(
514 PVFAT_IRP_CONTEXT IrpContext);
515
516 /* close.c */
517
518 NTSTATUS
519 VfatClose(
520 PVFAT_IRP_CONTEXT IrpContext);
521
522 NTSTATUS
523 VfatCloseFile(
524 PDEVICE_EXTENSION DeviceExt,
525 PFILE_OBJECT FileObject);
526
527 /* create.c */
528
529 NTSTATUS
530 VfatCreate(
531 PVFAT_IRP_CONTEXT IrpContext);
532
533 NTSTATUS
534 FindFile(
535 PDEVICE_EXTENSION DeviceExt,
536 PVFATFCB Parent,
537 PUNICODE_STRING FileToFindU,
538 PVFAT_DIRENTRY_CONTEXT DirContext,
539 BOOLEAN First);
540
541 VOID
542 vfat8Dot3ToString(
543 PFAT_DIR_ENTRY pEntry,
544 PUNICODE_STRING NameU);
545
546 NTSTATUS
547 ReadVolumeLabel(
548 PDEVICE_EXTENSION DeviceExt,
549 PVPB Vpb);
550
551 /* dir.c */
552
553 NTSTATUS
554 VfatDirectoryControl(
555 PVFAT_IRP_CONTEXT IrpContext);
556
557 BOOLEAN
558 FsdDosDateTimeToSystemTime(
559 PDEVICE_EXTENSION DeviceExt,
560 USHORT DosDate,
561 USHORT DosTime,
562 PLARGE_INTEGER SystemTime);
563
564 BOOLEAN
565 FsdSystemTimeToDosDateTime(
566 PDEVICE_EXTENSION DeviceExt,
567 PLARGE_INTEGER SystemTime,
568 USHORT *pDosDate,
569 USHORT *pDosTime);
570
571 /* direntry.c */
572
573 ULONG
574 vfatDirEntryGetFirstCluster(
575 PDEVICE_EXTENSION pDeviceExt,
576 PDIR_ENTRY pDirEntry);
577
578 BOOLEAN
579 VfatIsDirectoryEmpty(
580 PVFATFCB Fcb);
581
582 NTSTATUS
583 FATGetNextDirEntry(
584 PVOID *pContext,
585 PVOID *pPage,
586 IN PVFATFCB pDirFcb,
587 IN PVFAT_DIRENTRY_CONTEXT DirContext,
588 BOOLEAN First);
589
590 NTSTATUS
591 FATXGetNextDirEntry(
592 PVOID *pContext,
593 PVOID *pPage,
594 IN PVFATFCB pDirFcb,
595 IN PVFAT_DIRENTRY_CONTEXT DirContext,
596 BOOLEAN First);
597
598 /* dirwr.c */
599
600 NTSTATUS
601 VfatAddEntry(
602 PDEVICE_EXTENSION DeviceExt,
603 PUNICODE_STRING PathNameU,
604 PVFATFCB* Fcb,
605 PVFATFCB ParentFcb,
606 ULONG RequestedOptions,
607 UCHAR ReqAttr,
608 PVFAT_MOVE_CONTEXT MoveContext);
609
610 NTSTATUS
611 VfatUpdateEntry(
612 PVFATFCB pFcb);
613
614 NTSTATUS
615 VfatDelEntry(
616 PDEVICE_EXTENSION,
617 PVFATFCB,
618 PVFAT_MOVE_CONTEXT);
619
620 BOOLEAN
621 vfatFindDirSpace(
622 PDEVICE_EXTENSION DeviceExt,
623 PVFATFCB pDirFcb,
624 ULONG nbSlots,
625 PULONG start);
626
627 NTSTATUS
628 vfatRenameEntry(
629 IN PDEVICE_EXTENSION DeviceExt,
630 IN PVFATFCB pFcb,
631 IN PUNICODE_STRING FileName,
632 IN BOOLEAN CaseChangeOnly);
633
634 NTSTATUS
635 VfatMoveEntry(
636 IN PDEVICE_EXTENSION DeviceExt,
637 IN PVFATFCB pFcb,
638 IN PUNICODE_STRING FileName,
639 IN PVFATFCB ParentFcb);
640
641 /* ea.h */
642
643 NTSTATUS
644 VfatSetExtendedAttributes(
645 PFILE_OBJECT FileObject,
646 PVOID Ea,
647 ULONG EaLength);
648
649 /* fastio.c */
650
651 VOID
652 VfatInitFastIoRoutines(
653 PFAST_IO_DISPATCH FastIoDispatch);
654
655 BOOLEAN
656 NTAPI
657 VfatAcquireForLazyWrite(
658 IN PVOID Context,
659 IN BOOLEAN Wait);
660
661 VOID
662 NTAPI
663 VfatReleaseFromLazyWrite(
664 IN PVOID Context);
665
666 BOOLEAN
667 NTAPI
668 VfatAcquireForReadAhead(
669 IN PVOID Context,
670 IN BOOLEAN Wait);
671
672 VOID
673 NTAPI
674 VfatReleaseFromReadAhead(
675 IN PVOID Context);
676
677 /* fat.c */
678
679 NTSTATUS
680 FAT12GetNextCluster(
681 PDEVICE_EXTENSION DeviceExt,
682 ULONG CurrentCluster,
683 PULONG NextCluster);
684
685 NTSTATUS
686 FAT12FindAndMarkAvailableCluster(
687 PDEVICE_EXTENSION DeviceExt,
688 PULONG Cluster);
689
690 NTSTATUS
691 FAT12WriteCluster(
692 PDEVICE_EXTENSION DeviceExt,
693 ULONG ClusterToWrite,
694 ULONG NewValue,
695 PULONG OldValue);
696
697 NTSTATUS
698 FAT16GetNextCluster(
699 PDEVICE_EXTENSION DeviceExt,
700 ULONG CurrentCluster,
701 PULONG NextCluster);
702
703 NTSTATUS
704 FAT16FindAndMarkAvailableCluster(
705 PDEVICE_EXTENSION DeviceExt,
706 PULONG Cluster);
707
708 NTSTATUS
709 FAT16WriteCluster(
710 PDEVICE_EXTENSION DeviceExt,
711 ULONG ClusterToWrite,
712 ULONG NewValue,
713 PULONG OldValue);
714
715 NTSTATUS
716 FAT32GetNextCluster(
717 PDEVICE_EXTENSION DeviceExt,
718 ULONG CurrentCluster,
719 PULONG NextCluster);
720
721 NTSTATUS
722 FAT32FindAndMarkAvailableCluster(
723 PDEVICE_EXTENSION DeviceExt,
724 PULONG Cluster);
725
726 NTSTATUS
727 FAT32WriteCluster(
728 PDEVICE_EXTENSION DeviceExt,
729 ULONG ClusterToWrite,
730 ULONG NewValue,
731 PULONG OldValue);
732
733 NTSTATUS
734 OffsetToCluster(
735 PDEVICE_EXTENSION DeviceExt,
736 ULONG FirstCluster,
737 ULONG FileOffset,
738 PULONG Cluster,
739 BOOLEAN Extend);
740
741 ULONGLONG
742 ClusterToSector(
743 PDEVICE_EXTENSION DeviceExt,
744 ULONG Cluster);
745
746 NTSTATUS
747 GetNextCluster(
748 PDEVICE_EXTENSION DeviceExt,
749 ULONG CurrentCluster,
750 PULONG NextCluster);
751
752 NTSTATUS
753 GetNextClusterExtend(
754 PDEVICE_EXTENSION DeviceExt,
755 ULONG CurrentCluster,
756 PULONG NextCluster);
757
758 NTSTATUS
759 CountAvailableClusters(
760 PDEVICE_EXTENSION DeviceExt,
761 PLARGE_INTEGER Clusters);
762
763 NTSTATUS
764 WriteCluster(
765 PDEVICE_EXTENSION DeviceExt,
766 ULONG ClusterToWrite,
767 ULONG NewValue);
768
769 /* fcb.c */
770
771 PVFATFCB
772 vfatNewFCB(
773 PDEVICE_EXTENSION pVCB,
774 PUNICODE_STRING pFileNameU);
775
776 NTSTATUS
777 vfatUpdateFCB(
778 PDEVICE_EXTENSION pVCB,
779 PVFATFCB Fcb,
780 PUNICODE_STRING LongName,
781 PUNICODE_STRING ShortName,
782 PVFATFCB ParentFcb);
783
784 VOID
785 vfatDestroyFCB(
786 PVFATFCB pFCB);
787
788 VOID
789 vfatDestroyCCB(
790 PVFATCCB pCcb);
791
792 VOID
793 vfatGrabFCB(
794 PDEVICE_EXTENSION pVCB,
795 PVFATFCB pFCB);
796
797 VOID
798 vfatReleaseFCB(
799 PDEVICE_EXTENSION pVCB,
800 PVFATFCB pFCB);
801
802 PVFATFCB
803 vfatGrabFCBFromTable(
804 PDEVICE_EXTENSION pDeviceExt,
805 PUNICODE_STRING pFileNameU);
806
807 PVFATFCB
808 vfatMakeRootFCB(
809 PDEVICE_EXTENSION pVCB);
810
811 PVFATFCB
812 vfatOpenRootFCB(
813 PDEVICE_EXTENSION pVCB);
814
815 BOOLEAN
816 vfatFCBIsDirectory(
817 PVFATFCB FCB);
818
819 BOOLEAN
820 vfatFCBIsRoot(
821 PVFATFCB FCB);
822
823 NTSTATUS
824 vfatAttachFCBToFileObject(
825 PDEVICE_EXTENSION vcb,
826 PVFATFCB fcb,
827 PFILE_OBJECT fileObject);
828
829 NTSTATUS
830 vfatDirFindFile(
831 PDEVICE_EXTENSION pVCB,
832 PVFATFCB parentFCB,
833 PUNICODE_STRING FileToFindU,
834 PVFATFCB *fileFCB);
835
836 NTSTATUS
837 vfatGetFCBForFile(
838 PDEVICE_EXTENSION pVCB,
839 PVFATFCB *pParentFCB,
840 PVFATFCB *pFCB,
841 PUNICODE_STRING pFileNameU);
842
843 NTSTATUS
844 vfatMakeFCBFromDirEntry(
845 PVCB vcb,
846 PVFATFCB directoryFCB,
847 PVFAT_DIRENTRY_CONTEXT DirContext,
848 PVFATFCB *fileFCB);
849
850 /* finfo.c */
851
852 NTSTATUS
853 VfatQueryInformation(
854 PVFAT_IRP_CONTEXT IrpContext);
855
856 NTSTATUS
857 VfatSetInformation(
858 PVFAT_IRP_CONTEXT IrpContext);
859
860 NTSTATUS
861 VfatSetAllocationSizeInformation(
862 PFILE_OBJECT FileObject,
863 PVFATFCB Fcb,
864 PDEVICE_EXTENSION DeviceExt,
865 PLARGE_INTEGER AllocationSize);
866
867 /* flush.c */
868
869 NTSTATUS
870 VfatFlush(
871 PVFAT_IRP_CONTEXT IrpContext);
872
873 NTSTATUS
874 VfatFlushVolume(
875 PDEVICE_EXTENSION DeviceExt,
876 PVFATFCB VolumeFcb);
877
878 /* fsctl.c */
879
880 NTSTATUS
881 VfatFileSystemControl(
882 PVFAT_IRP_CONTEXT IrpContext);
883
884 /* iface.c */
885
886 NTSTATUS
887 NTAPI
888 DriverEntry(
889 PDRIVER_OBJECT DriverObject,
890 PUNICODE_STRING RegistryPath);
891
892
893 /* misc.c */
894
895 NTSTATUS
896 VfatQueueRequest(
897 PVFAT_IRP_CONTEXT IrpContext);
898
899 PVFAT_IRP_CONTEXT
900 VfatAllocateIrpContext(
901 PDEVICE_OBJECT DeviceObject,
902 PIRP Irp);
903
904 VOID
905 VfatFreeIrpContext(
906 PVFAT_IRP_CONTEXT IrpContext);
907
908 DRIVER_DISPATCH
909 VfatBuildRequest;
910
911 NTSTATUS
912 NTAPI
913 VfatBuildRequest(
914 PDEVICE_OBJECT DeviceObject,
915 PIRP Irp);
916
917 PVOID
918 VfatGetUserBuffer(
919 IN PIRP);
920
921 NTSTATUS
922 VfatLockUserBuffer(
923 IN PIRP,
924 IN ULONG,
925 IN LOCK_OPERATION);
926
927 /* pnp.c */
928
929 NTSTATUS
930 VfatPnp(
931 PVFAT_IRP_CONTEXT IrpContext);
932
933 /* rw.c */
934
935 NTSTATUS
936 VfatRead(
937 PVFAT_IRP_CONTEXT IrpContext);
938
939 NTSTATUS
940 VfatWrite(
941 PVFAT_IRP_CONTEXT IrpContext);
942
943 NTSTATUS
944 NextCluster(
945 PDEVICE_EXTENSION DeviceExt,
946 ULONG FirstCluster,
947 PULONG CurrentCluster,
948 BOOLEAN Extend);
949
950 /* shutdown.c */
951
952 DRIVER_DISPATCH
953 VfatShutdown;
954
955 NTSTATUS
956 NTAPI
957 VfatShutdown(
958 PDEVICE_OBJECT DeviceObject,
959 PIRP Irp);
960
961 /* string.c */
962
963 VOID
964 vfatSplitPathName(
965 PUNICODE_STRING PathNameU,
966 PUNICODE_STRING DirNameU,
967 PUNICODE_STRING FileNameU);
968
969 BOOLEAN
970 vfatIsLongIllegal(
971 WCHAR c);
972
973 BOOLEAN
974 wstrcmpjoki(
975 PWSTR s1,
976 PWSTR s2);
977
978 /* volume.c */
979
980 NTSTATUS
981 VfatQueryVolumeInformation(
982 PVFAT_IRP_CONTEXT IrpContext);
983
984 NTSTATUS
985 VfatSetVolumeInformation(
986 PVFAT_IRP_CONTEXT IrpContext);
987
988 #endif /* _FASTFAT_PCH_ */