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