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