7 #include <pseh/pseh2.h>
9 #include <ndk/kdfuncs.h>
10 #include <reactos/kdros.h>
14 #define INIT_SECTION __attribute__((section ("INIT")))
16 #define INIT_SECTION /* Done via alloc_text for MSC */
19 #define USE_ROS_CC_AND_FS
22 #define ENABLE_SWAPOUT
26 #define ROUND_DOWN(n, align) \
27 (((ULONG)n) & ~((align) - 1l))
29 #define ROUND_UP(n, align) \
30 ROUND_DOWN(((ULONG)n) + (align) - 1, (align))
32 #define ROUND_DOWN_64(n, align) \
33 (((ULONGLONG)n) & ~((align) - 1LL))
35 #define ROUND_UP_64(n, align) \
36 ROUND_DOWN_64(((ULONGLONG)n) + (align) - 1LL, (align))
41 unsigned char magic0
, res0
, magic1
;
42 unsigned char OEMName
[8];
43 unsigned short BytesPerSector
;
44 unsigned char SectorsPerCluster
;
45 unsigned short ReservedSectors
;
46 unsigned char FATCount
;
47 unsigned short RootEntries
, Sectors
;
49 unsigned short FATSectors
, SectorsPerTrack
, Heads
;
50 unsigned long HiddenSectors
, SectorsHuge
;
51 unsigned char Drive
, Res1
, Sig
;
52 unsigned long VolumeID
;
53 unsigned char VolumeLabel
[11], SysType
[8];
54 unsigned char Res2
[448];
55 unsigned short Signatur1
;
60 unsigned char magic0
, res0
, magic1
; // 0
61 unsigned char OEMName
[8]; // 3
62 unsigned short BytesPerSector
; // 11
63 unsigned char SectorsPerCluster
; // 13
64 unsigned short ReservedSectors
; // 14
65 unsigned char FATCount
; // 16
66 unsigned short RootEntries
, Sectors
; // 17
67 unsigned char Media
; // 21
68 unsigned short FATSectors
, SectorsPerTrack
, Heads
; // 22
69 unsigned long HiddenSectors
, SectorsHuge
; // 28
70 unsigned long FATSectors32
; // 36
71 unsigned short ExtFlag
; // 40
72 unsigned short FSVersion
; // 42
73 unsigned long RootCluster
; // 44
74 unsigned short FSInfoSector
; // 48
75 unsigned short BootBackup
; // 50
76 unsigned char Res3
[12]; // 52
77 unsigned char Drive
; // 64
78 unsigned char Res4
; // 65
79 unsigned char ExtBootSignature
; // 66
80 unsigned long VolumeID
; // 67
81 unsigned char VolumeLabel
[11], SysType
[8]; // 71
82 unsigned char Res2
[420]; // 90
83 unsigned short Signature1
; // 510
86 #define FAT_DIRTY_BIT 0x01
88 struct _BootSectorFatX
90 unsigned char SysType
[4]; // 0
91 unsigned long VolumeID
; // 4
92 unsigned long SectorsPerCluster
; // 8
93 unsigned short FATCount
; // 12
94 unsigned long Unknown
; // 14
95 unsigned char Unused
[4078]; // 18
100 unsigned long ExtBootSignature2
; // 0
101 unsigned char Res6
[480]; // 4
102 unsigned long FSINFOSignature
; // 484
103 unsigned long FreeCluster
; // 488
104 unsigned long NextCluster
; // 492
105 unsigned char Res7
[12]; // 496
106 unsigned long Signatur2
; // 508
109 typedef struct _BootSector BootSector
;
115 struct { unsigned char Filename
[8], Ext
[3]; };
116 unsigned char ShortName
[11];
118 unsigned char Attrib
;
120 unsigned char CreationTimeMs
;
121 unsigned short CreationTime
,CreationDate
,AccessDate
;
124 unsigned short FirstClusterHigh
; // FAT32
125 unsigned short ExtendedAttributes
; // FAT12/FAT16
127 unsigned short UpdateTime
; //time create/update
128 unsigned short UpdateDate
; //date create/update
129 unsigned short FirstCluster
;
130 unsigned long FileSize
;
133 #define FAT_EAFILE "EA DATA. SF"
135 typedef struct _EAFileHeader FAT_EA_FILE_HEADER
, *PFAT_EA_FILE_HEADER
;
139 unsigned short Signature
; // ED
140 unsigned short Unknown
[15];
141 unsigned short EASetTable
[240];
144 typedef struct _EASetHeader FAT_EA_SET_HEADER
, *PFAT_EA_SET_HEADER
;
148 unsigned short Signature
; // EA
149 unsigned short Offset
; // relative offset, same value as in the EASetTable
150 unsigned short Unknown1
[2];
151 char TargetFileName
[12];
152 unsigned short Unknown2
[3];
153 unsigned int EALength
;
157 typedef struct _EAHeader FAT_EA_HEADER
, *PFAT_EA_HEADER
;
161 unsigned char Unknown
;
162 unsigned char EANameLength
;
163 unsigned short EAValueLength
;
168 typedef struct _FATDirEntry FAT_DIR_ENTRY
, *PFAT_DIR_ENTRY
;
172 unsigned char FilenameLength
; // 0
173 unsigned char Attrib
; // 1
174 unsigned char Filename
[42]; // 2
175 unsigned long FirstCluster
; // 44
176 unsigned long FileSize
; // 48
177 unsigned short UpdateTime
; // 52
178 unsigned short UpdateDate
; // 54
179 unsigned short CreationTime
; // 56
180 unsigned short CreationDate
; // 58
181 unsigned short AccessTime
; // 60
182 unsigned short AccessDate
; // 62
187 unsigned char id
; // sequence number for slot
188 WCHAR name0_4
[5]; // first 5 characters in name
189 unsigned char attr
; // attribute byte
190 unsigned char reserved
; // always 0
191 unsigned char alias_checksum
; // checksum for 8.3 alias
192 WCHAR name5_10
[6]; // 6 more characters in name
193 unsigned char start
[2]; // starting cluster number
194 WCHAR name11_12
[2]; // last 2 characters in name
197 typedef struct _slot slot
;
201 #define VFAT_CASE_LOWER_BASE 8 // base is lower case
202 #define VFAT_CASE_LOWER_EXT 16 // extension is lower case
204 #define LONGNAME_MAX_LENGTH 256 // max length for a long filename
206 #define ENTRY_DELETED(IsFatX, DirEntry) (IsFatX ? FATX_ENTRY_DELETED(&((DirEntry)->FatX)) : FAT_ENTRY_DELETED(&((DirEntry)->Fat)))
207 #define ENTRY_VOLUME(IsFatX, DirEntry) (IsFatX ? FATX_ENTRY_VOLUME(&((DirEntry)->FatX)) : FAT_ENTRY_VOLUME(&((DirEntry)->Fat)))
208 #define ENTRY_END(IsFatX, DirEntry) (IsFatX ? FATX_ENTRY_END(&((DirEntry)->FatX)) : FAT_ENTRY_END(&((DirEntry)->Fat)))
210 #define FAT_ENTRY_DELETED(DirEntry) ((DirEntry)->Filename[0] == 0xe5)
211 #define FAT_ENTRY_END(DirEntry) ((DirEntry)->Filename[0] == 0)
212 #define FAT_ENTRY_LONG(DirEntry) (((DirEntry)->Attrib & 0x3f) == 0x0f)
213 #define FAT_ENTRY_VOLUME(DirEntry) (((DirEntry)->Attrib & 0x1f) == 0x08)
215 #define FATX_ENTRY_DELETED(DirEntry) ((DirEntry)->FilenameLength == 0xe5)
216 #define FATX_ENTRY_END(DirEntry) ((DirEntry)->FilenameLength == 0xff)
217 #define FATX_ENTRY_LONG(DirEntry) (FALSE)
218 #define FATX_ENTRY_VOLUME(DirEntry) (((DirEntry)->Attrib & 0x1f) == 0x08)
220 #define FAT_ENTRIES_PER_PAGE (PAGE_SIZE / sizeof (FAT_DIR_ENTRY))
221 #define FATX_ENTRIES_PER_PAGE (PAGE_SIZE / sizeof (FATX_DIR_ENTRY))
223 typedef struct _FATXDirEntry FATX_DIR_ENTRY
, *PFATX_DIR_ENTRY
;
231 typedef union _DIR_ENTRY DIR_ENTRY
, *PDIR_ENTRY
;
233 #define BLOCKSIZE 512
241 #define VCB_VOLUME_LOCKED 0x0001
242 #define VCB_DISMOUNT_PENDING 0x0002
243 #define VCB_IS_FATX 0x0004
244 #define VCB_IS_SYS_OR_HAS_PAGE 0x0008
245 #define VCB_IS_DIRTY 0x4000 /* Volume is dirty */
246 #define VCB_CLEAR_DIRTY 0x8000 /* Clean dirty flag at shutdown */
251 CHAR VolumeLabel
[11];
255 ULONG rootDirectorySectors
;
259 ULONG SectorsPerCluster
;
260 ULONG BytesPerSector
;
261 ULONG BytesPerCluster
;
262 ULONG NumberOfClusters
;
267 } FATINFO
, *PFATINFO
;
270 struct _VFAT_DIRENTRY_CONTEXT
;
271 struct _VFAT_MOVE_CONTEXT
;
273 typedef struct _HASHENTRY
276 struct _VFATFCB
* self
;
277 struct _HASHENTRY
* next
;
281 typedef struct DEVICE_EXTENSION
*PDEVICE_EXTENSION
;
283 typedef NTSTATUS (*PGET_NEXT_CLUSTER
)(PDEVICE_EXTENSION
,ULONG
,PULONG
);
284 typedef NTSTATUS (*PFIND_AND_MARK_AVAILABLE_CLUSTER
)(PDEVICE_EXTENSION
,PULONG
);
285 typedef NTSTATUS (*PWRITE_CLUSTER
)(PDEVICE_EXTENSION
,ULONG
,ULONG
,PULONG
);
287 typedef BOOLEAN (*PIS_DIRECTORY_EMPTY
)(PDEVICE_EXTENSION
,struct _VFATFCB
*);
288 typedef NTSTATUS (*PADD_ENTRY
)(PDEVICE_EXTENSION
,PUNICODE_STRING
,struct _VFATFCB
**,struct _VFATFCB
*,ULONG
,UCHAR
,struct _VFAT_MOVE_CONTEXT
*);
289 typedef NTSTATUS (*PDEL_ENTRY
)(PDEVICE_EXTENSION
,struct _VFATFCB
*,struct _VFAT_MOVE_CONTEXT
*);
290 typedef NTSTATUS (*PGET_NEXT_DIR_ENTRY
)(PVOID
*,PVOID
*,struct _VFATFCB
*,struct _VFAT_DIRENTRY_CONTEXT
*,BOOLEAN
);
291 typedef NTSTATUS (*PGET_DIRTY_STATUS
)(PDEVICE_EXTENSION
,PBOOLEAN
);
292 typedef NTSTATUS (*PSET_DIRTY_STATUS
)(PDEVICE_EXTENSION
,BOOLEAN
);
294 typedef struct _VFAT_DISPATCH
296 PIS_DIRECTORY_EMPTY IsDirectoryEmpty
;
299 PGET_NEXT_DIR_ENTRY GetNextDirEntry
;
300 } VFAT_DISPATCH
, *PVFAT_DISPATCH
;
302 #define STATISTICS_SIZE_NO_PAD (sizeof(FILESYSTEM_STATISTICS) + sizeof(FAT_STATISTICS))
303 typedef struct _STATISTICS
{
304 FILESYSTEM_STATISTICS Base
;
306 UCHAR Pad
[((STATISTICS_SIZE_NO_PAD
+ 0x3f) & ~0x3f) - STATISTICS_SIZE_NO_PAD
];
307 } STATISTICS
, *PSTATISTICS
;
309 typedef struct DEVICE_EXTENSION
311 ERESOURCE DirResource
;
312 ERESOURCE FatResource
;
314 KSPIN_LOCK FcbListLock
;
315 LIST_ENTRY FcbListHead
;
317 struct _HASHENTRY
**FcbHashTable
;
319 PDEVICE_OBJECT VolumeDevice
;
320 PDEVICE_OBJECT StorageDevice
;
321 PFILE_OBJECT FATFileObject
;
323 ULONG LastAvailableCluster
;
324 ULONG AvailableClusters
;
325 BOOLEAN AvailableClustersValid
;
327 struct _VFATFCB
*VolumeFcb
;
328 PSTATISTICS Statistics
;
330 /* Pointers to functions for manipulating FAT. */
331 PGET_NEXT_CLUSTER GetNextCluster
;
332 PFIND_AND_MARK_AVAILABLE_CLUSTER FindAndMarkAvailableCluster
;
333 PWRITE_CLUSTER WriteCluster
;
334 PGET_DIRTY_STATUS GetDirtyStatus
;
335 PSET_DIRTY_STATUS SetDirtyStatus
;
339 LIST_ENTRY VolumeListEntry
;
342 LIST_ENTRY NotifyList
;
343 PNOTIFY_SYNC NotifySync
;
345 /* Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLOSE */
346 ULONG OpenHandleCount
;
348 /* VPBs for dismount */
352 /* Pointers to functions for manipulating directory entries. */
353 VFAT_DISPATCH Dispatch
;
354 } DEVICE_EXTENSION
, VCB
, *PVCB
;
358 VfatIsDirectoryEmpty(PDEVICE_EXTENSION DeviceExt
,
359 struct _VFATFCB
* Fcb
)
361 return DeviceExt
->Dispatch
.IsDirectoryEmpty(DeviceExt
, Fcb
);
366 VfatAddEntry(PDEVICE_EXTENSION DeviceExt
,
367 PUNICODE_STRING NameU
,
368 struct _VFATFCB
** Fcb
,
369 struct _VFATFCB
* ParentFcb
,
370 ULONG RequestedOptions
,
372 struct _VFAT_MOVE_CONTEXT
* MoveContext
)
374 return DeviceExt
->Dispatch
.AddEntry(DeviceExt
, NameU
, Fcb
, ParentFcb
, RequestedOptions
, ReqAttr
, MoveContext
);
379 VfatDelEntry(PDEVICE_EXTENSION DeviceExt
,
380 struct _VFATFCB
* Fcb
,
381 struct _VFAT_MOVE_CONTEXT
* MoveContext
)
383 return DeviceExt
->Dispatch
.DelEntry(DeviceExt
, Fcb
, MoveContext
);
388 VfatGetNextDirEntry(PDEVICE_EXTENSION DeviceExt
,
391 struct _VFATFCB
* pDirFcb
,
392 struct _VFAT_DIRENTRY_CONTEXT
* DirContext
,
395 return DeviceExt
->Dispatch
.GetNextDirEntry(pContext
, pPage
, pDirFcb
, DirContext
, First
);
398 #define VFAT_BREAK_ON_CORRUPTION 1
402 PDRIVER_OBJECT DriverObject
;
403 PDEVICE_OBJECT DeviceObject
;
405 ULONG NumberProcessors
;
406 ERESOURCE VolumeListLock
;
407 LIST_ENTRY VolumeListHead
;
408 NPAGED_LOOKASIDE_LIST FcbLookasideList
;
409 NPAGED_LOOKASIDE_LIST CcbLookasideList
;
410 NPAGED_LOOKASIDE_LIST IrpContextLookasideList
;
411 FAST_IO_DISPATCH FastIoDispatch
;
412 CACHE_MANAGER_CALLBACKS CacheMgrCallbacks
;
413 } VFAT_GLOBAL_DATA
, *PVFAT_GLOBAL_DATA
;
415 extern PVFAT_GLOBAL_DATA VfatGlobalData
;
417 #define FCB_CACHE_INITIALIZED 0x0001
418 #define FCB_DELETE_PENDING 0x0002
419 #define FCB_IS_FAT 0x0004
420 #define FCB_IS_PAGE_FILE 0x0008
421 #define FCB_IS_VOLUME 0x0010
422 #define FCB_IS_DIRTY 0x0020
424 #define FCB_CLEANED_UP 0x0040
425 #define FCB_CLOSED 0x0080
428 #define NODE_TYPE_FCB ((CSHORT)0x0502)
430 typedef struct _VFATFCB
432 /* FCB header required by ROS/NT */
433 FSRTL_COMMON_FCB_HEADER RFCB
;
434 SECTION_OBJECT_POINTERS SectionObjectPointers
;
435 ERESOURCE MainResource
;
436 ERESOURCE PagingIoResource
;
437 /* end FCB header required by ROS/NT */
439 /* directory entry for this file or directory */
442 /* Pointer to attributes in entry */
445 /* long file name, points into PathNameBuffer */
446 UNICODE_STRING LongNameU
;
448 /* short file name */
449 UNICODE_STRING ShortNameU
;
451 /* directory name, points into PathNameBuffer */
452 UNICODE_STRING DirNameU
;
454 /* path + long file name 260 max*/
455 UNICODE_STRING PathNameU
;
457 /* buffer for PathNameU */
458 PWCHAR PathNameBuffer
;
460 /* buffer for ShortNameU */
461 WCHAR ShortNameBuffer
[13];
466 /* List of FCB's for this volume */
467 LIST_ENTRY FcbListEntry
;
469 /* List of FCB's for the parent */
470 LIST_ENTRY ParentListEntry
;
472 /* pointer to the parent fcb */
473 struct _VFATFCB
*parentFcb
;
475 /* List for the children */
476 LIST_ENTRY ParentListHead
;
478 /* Flags for the fcb */
481 /* pointer to the file object which has initialized the fcb */
482 PFILE_OBJECT FileObject
;
484 /* Directory index for the short name entry */
487 /* Directory index where the long name starts */
490 /* Share access for the file object */
491 SHARE_ACCESS FCBShareAccess
;
493 /* Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP */
494 ULONG OpenHandleCount
;
496 /* Entry into the hash table for the path + long name */
499 /* Entry into the hash table for the path + short name */
502 /* List of byte-range locks for this file */
506 * Optimization: caching of last read/write cluster+offset pair. Can't
507 * be in VFATCCB because it must be reset everytime the allocated clusters
510 FAST_MUTEX LastMutex
;
513 } VFATFCB
, *PVFATFCB
;
515 #define CCB_DELETE_ON_CLOSE 0x0001
517 typedef struct _VFATCCB
519 LARGE_INTEGER CurrentByteOffset
;
521 /* for DirectoryControl */
523 /* for DirectoryControl */
524 UNICODE_STRING SearchPattern
;
525 } VFATCCB
, *PVFATCCB
;
527 #define TAG_CCB 'BCCV'
528 #define TAG_FCB 'BCFV'
529 #define TAG_IRP 'PRIV'
530 #define TAG_VFAT 'TAFV'
532 #define ENTRIES_PER_SECTOR (BLOCKSIZE / sizeof(FATDirEntry))
534 typedef struct __DOSTIME
542 typedef struct __DOSDATE
550 #define IRPCONTEXT_CANWAIT 0x0001
551 #define IRPCONTEXT_COMPLETE 0x0002
552 #define IRPCONTEXT_QUEUE 0x0004
553 #define IRPCONTEXT_PENDINGRETURNED 0x0008
554 #define IRPCONTEXT_DEFERRED_WRITE 0x0010
559 PDEVICE_OBJECT DeviceObject
;
560 PDEVICE_EXTENSION DeviceExt
;
562 WORK_QUEUE_ITEM WorkQueueItem
;
563 PIO_STACK_LOCATION Stack
;
566 PFILE_OBJECT FileObject
;
570 } VFAT_IRP_CONTEXT
, *PVFAT_IRP_CONTEXT
;
572 typedef struct _VFAT_DIRENTRY_CONTEXT
577 UNICODE_STRING LongNameU
;
578 UNICODE_STRING ShortNameU
;
579 PDEVICE_EXTENSION DeviceExt
;
580 } VFAT_DIRENTRY_CONTEXT
, *PVFAT_DIRENTRY_CONTEXT
;
582 typedef struct _VFAT_MOVE_CONTEXT
589 } VFAT_MOVE_CONTEXT
, *PVFAT_MOVE_CONTEXT
;
593 VfatMarkIrpContextForQueue(PVFAT_IRP_CONTEXT IrpContext
)
595 PULONG Flags
= &IrpContext
->Flags
;
597 *Flags
&= ~IRPCONTEXT_COMPLETE
;
598 *Flags
|= IRPCONTEXT_QUEUE
;
600 return STATUS_PENDING
;
605 vfatFCBIsDirectory(PVFATFCB FCB
)
607 return BooleanFlagOn(*FCB
->Attributes
, FILE_ATTRIBUTE_DIRECTORY
);
612 vfatFCBIsReadOnly(PVFATFCB FCB
)
614 return BooleanFlagOn(*FCB
->Attributes
, FILE_ATTRIBUTE_READONLY
);
619 vfatVolumeIsFatX(PDEVICE_EXTENSION DeviceExt
)
621 return BooleanFlagOn(DeviceExt
->Flags
, VCB_IS_FATX
);
627 IN PDEVICE_EXTENSION DeviceExt
,
629 IN ULONG FilterMatch
,
632 FsRtlNotifyFullReportChange(DeviceExt
->NotifySync
,
633 &(DeviceExt
->NotifyList
),
634 (PSTRING
)&Fcb
->PathNameU
,
635 Fcb
->PathNameU
.Length
- Fcb
->LongNameU
.Length
,
636 NULL
, NULL
, FilterMatch
, Action
, NULL
);
639 #define vfatAddToStat(Vcb, Stat, Inc) \
641 PSTATISTICS Stats = &(Vcb)->Statistics[KeGetCurrentProcessorNumber() % VfatGlobalData->NumberProcessors]; \
642 Stats->Stat += Inc; \
649 IN PDEVICE_OBJECT pDeviceObject
,
650 IN PLARGE_INTEGER ReadOffset
,
653 IN BOOLEAN Override
);
657 IN PVFAT_IRP_CONTEXT IrpContext
,
658 IN PLARGE_INTEGER ReadOffset
,
660 IN ULONG BufferOffset
,
665 IN PDEVICE_OBJECT pDeviceObject
,
666 IN PLARGE_INTEGER WriteOffset
,
667 IN ULONG WriteLength
,
668 IN OUT PUCHAR Buffer
,
669 IN BOOLEAN Override
);
672 VfatWriteDiskPartial(
673 IN PVFAT_IRP_CONTEXT IrpContext
,
674 IN PLARGE_INTEGER WriteOffset
,
675 IN ULONG WriteLength
,
676 IN ULONG BufferOffset
,
680 VfatBlockDeviceIoControl(
681 IN PDEVICE_OBJECT DeviceObject
,
683 IN PVOID InputBuffer
,
684 IN ULONG InputBufferSize
,
685 IN OUT PVOID OutputBuffer
,
686 IN OUT PULONG pOutputBufferSize
,
687 IN BOOLEAN Override
);
693 PVFAT_IRP_CONTEXT IrpContext
);
699 PVFAT_IRP_CONTEXT IrpContext
);
703 PDEVICE_EXTENSION DeviceExt
,
704 PFILE_OBJECT FileObject
);
710 PVFAT_IRP_CONTEXT IrpContext
);
714 PDEVICE_EXTENSION DeviceExt
,
716 PUNICODE_STRING FileToFindU
,
717 PVFAT_DIRENTRY_CONTEXT DirContext
,
722 PFAT_DIR_ENTRY pEntry
,
723 PUNICODE_STRING NameU
);
728 VfatDirectoryControl(
729 PVFAT_IRP_CONTEXT IrpContext
);
732 FsdDosDateTimeToSystemTime(
733 PDEVICE_EXTENSION DeviceExt
,
736 PLARGE_INTEGER SystemTime
);
739 FsdSystemTimeToDosDateTime(
740 PDEVICE_EXTENSION DeviceExt
,
741 PLARGE_INTEGER SystemTime
,
748 vfatDirEntryGetFirstCluster(
749 PDEVICE_EXTENSION pDeviceExt
,
750 PDIR_ENTRY pDirEntry
);
755 vfatFCBInitializeCacheFromVolume(
761 IN PDEVICE_EXTENSION DeviceExt
,
766 PDEVICE_EXTENSION DeviceExt
,
773 IN PDEVICE_EXTENSION DeviceExt
,
775 IN PUNICODE_STRING FileName
,
776 IN BOOLEAN CaseChangeOnly
);
780 IN PDEVICE_EXTENSION DeviceExt
,
782 IN PUNICODE_STRING FileName
,
783 IN PVFATFCB ParentFcb
);
788 VfatSetExtendedAttributes(
789 PFILE_OBJECT FileObject
,
796 VfatInitFastIoRoutines(
797 PFAST_IO_DISPATCH FastIoDispatch
);
801 VfatAcquireForLazyWrite(
807 VfatReleaseFromLazyWrite(
814 PDEVICE_EXTENSION DeviceExt
,
815 ULONG CurrentCluster
,
819 FAT12FindAndMarkAvailableCluster(
820 PDEVICE_EXTENSION DeviceExt
,
825 PDEVICE_EXTENSION DeviceExt
,
826 ULONG ClusterToWrite
,
832 PDEVICE_EXTENSION DeviceExt
,
833 ULONG CurrentCluster
,
837 FAT16FindAndMarkAvailableCluster(
838 PDEVICE_EXTENSION DeviceExt
,
843 PDEVICE_EXTENSION DeviceExt
,
844 ULONG ClusterToWrite
,
850 PDEVICE_EXTENSION DeviceExt
,
851 ULONG CurrentCluster
,
855 FAT32FindAndMarkAvailableCluster(
856 PDEVICE_EXTENSION DeviceExt
,
861 PDEVICE_EXTENSION DeviceExt
,
862 ULONG ClusterToWrite
,
868 PDEVICE_EXTENSION DeviceExt
,
876 PDEVICE_EXTENSION DeviceExt
,
881 PDEVICE_EXTENSION DeviceExt
,
882 ULONG CurrentCluster
,
886 GetNextClusterExtend(
887 PDEVICE_EXTENSION DeviceExt
,
888 ULONG CurrentCluster
,
892 CountAvailableClusters(
893 PDEVICE_EXTENSION DeviceExt
,
894 PLARGE_INTEGER Clusters
);
898 PDEVICE_EXTENSION DeviceExt
,
899 ULONG ClusterToWrite
,
904 PDEVICE_EXTENSION DeviceExt
,
905 PBOOLEAN DirtyStatus
);
909 PDEVICE_EXTENSION DeviceExt
,
910 PBOOLEAN DirtyStatus
);
914 PDEVICE_EXTENSION DeviceExt
,
915 PBOOLEAN DirtyStatus
);
919 PDEVICE_EXTENSION DeviceExt
,
920 BOOLEAN DirtyStatus
);
924 PDEVICE_EXTENSION DeviceExt
,
925 BOOLEAN DirtyStatus
);
929 PDEVICE_EXTENSION DeviceExt
,
930 BOOLEAN DirtyStatus
);
933 FAT32UpdateFreeClustersCount(
934 PDEVICE_EXTENSION DeviceExt
,
942 PDEVICE_EXTENSION pVCB
,
943 PUNICODE_STRING pFileNameU
);
946 vfatSetFCBNewDirName(
947 PDEVICE_EXTENSION pVCB
,
953 PDEVICE_EXTENSION pVCB
,
955 PVFAT_DIRENTRY_CONTEXT DirContext
,
972 PDEVICE_EXTENSION pVCB
,
988 PDEVICE_EXTENSION pVCB
,
999 #define vfatGrabFCB(v, f) _vfatGrabFCB(v, f, __FILE__, __LINE__, __FUNCTION__)
1000 #define vfatReleaseFCB(v, f) _vfatReleaseFCB(v, f, __FILE__, __LINE__, __FUNCTION__)
1004 vfatGrabFCBFromTable(
1005 PDEVICE_EXTENSION pDeviceExt
,
1006 PUNICODE_STRING pFileNameU
);
1010 PDEVICE_EXTENSION pVCB
);
1014 PDEVICE_EXTENSION pVCB
);
1025 vfatAttachFCBToFileObject(
1026 PDEVICE_EXTENSION vcb
,
1028 PFILE_OBJECT fileObject
);
1032 PDEVICE_EXTENSION pVCB
,
1034 PUNICODE_STRING FileToFindU
,
1039 PDEVICE_EXTENSION pVCB
,
1040 PVFATFCB
*pParentFCB
,
1042 PUNICODE_STRING pFileNameU
);
1045 vfatMakeFCBFromDirEntry(
1047 PVFATFCB directoryFCB
,
1048 PVFAT_DIRENTRY_CONTEXT DirContext
,
1054 VfatGetStandardInformation(
1056 PFILE_STANDARD_INFORMATION StandardInfo
,
1057 PULONG BufferLength
);
1060 VfatGetBasicInformation(
1061 PFILE_OBJECT FileObject
,
1063 PDEVICE_EXTENSION DeviceExt
,
1064 PFILE_BASIC_INFORMATION BasicInfo
,
1065 PULONG BufferLength
);
1068 VfatQueryInformation(
1069 PVFAT_IRP_CONTEXT IrpContext
);
1073 PVFAT_IRP_CONTEXT IrpContext
);
1076 VfatSetAllocationSizeInformation(
1077 PFILE_OBJECT FileObject
,
1079 PDEVICE_EXTENSION DeviceExt
,
1080 PLARGE_INTEGER AllocationSize
);
1086 PVFAT_IRP_CONTEXT IrpContext
);
1090 PDEVICE_EXTENSION DeviceExt
,
1091 PVFATFCB VolumeFcb
);
1096 VfatFileSystemControl(
1097 PVFAT_IRP_CONTEXT IrpContext
);
1104 PDRIVER_OBJECT DriverObject
,
1105 PUNICODE_STRING RegistryPath
);
1109 KDBG_CLI_ROUTINE vfatKdbgHandler
;
1120 PDEVICE_OBJECT DeviceObject
,
1135 VfatCheckForDismount(
1136 IN PDEVICE_EXTENSION DeviceExt
,
1141 IN PDEVICE_EXTENSION DeviceExt
,
1143 IN ULONG FilterMatch
,
1148 VfatHandleDeferredWrite(
1149 IN PVOID IrpContext
,
1156 PVFAT_IRP_CONTEXT IrpContext
);
1162 PVFAT_IRP_CONTEXT IrpContext
);
1166 PVFAT_IRP_CONTEXT IrpContext
);
1170 PDEVICE_EXTENSION DeviceExt
,
1172 PULONG CurrentCluster
,
1183 PDEVICE_OBJECT DeviceObject
,
1190 PUNICODE_STRING PathNameU
,
1191 PUNICODE_STRING DirNameU
,
1192 PUNICODE_STRING FileNameU
);
1206 VfatQueryVolumeInformation(
1207 PVFAT_IRP_CONTEXT IrpContext
);
1210 VfatSetVolumeInformation(
1211 PVFAT_IRP_CONTEXT IrpContext
);
1213 #endif /* _FASTFAT_PCH_ */