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