15#define USE_ROS_CC_AND_FS
22#define VOLUME_IS_NOT_CACHED_WORK_AROUND_IT
25#define ROUND_DOWN(n, align) \
26 (((ULONG)n) & ~((align) - 1l))
28#define ROUND_UP(n, align) \
29 ROUND_DOWN(((ULONG)n) + (align) - 1, (align))
31#define ROUND_DOWN_64(n, align) \
32 (((ULONGLONG)n) & ~((align) - 1LL))
34#define ROUND_UP_64(n, align) \
35 ROUND_DOWN_64(((ULONGLONG)n) + (align) - 1LL, (align))
85#define FAT_DIRTY_BIT 0x01
132#define FAT_EAFILE "EA DATA. SF"
200#define VFAT_CASE_LOWER_BASE 8
201#define VFAT_CASE_LOWER_EXT 16
203#define LONGNAME_MAX_LENGTH 256
205#define ENTRY_DELETED(IsFatX, DirEntry) (IsFatX ? FATX_ENTRY_DELETED(&((DirEntry)->FatX)) : FAT_ENTRY_DELETED(&((DirEntry)->Fat)))
206#define ENTRY_VOLUME(IsFatX, DirEntry) (IsFatX ? FATX_ENTRY_VOLUME(&((DirEntry)->FatX)) : FAT_ENTRY_VOLUME(&((DirEntry)->Fat)))
207#define ENTRY_END(IsFatX, DirEntry) (IsFatX ? FATX_ENTRY_END(&((DirEntry)->FatX)) : FAT_ENTRY_END(&((DirEntry)->Fat)))
209#define FAT_ENTRY_DELETED(DirEntry) ((DirEntry)->Filename[0] == 0xe5)
210#define FAT_ENTRY_END(DirEntry) ((DirEntry)->Filename[0] == 0)
211#define FAT_ENTRY_LONG(DirEntry) (((DirEntry)->Attrib & 0x3f) == 0x0f)
212#define FAT_ENTRY_VOLUME(DirEntry) (((DirEntry)->Attrib & 0x1f) == 0x08)
214#define FATX_ENTRY_DELETED(DirEntry) ((DirEntry)->FilenameLength == 0xe5)
215#define FATX_ENTRY_END(DirEntry) ((DirEntry)->FilenameLength == 0xff)
216#define FATX_ENTRY_LONG(DirEntry) (FALSE)
217#define FATX_ENTRY_VOLUME(DirEntry) (((DirEntry)->Attrib & 0x1f) == 0x08)
219#define FAT_ENTRIES_PER_PAGE (PAGE_SIZE / sizeof (FAT_DIR_ENTRY))
220#define FATX_ENTRIES_PER_PAGE (PAGE_SIZE / sizeof (FATX_DIR_ENTRY))
240#define VCB_VOLUME_LOCKED 0x0001
241#define VCB_DISMOUNT_PENDING 0x0002
242#define VCB_IS_FATX 0x0004
243#define VCB_IS_SYS_OR_HAS_PAGE 0x0008
244#define VCB_IS_DIRTY 0x4000
245#define VCB_CLEAR_DIRTY 0x8000
247#define VCB_GOOD 0x0010
304#define STATISTICS_SIZE_NO_PAD (sizeof(FILESYSTEM_STATISTICS) + sizeof(FAT_STATISTICS))
370 return DeviceExt->Dispatch.IsDirectoryEmpty(DeviceExt,
Fcb);
379 ULONG RequestedOptions,
383 return DeviceExt->Dispatch.AddEntry(DeviceExt, NameU,
Fcb,
ParentFcb, RequestedOptions, ReqAttr, MoveContext);
392 return DeviceExt->Dispatch.DelEntry(DeviceExt,
Fcb, MoveContext);
404 return DeviceExt->Dispatch.GetNextDirEntry(pContext, pPage, pDirFcb,
DirContext,
First);
407#define VFAT_BREAK_ON_CORRUPTION 1
433#define FCB_CACHE_INITIALIZED 0x0001
434#define FCB_DELETE_PENDING 0x0002
435#define FCB_IS_FAT 0x0004
436#define FCB_IS_PAGE_FILE 0x0008
437#define FCB_IS_VOLUME 0x0010
438#define FCB_IS_DIRTY 0x0020
439#define FCB_DELAYED_CLOSE 0x0040
441#define FCB_CLEANED_UP 0x0080
442#define FCB_CLOSED 0x0100
445#define NODE_TYPE_FCB ((CSHORT)0x0502)
534#define CCB_DELETE_ON_CLOSE 0x0001
546#define TAG_CCB 'CtaF'
547#define TAG_FCB 'FtaF'
548#define TAG_IRP 'ItaF'
549#define TAG_CLOSE 'xtaF'
550#define TAG_STATS 'VtaF'
551#define TAG_BUFFER 'OtaF'
552#define TAG_VPB 'vtaF'
553#define TAG_NAME 'ntaF'
554#define TAG_SEARCH 'LtaF'
555#define TAG_DIRENT 'DtaF'
557#define ENTRIES_PER_SECTOR (BLOCKSIZE / sizeof(FATDirEntry))
575#define IRPCONTEXT_CANWAIT 0x0001
576#define IRPCONTEXT_COMPLETE 0x0002
577#define IRPCONTEXT_QUEUE 0x0004
578#define IRPCONTEXT_PENDINGRETURNED 0x0008
579#define IRPCONTEXT_DEFERRED_WRITE 0x0010
629 *
Flags &= ~IRPCONTEXT_COMPLETE;
665 &(DeviceExt->NotifyList),
667 Fcb->PathNameU.Length -
Fcb->LongNameU.Length,
671#define vfatAddToStat(Vcb, Stat, Inc) \
673 PSTATISTICS Stats = &(Vcb)->Statistics[KeGetCurrentProcessorNumber() % VfatGlobalData->NumberProcessors]; \
674 Stats->Stat += Inc; \
848 ULONG CurrentCluster,
859 ULONG ClusterToWrite,
866 ULONG CurrentCluster,
877 ULONG ClusterToWrite,
884 ULONG CurrentCluster,
895 ULONG ClusterToWrite,
915 ULONG CurrentCluster,
921 ULONG CurrentCluster,
932 ULONG ClusterToWrite,
1030#define vfatGrabFCB(v, f) _vfatGrabFCB(v, f, __FILE__, __LINE__, __FUNCTION__)
1031#define vfatReleaseFCB(v, f) _vfatReleaseFCB(v, f, __FILE__, __LINE__, __FUNCTION__)
1141KDBG_CLI_ROUTINE vfatKdbgHandler;
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn UINT32 *TableIdx UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING ACPI_OBJECT_LIST ACPI_BUFFER *ReturnObjectBuffer ACPI_DEVICE_INFO **ReturnBuffer ACPI_HANDLE Parent
_In_ PFCB _In_ LONGLONG FileOffset
_In_ PFCB _In_ PDIRENT_ENUM_CONTEXT DirContext
DRIVER_INITIALIZE DriverEntry
UNICODE_STRING * PUNICODE_STRING
#define BooleanFlagOn(F, SF)
IN PVCB IN PDIRENT OUT PULONG EaLength
IN PFCB IN PFILE_OBJECT FileObject IN ULONG AllocationSize
_In_ PLIST_ENTRY _In_ PSTRING _In_ USHORT _In_opt_ PSTRING _In_opt_ PSTRING _In_ ULONG FilterMatch
_In_ PNDIS_STRING _In_ PNDIS_STRING _Out_ PDEVICE_OBJECT * pDeviceObject
DRIVER_DISPATCH(nfs41_FsdDispatch)
#define FILE_ATTRIBUTE_READONLY
#define FILE_ATTRIBUTE_DIRECTORY
_In_ ULONG _In_ ULONG _In_ ULONG Length
VOID NTAPI FsRtlNotifyFullReportChange(IN PNOTIFY_SYNC NotifySync, IN PLIST_ENTRY NotifyList, IN PSTRING FullTargetName, IN USHORT TargetNameOffset, IN PSTRING StreamName OPTIONAL, IN PSTRING NormalizedParentName OPTIONAL, IN ULONG FilterMatch, IN ULONG Action, IN PVOID TargetContext)
FAST_IO_DISPATCH FastIoDispatch
LIST_ENTRY VolumeListEntry
PWRITE_CLUSTER WriteCluster
PGET_NEXT_CLUSTER GetNextCluster
PFIND_AND_MARK_AVAILABLE_CLUSTER FindAndMarkAvailableCluster
struct _VFATFCB * RootFcb
BOOLEAN AvailableClustersValid
PSET_DIRTY_STATUS SetDirtyStatus
PDEVICE_OBJECT StorageDevice
ULONG LastAvailableCluster
struct _HASHENTRY ** FcbHashTable
PDEVICE_OBJECT VolumeDevice
PGET_DIRTY_STATUS GetDirtyStatus
PFILE_OBJECT FATFileObject
struct _VFATFCB * VolumeFcb
KSPIN_LOCK OverflowQueueSpinLock
ULONG rootDirectorySectors
NPAGED_LOOKASIDE_LIST IrpContextLookasideList
NPAGED_LOOKASIDE_LIST CcbLookasideList
PDRIVER_OBJECT DriverObject
BOOLEAN CloseWorkerRunning
NPAGED_LOOKASIDE_LIST FcbLookasideList
FAST_IO_DISPATCH FastIoDispatch
PIO_WORKITEM CloseWorkItem
PAGED_LOOKASIDE_LIST CloseContextLookasideList
CACHE_MANAGER_CALLBACKS CacheMgrCallbacks
LIST_ENTRY VolumeListHead
PDEVICE_OBJECT DeviceObject
PDEVICE_OBJECT DeviceObject
WORK_QUEUE_ITEM WorkQueueItem
PDEVICE_EXTENSION DeviceExt
unsigned char ExtBootSignature
unsigned char SectorsPerCluster
unsigned short BootBackup
unsigned long FATSectors32
unsigned short Signature1
unsigned short SectorsPerTrack
unsigned short ReservedSectors
unsigned char VolumeLabel[11]
unsigned long HiddenSectors
unsigned short FATSectors
unsigned long RootCluster
unsigned short FSInfoSector
unsigned short BytesPerSector
unsigned long SectorsHuge
unsigned short RootEntries
unsigned char Unused[4078]
unsigned long SectorsPerCluster
unsigned short FATSectors
unsigned long SectorsHuge
unsigned short ReservedSectors
unsigned char VolumeLabel[11]
unsigned short SectorsPerTrack
unsigned short BytesPerSector
unsigned char SectorsPerCluster
unsigned long HiddenSectors
unsigned short RootEntries
unsigned char CreationTimeMs
unsigned short UpdateDate
unsigned char Filename[8]
unsigned char ShortName[11]
unsigned short CreationDate
unsigned short FirstCluster
unsigned short CreationTime
unsigned short FirstClusterHigh
unsigned short ExtendedAttributes
unsigned short UpdateTime
unsigned short AccessDate
unsigned short AccessTime
unsigned short AccessDate
unsigned short UpdateDate
unsigned short CreationDate
unsigned long FirstCluster
unsigned short UpdateTime
unsigned char Filename[42]
unsigned char FilenameLength
unsigned short CreationTime
unsigned long FSINFOSignature
unsigned long FreeCluster
unsigned long ExtBootSignature2
unsigned long NextCluster
UCHAR Pad[((STATISTICS_SIZE_NO_PAD+0x3f) &~0x3f) - STATISTICS_SIZE_NO_PAD]
FILESYSTEM_STATISTICS Base
UNICODE_STRING SearchPattern
LARGE_INTEGER CurrentByteOffset
LIST_ENTRY ParentListEntry
ERESOURCE PagingIoResource
UNICODE_STRING ShortNameU
WCHAR ShortNameBuffer[13]
FSRTL_COMMON_FCB_HEADER RFCB
struct _VFATFCB * parentFcb
LIST_ENTRY ParentListHead
SHARE_ACCESS FCBShareAccess
SECTION_OBJECT_POINTERS SectionObjectPointers
struct _VFAT_CLOSE_CONTEXT * CloseContext
LIST_ENTRY CloseListEntry
UNICODE_STRING ShortNameU
PDEVICE_EXTENSION DeviceExt
PGET_NEXT_DIR_ENTRY GetNextDirEntry
PIS_DIRECTORY_EMPTY IsDirectoryEmpty
unsigned char alias_checksum
NTSTATUS(* PADD_ENTRY)(PDEVICE_EXTENSION, PUNICODE_STRING, struct _VFATFCB **, struct _VFATFCB *, ULONG, UCHAR, struct _VFAT_MOVE_CONTEXT *)
PVFAT_GLOBAL_DATA VfatGlobalData
struct _VFAT_MOVE_CONTEXT VFAT_MOVE_CONTEXT
struct _VFAT_DISPATCH * PVFAT_DISPATCH
NTSTATUS(* PGET_NEXT_DIR_ENTRY)(PVOID *, PVOID *, struct _VFATFCB *, struct _VFAT_DIRENTRY_CONTEXT *, BOOLEAN)
struct _EAHeader * PFAT_EA_HEADER
struct _VFAT_DIRENTRY_CONTEXT * PVFAT_DIRENTRY_CONTEXT
struct DEVICE_EXTENSION DEVICE_EXTENSION
NTSTATUS VfatSetInformation(PVFAT_IRP_CONTEXT IrpContext)
NTSTATUS FAT32GetNextCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster, PULONG NextCluster)
struct _VFATFCB * PVFATFCB
NTSTATUS VfatGetBasicInformation(PFILE_OBJECT FileObject, PVFATFCB FCB, PDEVICE_EXTENSION DeviceExt, PFILE_BASIC_INFORMATION BasicInfo, PULONG BufferLength)
NTSTATUS vfatDirFindFile(PDEVICE_EXTENSION pVCB, PVFATFCB parentFCB, PUNICODE_STRING FileToFindU, PVFATFCB *fileFCB)
BOOLEAN vfatIsLongIllegal(WCHAR c)
NTSTATUS GetNextCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster, PULONG NextCluster)
NTSTATUS FAT12FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt, PULONG Cluster)
NTSTATUS VfatSetVolumeInformation(PVFAT_IRP_CONTEXT IrpContext)
struct _VFAT_CLOSE_CONTEXT * PVFAT_CLOSE_CONTEXT
NTSTATUS vfatUpdateFCB(PDEVICE_EXTENSION pVCB, PVFATFCB Fcb, PVFAT_DIRENTRY_CONTEXT DirContext, PVFATFCB ParentFcb)
VOID vfatSplitPathName(PUNICODE_STRING PathNameU, PUNICODE_STRING DirNameU, PUNICODE_STRING FileNameU)
NTSTATUS VfatRead(PVFAT_IRP_CONTEXT IrpContext)
NTSTATUS VfatWrite(PVFAT_IRP_CONTEXT *pIrpContext)
NTSTATUS NextCluster(PDEVICE_EXTENSION DeviceExt, ULONG FirstCluster, PULONG CurrentCluster, BOOLEAN Extend)
PVFATFCB vfatOpenRootFCB(PDEVICE_EXTENSION pVCB)
struct _FATDirEntry * PFAT_DIR_ENTRY
NTSTATUS VfatCloseFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject)
NTSTATUS CountAvailableClusters(PDEVICE_EXTENSION DeviceExt, PLARGE_INTEGER Clusters)
NTSTATUS vfatRenameEntry(IN PDEVICE_EXTENSION DeviceExt, IN PVFATFCB pFcb, IN PUNICODE_STRING FileName, IN BOOLEAN CaseChangeOnly)
NTSTATUS VfatWriteDisk(IN PDEVICE_OBJECT pDeviceObject, IN PLARGE_INTEGER WriteOffset, IN ULONG WriteLength, IN OUT PUCHAR Buffer, IN BOOLEAN Override)
NTSTATUS VfatQueryVolumeInformation(PVFAT_IRP_CONTEXT IrpContext)
FORCEINLINE BOOLEAN vfatFCBIsReadOnly(PVFATFCB FCB)
NTSTATUS FAT16SetDirtyStatus(PDEVICE_EXTENSION DeviceExt, BOOLEAN DirtyStatus)
BOOLEAN vfatFCBIsRoot(PVFATFCB FCB)
PVFATFCB vfatMakeRootFCB(PDEVICE_EXTENSION pVCB)
NTSTATUS FAT16GetDirtyStatus(PDEVICE_EXTENSION DeviceExt, PBOOLEAN DirtyStatus)
struct _FATXDirEntry * PFATX_DIR_ENTRY
NTSTATUS VfatReadDisk(IN PDEVICE_OBJECT pDeviceObject, IN PLARGE_INTEGER ReadOffset, IN ULONG ReadLength, IN PUCHAR Buffer, IN BOOLEAN Override)
NTSTATUS SetDirtyStatus(PDEVICE_EXTENSION DeviceExt, BOOLEAN DirtyStatus)
FORCEINLINE NTSTATUS VfatAddEntry(PDEVICE_EXTENSION DeviceExt, PUNICODE_STRING NameU, struct _VFATFCB **Fcb, struct _VFATFCB *ParentFcb, ULONG RequestedOptions, UCHAR ReqAttr, struct _VFAT_MOVE_CONTEXT *MoveContext)
BOOLEAN VfatCheckForDismount(IN PDEVICE_EXTENSION DeviceExt, IN BOOLEAN Create)
struct _HASHENTRY HASHENTRY
NTSTATUS FAT32GetDirtyStatus(PDEVICE_EXTENSION DeviceExt, PBOOLEAN DirtyStatus)
struct DEVICE_EXTENSION * PVCB
BOOLEAN vfatFindDirSpace(PDEVICE_EXTENSION DeviceExt, PVFATFCB pDirFcb, ULONG nbSlots, PULONG start)
PVFATFCB vfatGrabFCBFromTable(PDEVICE_EXTENSION pDeviceExt, PUNICODE_STRING pFileNameU)
union _DIR_ENTRY * PDIR_ENTRY
VOID vfatDestroyFCB(PVFATFCB pFCB)
NTSTATUS vfatAttachFCBToFileObject(PDEVICE_EXTENSION vcb, PVFATFCB fcb, PFILE_OBJECT fileObject)
VOID vfatDestroyCCB(PVFATCCB pCcb)
NTSTATUS VfatCleanup(PVFAT_IRP_CONTEXT IrpContext)
struct _STATISTICS STATISTICS
NTSTATUS FAT32WriteCluster(PDEVICE_EXTENSION DeviceExt, ULONG ClusterToWrite, ULONG NewValue, PULONG OldValue)
NTSTATUS VfatWriteDiskPartial(IN PVFAT_IRP_CONTEXT IrpContext, IN PLARGE_INTEGER WriteOffset, IN ULONG WriteLength, IN ULONG BufferOffset, IN BOOLEAN Wait)
NTSTATUS(* PSET_DIRTY_STATUS)(PDEVICE_EXTENSION, BOOLEAN)
FORCEINLINE BOOLEAN vfatFCBIsDirectory(PVFATFCB FCB)
VOID VfatInitFastIoRoutines(PFAST_IO_DISPATCH FastIoDispatch)
BOOLEAN FsdDosDateTimeToSystemTime(PDEVICE_EXTENSION DeviceExt, USHORT DosDate, USHORT DosTime, PLARGE_INTEGER SystemTime)
struct __DOSTIME * PDOSTIME
struct DEVICE_EXTENSION VCB
BOOLEAN IsDotOrDotDot(PCUNICODE_STRING Name)
NTSTATUS vfatMakeFCBFromDirEntry(PVCB vcb, PVFATFCB directoryFCB, PVFAT_DIRENTRY_CONTEXT DirContext, PVFATFCB *fileFCB)
DRIVER_DISPATCH VfatBuildRequest
NTSTATUS FAT32UpdateFreeClustersCount(PDEVICE_EXTENSION DeviceExt)
NTSTATUS VfatLockUserBuffer(IN PIRP Irp, IN ULONG Length, IN LOCK_OPERATION Operation)
NTSTATUS VfatMoveEntry(IN PDEVICE_EXTENSION DeviceExt, IN PVFATFCB pFcb, IN PUNICODE_STRING FileName, IN PVFATFCB ParentFcb)
NTSTATUS(* PGET_DIRTY_STATUS)(PDEVICE_EXTENSION, PBOOLEAN)
NTSTATUS vfatSetFCBNewDirName(PDEVICE_EXTENSION pVCB, PVFATFCB Fcb, PVFATFCB ParentFcb)
NTSTATUS VfatFileSystemControl(PVFAT_IRP_CONTEXT IrpContext)
FORCEINLINE BOOLEAN VfatIsDirectoryEmpty(PDEVICE_EXTENSION DeviceExt, struct _VFATFCB *Fcb)
NTSTATUS VfatDirectoryControl(PVFAT_IRP_CONTEXT IrpContext)
BOOLEAN NTAPI VfatAcquireForLazyWrite(IN PVOID Context, IN BOOLEAN Wait)
NTSTATUS VfatFlush(PVFAT_IRP_CONTEXT IrpContext)
FORCEINLINE NTSTATUS VfatGetNextDirEntry(PDEVICE_EXTENSION DeviceExt, PVOID *pContext, PVOID *pPage, struct _VFATFCB *pDirFcb, struct _VFAT_DIRENTRY_CONTEXT *DirContext, BOOLEAN First)
DRIVER_DISPATCH VfatShutdown
NTSTATUS VfatSetAllocationSizeInformation(PFILE_OBJECT FileObject, PVFATFCB Fcb, PDEVICE_EXTENSION DeviceExt, PLARGE_INTEGER AllocationSize)
NTSTATUS VfatPnp(PVFAT_IRP_CONTEXT IrpContext)
NTSTATUS FAT12WriteCluster(PDEVICE_EXTENSION DeviceExt, ULONG ClusterToWrite, ULONG NewValue, PULONG OldValue)
NTSTATUS WriteCluster(PDEVICE_EXTENSION DeviceExt, ULONG ClusterToWrite, ULONG NewValue)
NTSTATUS FAT16FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt, PULONG Cluster)
NTSTATUS GetNextClusterExtend(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster, PULONG NextCluster)
NTSTATUS OffsetToCluster(PDEVICE_EXTENSION DeviceExt, ULONG FirstCluster, ULONG FileOffset, PULONG Cluster, BOOLEAN Extend)
NTSTATUS vfatGetFCBForFile(PDEVICE_EXTENSION pVCB, PVFATFCB *pParentFCB, PVFATFCB *pFCB, PUNICODE_STRING pFileNameU)
NTSTATUS FAT12GetNextCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster, PULONG NextCluster)
struct VFAT_GLOBAL_DATA * PVFAT_GLOBAL_DATA
NTSTATUS(* PFIND_AND_MARK_AVAILABLE_CLUSTER)(PDEVICE_EXTENSION, PULONG)
struct _VFAT_MOVE_CONTEXT * PVFAT_MOVE_CONTEXT
NTSTATUS VfatUpdateEntry(IN PDEVICE_EXTENSION DeviceExt, PVFATFCB pFcb)
ULONGLONG ClusterToSector(PDEVICE_EXTENSION DeviceExt, ULONG Cluster)
NTSTATUS VfatQueryInformation(PVFAT_IRP_CONTEXT IrpContext)
NTSTATUS VfatSetExtendedAttributes(PFILE_OBJECT FileObject, PVOID Ea, ULONG EaLength)
VOID NTAPI VfatHandleDeferredWrite(IN PVOID IrpContext, IN PVOID Unused)
NTSTATUS FAT32SetDirtyStatus(PDEVICE_EXTENSION DeviceExt, BOOLEAN DirtyStatus)
PVFATFCB vfatNewFCB(PDEVICE_EXTENSION pVCB, PUNICODE_STRING pFileNameU)
struct VFAT_IRP_CONTEXT * PVFAT_IRP_CONTEXT
NTSTATUS FAT16GetNextCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster, PULONG NextCluster)
struct _VFATCCB * PVFATCCB
VOID vfat8Dot3ToString(PFAT_DIR_ENTRY pEntry, PUNICODE_STRING NameU)
NTSTATUS VfatClose(PVFAT_IRP_CONTEXT IrpContext)
FORCEINLINE NTSTATUS VfatDelEntry(PDEVICE_EXTENSION DeviceExt, struct _VFATFCB *Fcb, struct _VFAT_MOVE_CONTEXT *MoveContext)
NTSTATUS FAT16WriteCluster(PDEVICE_EXTENSION DeviceExt, ULONG ClusterToWrite, ULONG NewValue, PULONG OldValue)
struct _EAFileHeader * PFAT_EA_FILE_HEADER
NTSTATUS VfatFlushVolume(PDEVICE_EXTENSION DeviceExt, PVFATFCB VolumeFcb)
struct __DOSDATE * PDOSDATE
VOID vfatReleaseFCB(PDEVICE_EXTENSION pVCB, PVFATFCB pFCB)
BOOLEAN(* PIS_DIRECTORY_EMPTY)(PDEVICE_EXTENSION, struct _VFATFCB *)
NTSTATUS GetDirtyStatus(PDEVICE_EXTENSION DeviceExt, PBOOLEAN DirtyStatus)
NTSTATUS vfatFCBInitializeCacheFromVolume(PVCB vcb, PVFATFCB fcb)
PVOID VfatGetUserBuffer(IN PIRP Irp, IN BOOLEAN Paging)
VOID NTAPI VfatReleaseFromLazyWrite(IN PVOID Context)
NTSTATUS VfatBlockDeviceIoControl(IN PDEVICE_OBJECT DeviceObject, IN ULONG CtlCode, IN PVOID InputBuffer, IN ULONG InputBufferSize, IN OUT PVOID OutputBuffer, IN OUT PULONG pOutputBufferSize, IN BOOLEAN Override)
struct _VFAT_DIRENTRY_CONTEXT VFAT_DIRENTRY_CONTEXT
NTSTATUS FAT32FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt, PULONG Cluster)
ULONG vfatDirEntryGetFirstCluster(PDEVICE_EXTENSION pDeviceExt, PDIR_ENTRY pDirEntry)
NTSTATUS VfatGetStandardInformation(PVFATFCB FCB, PFILE_STANDARD_INFORMATION StandardInfo, PULONG BufferLength)
NTSTATUS(* PDEL_ENTRY)(PDEVICE_EXTENSION, struct _VFATFCB *, struct _VFAT_MOVE_CONTEXT *)
NTSTATUS VfatReadDiskPartial(IN PVFAT_IRP_CONTEXT IrpContext, IN PLARGE_INTEGER ReadOffset, IN ULONG ReadLength, IN ULONG BufferOffset, IN BOOLEAN Wait)
FORCEINLINE BOOLEAN vfatVolumeIsFatX(PDEVICE_EXTENSION DeviceExt)
struct _EASetHeader * PFAT_EA_SET_HEADER
struct _STATISTICS * PSTATISTICS
#define STATISTICS_SIZE_NO_PAD
struct _VFAT_CLOSE_CONTEXT VFAT_CLOSE_CONTEXT
FORCEINLINE NTSTATUS VfatMarkIrpContextForQueue(PVFAT_IRP_CONTEXT IrpContext)
struct FATINFO * PFATINFO
BOOLEAN FsdSystemTimeToDosDateTime(PDEVICE_EXTENSION DeviceExt, PLARGE_INTEGER SystemTime, USHORT *pDosDate, USHORT *pDosTime)
FORCEINLINE VOID vfatReportChange(IN PDEVICE_EXTENSION DeviceExt, IN PVFATFCB Fcb, IN ULONG FilterMatch, IN ULONG Action)
VOID vfatGrabFCB(PDEVICE_EXTENSION pVCB, PVFATFCB pFCB)
struct _VFAT_DISPATCH VFAT_DISPATCH
NTSTATUS VfatCreate(PVFAT_IRP_CONTEXT IrpContext)
NTSTATUS(* PGET_NEXT_CLUSTER)(PDEVICE_EXTENSION, ULONG, PULONG)
NTSTATUS(* PWRITE_CLUSTER)(PDEVICE_EXTENSION, ULONG, ULONG, PULONG)
struct DEVICE_EXTENSION * PDEVICE_EXTENSION
_In_ PDEVICE_OBJECT DeviceObject
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG BufferLength
_In_ WDFDPC _In_ BOOLEAN Wait
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR OutputBuffer
_In_ WDFIOTARGET _In_ _Strict_type_match_ WDF_IO_TARGET_SENT_IO_ACTION Action
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR InputBuffer
_Must_inspect_result_ _In_ WDFUSBPIPE _In_ WDFREQUEST _In_opt_ WDFMEMORY _In_opt_ PWDFMEMORY_OFFSET ReadOffset
_Must_inspect_result_ _In_ WDFUSBPIPE _In_ WDFREQUEST _In_opt_ WDFMEMORY _In_opt_ PWDFMEMORY_OFFSET WriteOffset
_Must_inspect_result_ _In_ ULONG Flags
struct LOOKASIDE_ALIGN _PAGED_LOOKASIDE_LIST PAGED_LOOKASIDE_LIST
struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST NPAGED_LOOKASIDE_LIST
enum _LOCK_OPERATION LOCK_OPERATION