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