2c4a6afb519c39b27a8cb564c22a1f1bff8ab716
[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_COMPLETE 0x0002
451 #define IRPCONTEXT_QUEUE 0x0004
452 #define IRPCONTEXT_PENDINGRETURNED 0x0008
453
454 typedef struct
455 {
456 PIRP Irp;
457 PDEVICE_OBJECT DeviceObject;
458 PDEVICE_EXTENSION DeviceExt;
459 ULONG Flags;
460 WORK_QUEUE_ITEM WorkQueueItem;
461 PIO_STACK_LOCATION Stack;
462 UCHAR MajorFunction;
463 UCHAR MinorFunction;
464 PFILE_OBJECT FileObject;
465 ULONG RefCount;
466 KEVENT Event;
467 CCHAR PriorityBoost;
468 } VFAT_IRP_CONTEXT, *PVFAT_IRP_CONTEXT;
469
470 typedef struct _VFAT_DIRENTRY_CONTEXT
471 {
472 ULONG StartIndex;
473 ULONG DirIndex;
474 DIR_ENTRY DirEntry;
475 UNICODE_STRING LongNameU;
476 UNICODE_STRING ShortNameU;
477 } VFAT_DIRENTRY_CONTEXT, *PVFAT_DIRENTRY_CONTEXT;
478
479 typedef struct _VFAT_MOVE_CONTEXT
480 {
481 ULONG FirstCluster;
482 ULONG FileSize;
483 USHORT CreationDate;
484 USHORT CreationTime;
485 } VFAT_MOVE_CONTEXT, *PVFAT_MOVE_CONTEXT;
486
487 FORCEINLINE
488 NTSTATUS
489 VfatMarkIrpContextForQueue(PVFAT_IRP_CONTEXT IrpContext)
490 {
491 PULONG Flags = &IrpContext->Flags;
492
493 *Flags &= ~IRPCONTEXT_COMPLETE;
494 *Flags |= IRPCONTEXT_QUEUE;
495
496 return STATUS_PENDING;
497 }
498
499 /* blockdev.c */
500
501 NTSTATUS
502 VfatReadDisk(
503 IN PDEVICE_OBJECT pDeviceObject,
504 IN PLARGE_INTEGER ReadOffset,
505 IN ULONG ReadLength,
506 IN PUCHAR Buffer,
507 IN BOOLEAN Override);
508
509 NTSTATUS
510 VfatReadDiskPartial(
511 IN PVFAT_IRP_CONTEXT IrpContext,
512 IN PLARGE_INTEGER ReadOffset,
513 IN ULONG ReadLength,
514 IN ULONG BufferOffset,
515 IN BOOLEAN Wait);
516
517 NTSTATUS
518 VfatWriteDiskPartial(
519 IN PVFAT_IRP_CONTEXT IrpContext,
520 IN PLARGE_INTEGER WriteOffset,
521 IN ULONG WriteLength,
522 IN ULONG BufferOffset,
523 IN BOOLEAN Wait);
524
525 NTSTATUS
526 VfatBlockDeviceIoControl(
527 IN PDEVICE_OBJECT DeviceObject,
528 IN ULONG CtlCode,
529 IN PVOID InputBuffer,
530 IN ULONG InputBufferSize,
531 IN OUT PVOID OutputBuffer,
532 IN OUT PULONG pOutputBufferSize,
533 IN BOOLEAN Override);
534
535 /* cleanup.c */
536
537 NTSTATUS
538 VfatCleanup(
539 PVFAT_IRP_CONTEXT IrpContext);
540
541 /* close.c */
542
543 NTSTATUS
544 VfatClose(
545 PVFAT_IRP_CONTEXT IrpContext);
546
547 NTSTATUS
548 VfatCloseFile(
549 PDEVICE_EXTENSION DeviceExt,
550 PFILE_OBJECT FileObject);
551
552 /* create.c */
553
554 NTSTATUS
555 VfatCreate(
556 PVFAT_IRP_CONTEXT IrpContext);
557
558 NTSTATUS
559 FindFile(
560 PDEVICE_EXTENSION DeviceExt,
561 PVFATFCB Parent,
562 PUNICODE_STRING FileToFindU,
563 PVFAT_DIRENTRY_CONTEXT DirContext,
564 BOOLEAN First);
565
566 VOID
567 vfat8Dot3ToString(
568 PFAT_DIR_ENTRY pEntry,
569 PUNICODE_STRING NameU);
570
571 NTSTATUS
572 ReadVolumeLabel(
573 PDEVICE_EXTENSION DeviceExt,
574 PVPB Vpb);
575
576 /* dir.c */
577
578 NTSTATUS
579 VfatDirectoryControl(
580 PVFAT_IRP_CONTEXT IrpContext);
581
582 BOOLEAN
583 FsdDosDateTimeToSystemTime(
584 PDEVICE_EXTENSION DeviceExt,
585 USHORT DosDate,
586 USHORT DosTime,
587 PLARGE_INTEGER SystemTime);
588
589 BOOLEAN
590 FsdSystemTimeToDosDateTime(
591 PDEVICE_EXTENSION DeviceExt,
592 PLARGE_INTEGER SystemTime,
593 USHORT *pDosDate,
594 USHORT *pDosTime);
595
596 /* direntry.c */
597
598 ULONG
599 vfatDirEntryGetFirstCluster(
600 PDEVICE_EXTENSION pDeviceExt,
601 PDIR_ENTRY pDirEntry);
602
603 BOOLEAN
604 VfatIsDirectoryEmpty(
605 PVFATFCB Fcb);
606
607 NTSTATUS
608 FATGetNextDirEntry(
609 PVOID *pContext,
610 PVOID *pPage,
611 IN PVFATFCB pDirFcb,
612 IN PVFAT_DIRENTRY_CONTEXT DirContext,
613 BOOLEAN First);
614
615 NTSTATUS
616 FATXGetNextDirEntry(
617 PVOID *pContext,
618 PVOID *pPage,
619 IN PVFATFCB pDirFcb,
620 IN PVFAT_DIRENTRY_CONTEXT DirContext,
621 BOOLEAN First);
622
623 /* dirwr.c */
624
625 NTSTATUS
626 VfatAddEntry(
627 PDEVICE_EXTENSION DeviceExt,
628 PUNICODE_STRING PathNameU,
629 PVFATFCB* Fcb,
630 PVFATFCB ParentFcb,
631 ULONG RequestedOptions,
632 UCHAR ReqAttr,
633 PVFAT_MOVE_CONTEXT MoveContext);
634
635 NTSTATUS
636 VfatUpdateEntry(
637 PVFATFCB pFcb);
638
639 NTSTATUS
640 VfatDelEntry(
641 PDEVICE_EXTENSION,
642 PVFATFCB,
643 PVFAT_MOVE_CONTEXT);
644
645 BOOLEAN
646 vfatFindDirSpace(
647 PDEVICE_EXTENSION DeviceExt,
648 PVFATFCB pDirFcb,
649 ULONG nbSlots,
650 PULONG start);
651
652 NTSTATUS
653 vfatRenameEntry(
654 IN PDEVICE_EXTENSION DeviceExt,
655 IN PVFATFCB pFcb,
656 IN PUNICODE_STRING FileName,
657 IN BOOLEAN CaseChangeOnly);
658
659 NTSTATUS
660 VfatMoveEntry(
661 IN PDEVICE_EXTENSION DeviceExt,
662 IN PVFATFCB pFcb,
663 IN PUNICODE_STRING FileName,
664 IN PVFATFCB ParentFcb);
665
666 /* ea.h */
667
668 NTSTATUS
669 VfatSetExtendedAttributes(
670 PFILE_OBJECT FileObject,
671 PVOID Ea,
672 ULONG EaLength);
673
674 /* fastio.c */
675
676 VOID
677 VfatInitFastIoRoutines(
678 PFAST_IO_DISPATCH FastIoDispatch);
679
680 BOOLEAN
681 NTAPI
682 VfatAcquireForLazyWrite(
683 IN PVOID Context,
684 IN BOOLEAN Wait);
685
686 VOID
687 NTAPI
688 VfatReleaseFromLazyWrite(
689 IN PVOID Context);
690
691 BOOLEAN
692 NTAPI
693 VfatAcquireForReadAhead(
694 IN PVOID Context,
695 IN BOOLEAN Wait);
696
697 VOID
698 NTAPI
699 VfatReleaseFromReadAhead(
700 IN PVOID Context);
701
702 /* fat.c */
703
704 NTSTATUS
705 FAT12GetNextCluster(
706 PDEVICE_EXTENSION DeviceExt,
707 ULONG CurrentCluster,
708 PULONG NextCluster);
709
710 NTSTATUS
711 FAT12FindAndMarkAvailableCluster(
712 PDEVICE_EXTENSION DeviceExt,
713 PULONG Cluster);
714
715 NTSTATUS
716 FAT12WriteCluster(
717 PDEVICE_EXTENSION DeviceExt,
718 ULONG ClusterToWrite,
719 ULONG NewValue,
720 PULONG OldValue);
721
722 NTSTATUS
723 FAT16GetNextCluster(
724 PDEVICE_EXTENSION DeviceExt,
725 ULONG CurrentCluster,
726 PULONG NextCluster);
727
728 NTSTATUS
729 FAT16FindAndMarkAvailableCluster(
730 PDEVICE_EXTENSION DeviceExt,
731 PULONG Cluster);
732
733 NTSTATUS
734 FAT16WriteCluster(
735 PDEVICE_EXTENSION DeviceExt,
736 ULONG ClusterToWrite,
737 ULONG NewValue,
738 PULONG OldValue);
739
740 NTSTATUS
741 FAT32GetNextCluster(
742 PDEVICE_EXTENSION DeviceExt,
743 ULONG CurrentCluster,
744 PULONG NextCluster);
745
746 NTSTATUS
747 FAT32FindAndMarkAvailableCluster(
748 PDEVICE_EXTENSION DeviceExt,
749 PULONG Cluster);
750
751 NTSTATUS
752 FAT32WriteCluster(
753 PDEVICE_EXTENSION DeviceExt,
754 ULONG ClusterToWrite,
755 ULONG NewValue,
756 PULONG OldValue);
757
758 NTSTATUS
759 OffsetToCluster(
760 PDEVICE_EXTENSION DeviceExt,
761 ULONG FirstCluster,
762 ULONG FileOffset,
763 PULONG Cluster,
764 BOOLEAN Extend);
765
766 ULONGLONG
767 ClusterToSector(
768 PDEVICE_EXTENSION DeviceExt,
769 ULONG Cluster);
770
771 NTSTATUS
772 GetNextCluster(
773 PDEVICE_EXTENSION DeviceExt,
774 ULONG CurrentCluster,
775 PULONG NextCluster);
776
777 NTSTATUS
778 GetNextClusterExtend(
779 PDEVICE_EXTENSION DeviceExt,
780 ULONG CurrentCluster,
781 PULONG NextCluster);
782
783 NTSTATUS
784 CountAvailableClusters(
785 PDEVICE_EXTENSION DeviceExt,
786 PLARGE_INTEGER Clusters);
787
788 NTSTATUS
789 WriteCluster(
790 PDEVICE_EXTENSION DeviceExt,
791 ULONG ClusterToWrite,
792 ULONG NewValue);
793
794 /* fcb.c */
795
796 PVFATFCB
797 vfatNewFCB(
798 PDEVICE_EXTENSION pVCB,
799 PUNICODE_STRING pFileNameU);
800
801 NTSTATUS
802 vfatUpdateFCB(
803 PDEVICE_EXTENSION pVCB,
804 PVFATFCB Fcb,
805 PUNICODE_STRING LongName,
806 PUNICODE_STRING ShortName,
807 PVFATFCB ParentFcb);
808
809 VOID
810 vfatDestroyFCB(
811 PVFATFCB pFCB);
812
813 VOID
814 vfatDestroyCCB(
815 PVFATCCB pCcb);
816
817 VOID
818 vfatGrabFCB(
819 PDEVICE_EXTENSION pVCB,
820 PVFATFCB pFCB);
821
822 VOID
823 vfatReleaseFCB(
824 PDEVICE_EXTENSION pVCB,
825 PVFATFCB pFCB);
826
827 PVFATFCB
828 vfatGrabFCBFromTable(
829 PDEVICE_EXTENSION pDeviceExt,
830 PUNICODE_STRING pFileNameU);
831
832 PVFATFCB
833 vfatMakeRootFCB(
834 PDEVICE_EXTENSION pVCB);
835
836 PVFATFCB
837 vfatOpenRootFCB(
838 PDEVICE_EXTENSION pVCB);
839
840 BOOLEAN
841 vfatFCBIsDirectory(
842 PVFATFCB FCB);
843
844 BOOLEAN
845 vfatFCBIsRoot(
846 PVFATFCB FCB);
847
848 NTSTATUS
849 vfatAttachFCBToFileObject(
850 PDEVICE_EXTENSION vcb,
851 PVFATFCB fcb,
852 PFILE_OBJECT fileObject);
853
854 NTSTATUS
855 vfatDirFindFile(
856 PDEVICE_EXTENSION pVCB,
857 PVFATFCB parentFCB,
858 PUNICODE_STRING FileToFindU,
859 PVFATFCB *fileFCB);
860
861 NTSTATUS
862 vfatGetFCBForFile(
863 PDEVICE_EXTENSION pVCB,
864 PVFATFCB *pParentFCB,
865 PVFATFCB *pFCB,
866 PUNICODE_STRING pFileNameU);
867
868 NTSTATUS
869 vfatMakeFCBFromDirEntry(
870 PVCB vcb,
871 PVFATFCB directoryFCB,
872 PVFAT_DIRENTRY_CONTEXT DirContext,
873 PVFATFCB *fileFCB);
874
875 /* finfo.c */
876
877 NTSTATUS
878 VfatGetStandardInformation(
879 PVFATFCB FCB,
880 PFILE_STANDARD_INFORMATION StandardInfo,
881 PULONG BufferLength);
882
883 NTSTATUS
884 VfatGetBasicInformation(
885 PFILE_OBJECT FileObject,
886 PVFATFCB FCB,
887 PDEVICE_OBJECT DeviceObject,
888 PFILE_BASIC_INFORMATION BasicInfo,
889 PULONG BufferLength);
890
891 NTSTATUS
892 VfatQueryInformation(
893 PVFAT_IRP_CONTEXT IrpContext);
894
895 NTSTATUS
896 VfatSetInformation(
897 PVFAT_IRP_CONTEXT IrpContext);
898
899 NTSTATUS
900 VfatSetAllocationSizeInformation(
901 PFILE_OBJECT FileObject,
902 PVFATFCB Fcb,
903 PDEVICE_EXTENSION DeviceExt,
904 PLARGE_INTEGER AllocationSize);
905
906 /* flush.c */
907
908 NTSTATUS
909 VfatFlush(
910 PVFAT_IRP_CONTEXT IrpContext);
911
912 NTSTATUS
913 VfatFlushVolume(
914 PDEVICE_EXTENSION DeviceExt,
915 PVFATFCB VolumeFcb);
916
917 /* fsctl.c */
918
919 NTSTATUS
920 VfatFileSystemControl(
921 PVFAT_IRP_CONTEXT IrpContext);
922
923 /* iface.c */
924
925 NTSTATUS
926 NTAPI
927 DriverEntry(
928 PDRIVER_OBJECT DriverObject,
929 PUNICODE_STRING RegistryPath);
930
931
932 /* misc.c */
933
934 DRIVER_DISPATCH
935 VfatBuildRequest;
936
937 NTSTATUS
938 NTAPI
939 VfatBuildRequest(
940 PDEVICE_OBJECT DeviceObject,
941 PIRP Irp);
942
943 PVOID
944 VfatGetUserBuffer(
945 IN PIRP,
946 IN BOOLEAN Paging);
947
948 NTSTATUS
949 VfatLockUserBuffer(
950 IN PIRP,
951 IN ULONG,
952 IN LOCK_OPERATION);
953
954 BOOLEAN
955 VfatCheckForDismount(
956 IN PDEVICE_EXTENSION DeviceExt,
957 IN BOOLEAN Create);
958
959 /* pnp.c */
960
961 NTSTATUS
962 VfatPnp(
963 PVFAT_IRP_CONTEXT IrpContext);
964
965 /* rw.c */
966
967 NTSTATUS
968 VfatRead(
969 PVFAT_IRP_CONTEXT IrpContext);
970
971 NTSTATUS
972 VfatWrite(
973 PVFAT_IRP_CONTEXT IrpContext);
974
975 NTSTATUS
976 NextCluster(
977 PDEVICE_EXTENSION DeviceExt,
978 ULONG FirstCluster,
979 PULONG CurrentCluster,
980 BOOLEAN Extend);
981
982 /* shutdown.c */
983
984 DRIVER_DISPATCH
985 VfatShutdown;
986
987 NTSTATUS
988 NTAPI
989 VfatShutdown(
990 PDEVICE_OBJECT DeviceObject,
991 PIRP Irp);
992
993 /* string.c */
994
995 VOID
996 vfatSplitPathName(
997 PUNICODE_STRING PathNameU,
998 PUNICODE_STRING DirNameU,
999 PUNICODE_STRING FileNameU);
1000
1001 BOOLEAN
1002 vfatIsLongIllegal(
1003 WCHAR c);
1004
1005 BOOLEAN
1006 wstrcmpjoki(
1007 PWSTR s1,
1008 PWSTR s2);
1009
1010 /* volume.c */
1011
1012 NTSTATUS
1013 VfatQueryVolumeInformation(
1014 PVFAT_IRP_CONTEXT IrpContext);
1015
1016 NTSTATUS
1017 VfatSetVolumeInformation(
1018 PVFAT_IRP_CONTEXT IrpContext);
1019
1020 #endif /* _FASTFAT_PCH_ */