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