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