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