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