- Check that all pins have been closed when the last filter reference is gone
[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 #ifndef TAG
365 #define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
366 #endif
367
368 #define TAG_CCB TAG('V', 'C', 'C', 'B')
369 #define TAG_FCB TAG('V', 'F', 'C', 'B')
370 #define TAG_IRP TAG('V', 'I', 'R', 'P')
371
372 #define ENTRIES_PER_SECTOR (BLOCKSIZE / sizeof(FATDirEntry))
373
374 typedef struct __DOSTIME
375 {
376 USHORT Second:5;
377 USHORT Minute:6;
378 USHORT Hour:5;
379 }
380 DOSTIME, *PDOSTIME;
381
382 typedef struct __DOSDATE
383 {
384 USHORT Day:5;
385 USHORT Month:4;
386 USHORT Year:5;
387 }
388 DOSDATE, *PDOSDATE;
389
390 #define IRPCONTEXT_CANWAIT 0x0001
391 #define IRPCONTEXT_PENDINGRETURNED 0x0002
392
393 typedef struct
394 {
395 PIRP Irp;
396 PDEVICE_OBJECT DeviceObject;
397 PDEVICE_EXTENSION DeviceExt;
398 ULONG Flags;
399 WORK_QUEUE_ITEM WorkQueueItem;
400 PIO_STACK_LOCATION Stack;
401 UCHAR MajorFunction;
402 UCHAR MinorFunction;
403 PFILE_OBJECT FileObject;
404 ULONG RefCount;
405 KEVENT Event;
406 } VFAT_IRP_CONTEXT, *PVFAT_IRP_CONTEXT;
407
408 typedef struct _VFAT_DIRENTRY_CONTEXT
409 {
410 ULONG StartIndex;
411 ULONG DirIndex;
412 DIR_ENTRY DirEntry;
413 UNICODE_STRING LongNameU;
414 UNICODE_STRING ShortNameU;
415 } VFAT_DIRENTRY_CONTEXT, *PVFAT_DIRENTRY_CONTEXT;
416
417
418 /* ------------------------------------------------------ shutdown.c */
419
420 NTSTATUS NTAPI VfatShutdown (PDEVICE_OBJECT DeviceObject,
421 PIRP Irp);
422
423 /* -------------------------------------------------------- volume.c */
424
425 NTSTATUS VfatQueryVolumeInformation (PVFAT_IRP_CONTEXT IrpContext);
426
427 NTSTATUS VfatSetVolumeInformation (PVFAT_IRP_CONTEXT IrpContext);
428
429 /* ------------------------------------------------------ blockdev.c */
430
431 NTSTATUS VfatReadDisk(IN PDEVICE_OBJECT pDeviceObject,
432 IN PLARGE_INTEGER ReadOffset,
433 IN ULONG ReadLength,
434 IN PUCHAR Buffer,
435 IN BOOLEAN Override);
436
437 NTSTATUS VfatReadDiskPartial (IN PVFAT_IRP_CONTEXT IrpContext,
438 IN PLARGE_INTEGER ReadOffset,
439 IN ULONG ReadLength,
440 IN ULONG BufferOffset,
441 IN BOOLEAN Wait);
442
443 NTSTATUS VfatWriteDiskPartial(IN PVFAT_IRP_CONTEXT IrpContext,
444 IN PLARGE_INTEGER WriteOffset,
445 IN ULONG WriteLength,
446 IN ULONG BufferOffset,
447 IN BOOLEAN Wait);
448
449 NTSTATUS VfatBlockDeviceIoControl (IN PDEVICE_OBJECT DeviceObject,
450 IN ULONG CtlCode,
451 IN PVOID InputBuffer,
452 IN ULONG InputBufferSize,
453 IN OUT PVOID OutputBuffer,
454 IN OUT PULONG pOutputBufferSize,
455 IN BOOLEAN Override);
456
457 /* ----------------------------------------------------------- dir.c */
458
459 NTSTATUS VfatDirectoryControl (PVFAT_IRP_CONTEXT);
460
461 BOOLEAN FsdDosDateTimeToSystemTime (PDEVICE_EXTENSION DeviceExt,
462 USHORT DosDate,
463 USHORT DosTime,
464 PLARGE_INTEGER SystemTime);
465
466 BOOLEAN FsdSystemTimeToDosDateTime (PDEVICE_EXTENSION DeviceExt,
467 PLARGE_INTEGER SystemTime,
468 USHORT *pDosDate,
469 USHORT *pDosTime);
470
471 /* -------------------------------------------------------- create.c */
472
473 NTSTATUS VfatCreate (PVFAT_IRP_CONTEXT IrpContext);
474
475 NTSTATUS VfatOpenFile (PDEVICE_EXTENSION DeviceExt,
476 PFILE_OBJECT FileObject,
477 PVFATFCB* parentFcb);
478
479 NTSTATUS FindFile (PDEVICE_EXTENSION DeviceExt,
480 PVFATFCB Parent,
481 PUNICODE_STRING FileToFindU,
482 PVFAT_DIRENTRY_CONTEXT DirContext,
483 BOOLEAN First);
484
485 VOID vfat8Dot3ToString (PFAT_DIR_ENTRY pEntry,
486 PUNICODE_STRING NameU);
487
488 NTSTATUS ReadVolumeLabel(PDEVICE_EXTENSION DeviceExt,
489 PVPB Vpb);
490
491 /* --------------------------------------------------------- close.c */
492
493 NTSTATUS VfatClose (PVFAT_IRP_CONTEXT IrpContext);
494
495 NTSTATUS VfatCloseFile(PDEVICE_EXTENSION DeviceExt,
496 PFILE_OBJECT FileObject);
497
498 /* ------------------------------------------------------- cleanup.c */
499
500 NTSTATUS VfatCleanup (PVFAT_IRP_CONTEXT IrpContext);
501
502 /* --------------------------------------------------------- fastio.c */
503
504 VOID
505 VfatInitFastIoRoutines(PFAST_IO_DISPATCH FastIoDispatch);
506
507 BOOLEAN NTAPI
508 VfatAcquireForLazyWrite(IN PVOID Context,
509 IN BOOLEAN Wait);
510
511 VOID NTAPI
512 VfatReleaseFromLazyWrite(IN PVOID Context);
513
514 BOOLEAN NTAPI
515 VfatAcquireForReadAhead(IN PVOID Context,
516 IN BOOLEAN Wait);
517
518 VOID NTAPI
519 VfatReleaseFromReadAhead(IN PVOID Context);
520
521 /* --------------------------------------------------------- fsctl.c */
522
523 NTSTATUS VfatFileSystemControl (PVFAT_IRP_CONTEXT IrpContext);
524
525 /* --------------------------------------------------------- finfo.c */
526
527 NTSTATUS VfatQueryInformation (PVFAT_IRP_CONTEXT IrpContext);
528
529 NTSTATUS VfatSetInformation (PVFAT_IRP_CONTEXT IrpContext);
530
531 NTSTATUS
532 VfatSetAllocationSizeInformation(PFILE_OBJECT FileObject,
533 PVFATFCB Fcb,
534 PDEVICE_EXTENSION DeviceExt,
535 PLARGE_INTEGER AllocationSize);
536
537 /* --------------------------------------------------------- iface.c */
538
539 NTSTATUS NTAPI DriverEntry (PDRIVER_OBJECT DriverObject,
540 PUNICODE_STRING RegistryPath);
541
542 /* --------------------------------------------------------- dirwr.c */
543
544 NTSTATUS VfatAddEntry (PDEVICE_EXTENSION DeviceExt,
545 PUNICODE_STRING PathNameU,
546 PVFATFCB* Fcb,
547 PVFATFCB ParentFcb,
548 ULONG RequestedOptions,
549 UCHAR ReqAttr);
550
551 NTSTATUS VfatUpdateEntry (PVFATFCB pFcb);
552
553 NTSTATUS VfatDelEntry(PDEVICE_EXTENSION, PVFATFCB);
554
555 BOOLEAN
556 vfatFindDirSpace(PDEVICE_EXTENSION DeviceExt,
557 PVFATFCB pDirFcb,
558 ULONG nbSlots,
559 PULONG start);
560
561 /* -------------------------------------------------------- string.c */
562
563 VOID
564 vfatSplitPathName(PUNICODE_STRING PathNameU,
565 PUNICODE_STRING DirNameU,
566 PUNICODE_STRING FileNameU);
567
568 BOOLEAN vfatIsLongIllegal(WCHAR c);
569
570 BOOLEAN wstrcmpjoki (PWSTR s1,
571 PWSTR s2);
572
573 /* ----------------------------------------------------------- fat.c */
574
575 NTSTATUS FAT12GetNextCluster(PDEVICE_EXTENSION DeviceExt,
576 ULONG CurrentCluster,
577 PULONG NextCluster);
578
579 NTSTATUS FAT12FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt,
580 PULONG Cluster);
581
582 NTSTATUS FAT12WriteCluster(PDEVICE_EXTENSION DeviceExt,
583 ULONG ClusterToWrite,
584 ULONG NewValue,
585 PULONG OldValue);
586
587 NTSTATUS FAT16GetNextCluster(PDEVICE_EXTENSION DeviceExt,
588 ULONG CurrentCluster,
589 PULONG NextCluster);
590
591 NTSTATUS FAT16FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt,
592 PULONG Cluster);
593
594 NTSTATUS FAT16WriteCluster(PDEVICE_EXTENSION DeviceExt,
595 ULONG ClusterToWrite,
596 ULONG NewValue,
597 PULONG OldValue);
598
599 NTSTATUS FAT32GetNextCluster(PDEVICE_EXTENSION DeviceExt,
600 ULONG CurrentCluster,
601 PULONG NextCluster);
602
603 NTSTATUS FAT32FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt,
604 PULONG Cluster);
605
606 NTSTATUS FAT32WriteCluster(PDEVICE_EXTENSION DeviceExt,
607 ULONG ClusterToWrite,
608 ULONG NewValue,
609 PULONG OldValue);
610
611 NTSTATUS OffsetToCluster (PDEVICE_EXTENSION DeviceExt,
612 ULONG FirstCluster,
613 ULONG FileOffset,
614 PULONG Cluster,
615 BOOLEAN Extend);
616
617 ULONGLONG ClusterToSector (PDEVICE_EXTENSION DeviceExt,
618 ULONG Cluster);
619
620 NTSTATUS GetNextCluster (PDEVICE_EXTENSION DeviceExt,
621 ULONG CurrentCluster,
622 PULONG NextCluster);
623
624 NTSTATUS GetNextClusterExtend (PDEVICE_EXTENSION DeviceExt,
625 ULONG CurrentCluster,
626 PULONG NextCluster);
627
628 NTSTATUS CountAvailableClusters (PDEVICE_EXTENSION DeviceExt,
629 PLARGE_INTEGER Clusters);
630
631 NTSTATUS
632 WriteCluster(PDEVICE_EXTENSION DeviceExt,
633 ULONG ClusterToWrite,
634 ULONG NewValue);
635
636 /* ------------------------------------------------------ direntry.c */
637
638 ULONG vfatDirEntryGetFirstCluster (PDEVICE_EXTENSION pDeviceExt,
639 PDIR_ENTRY pDirEntry);
640
641 BOOLEAN VfatIsDirectoryEmpty(PVFATFCB Fcb);
642
643 NTSTATUS FATGetNextDirEntry(PVOID * pContext,
644 PVOID * pPage,
645 IN PVFATFCB pDirFcb,
646 IN PVFAT_DIRENTRY_CONTEXT DirContext,
647 BOOLEAN First);
648
649 NTSTATUS FATXGetNextDirEntry(PVOID * pContext,
650 PVOID * pPage,
651 IN PVFATFCB pDirFcb,
652 IN PVFAT_DIRENTRY_CONTEXT DirContext,
653 BOOLEAN First);
654
655 /* ----------------------------------------------------------- fcb.c */
656
657 PVFATFCB vfatNewFCB (PDEVICE_EXTENSION pVCB,
658 PUNICODE_STRING pFileNameU);
659
660 VOID vfatDestroyFCB (PVFATFCB pFCB);
661
662 VOID vfatDestroyCCB(PVFATCCB pCcb);
663
664 VOID vfatGrabFCB (PDEVICE_EXTENSION pVCB,
665 PVFATFCB pFCB);
666
667 VOID vfatReleaseFCB (PDEVICE_EXTENSION pVCB,
668 PVFATFCB pFCB);
669
670 VOID vfatAddFCBToTable (PDEVICE_EXTENSION pVCB,
671 PVFATFCB pFCB);
672
673 PVFATFCB vfatGrabFCBFromTable (PDEVICE_EXTENSION pDeviceExt,
674 PUNICODE_STRING pFileNameU);
675
676 PVFATFCB vfatMakeRootFCB (PDEVICE_EXTENSION pVCB);
677
678 PVFATFCB vfatOpenRootFCB (PDEVICE_EXTENSION pVCB);
679
680 BOOLEAN vfatFCBIsDirectory (PVFATFCB FCB);
681
682 BOOLEAN vfatFCBIsRoot(PVFATFCB FCB);
683
684 NTSTATUS vfatAttachFCBToFileObject (PDEVICE_EXTENSION vcb,
685 PVFATFCB fcb,
686 PFILE_OBJECT fileObject);
687
688 NTSTATUS vfatDirFindFile (PDEVICE_EXTENSION pVCB,
689 PVFATFCB parentFCB,
690 PUNICODE_STRING FileToFindU,
691 PVFATFCB * fileFCB);
692
693 NTSTATUS vfatGetFCBForFile (PDEVICE_EXTENSION pVCB,
694 PVFATFCB *pParentFCB,
695 PVFATFCB *pFCB,
696 PUNICODE_STRING pFileNameU);
697
698 NTSTATUS vfatMakeFCBFromDirEntry (PVCB vcb,
699 PVFATFCB directoryFCB,
700 PVFAT_DIRENTRY_CONTEXT DirContext,
701 PVFATFCB * fileFCB);
702
703 /* ------------------------------------------------------------ rw.c */
704
705 NTSTATUS VfatRead (PVFAT_IRP_CONTEXT IrpContext);
706
707 NTSTATUS VfatWrite (PVFAT_IRP_CONTEXT IrpContext);
708
709 NTSTATUS NextCluster(PDEVICE_EXTENSION DeviceExt,
710 ULONG FirstCluster,
711 PULONG CurrentCluster,
712 BOOLEAN Extend);
713
714 /* ----------------------------------------------------------- misc.c */
715
716 NTSTATUS VfatQueueRequest(PVFAT_IRP_CONTEXT IrpContext);
717
718 PVFAT_IRP_CONTEXT VfatAllocateIrpContext(PDEVICE_OBJECT DeviceObject,
719 PIRP Irp);
720
721 VOID VfatFreeIrpContext(PVFAT_IRP_CONTEXT IrpContext);
722
723 NTSTATUS NTAPI VfatBuildRequest (PDEVICE_OBJECT DeviceObject,
724 PIRP Irp);
725
726 PVOID VfatGetUserBuffer(IN PIRP);
727
728 NTSTATUS VfatLockUserBuffer(IN PIRP, IN ULONG,
729 IN LOCK_OPERATION);
730
731 NTSTATUS
732 VfatSetExtendedAttributes(PFILE_OBJECT FileObject,
733 PVOID Ea,
734 ULONG EaLength);
735 /* ------------------------------------------------------------- flush.c */
736
737 NTSTATUS VfatFlush(PVFAT_IRP_CONTEXT IrpContext);
738
739 NTSTATUS VfatFlushVolume(PDEVICE_EXTENSION DeviceExt, PVFATFCB VolumeFcb);
740
741
742 /* EOF */