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