38 #define CACHEPAGESIZE(pDeviceExt) ((pDeviceExt)->FatInfo.BytesPerCluster > PAGE_SIZE ? \ 39 (pDeviceExt)->FatInfo.BytesPerCluster : PAGE_SIZE) 60 DPRINT(
"VfatHasFileSystem\n");
62 *RecognizedFS =
FALSE;
74 DPRINT(
"VfatBlockDeviceIoControl failed (%x)\n",
Status);
92 DPRINT(
"VfatBlockDeviceIoControl failed (%x)\n",
Status);
96 DPRINT(
"Partition Information:\n");
114 PartitionInfoIsValid =
TRUE;
115 *RecognizedFS =
TRUE;
124 PartitionInfoIsValid =
TRUE;
125 *RecognizedFS =
TRUE;
130 *RecognizedFS =
TRUE;
147 if (Boot->Signatur1 != 0xaa55)
149 *RecognizedFS =
FALSE;
153 Boot->BytesPerSector != 512 &&
154 Boot->BytesPerSector != 1024 &&
155 Boot->BytesPerSector != 2048 &&
156 Boot->BytesPerSector != 4096)
158 DPRINT1(
"BytesPerSector %u\n", Boot->BytesPerSector);
159 *RecognizedFS =
FALSE;
163 Boot->FATCount != 1 &&
166 DPRINT1(
"FATCount %u\n", Boot->FATCount);
167 *RecognizedFS =
FALSE;
171 Boot->Media != 0xf0 &&
172 Boot->Media != 0xf8 &&
173 Boot->Media != 0xf9 &&
174 Boot->Media != 0xfa &&
175 Boot->Media != 0xfb &&
176 Boot->Media != 0xfc &&
177 Boot->Media != 0xfd &&
178 Boot->Media != 0xfe &&
181 DPRINT1(
"Media %02x\n", Boot->Media);
182 *RecognizedFS =
FALSE;
186 Boot->SectorsPerCluster != 1 &&
187 Boot->SectorsPerCluster != 2 &&
188 Boot->SectorsPerCluster != 4 &&
189 Boot->SectorsPerCluster != 8 &&
190 Boot->SectorsPerCluster != 16 &&
191 Boot->SectorsPerCluster != 32 &&
192 Boot->SectorsPerCluster != 64 &&
193 Boot->SectorsPerCluster != 128)
195 DPRINT1(
"SectorsPerCluster %02x\n", Boot->SectorsPerCluster);
196 *RecognizedFS =
FALSE;
200 Boot->BytesPerSector * Boot->SectorsPerCluster > 64 * 1024)
202 DPRINT1(
"ClusterSize %d\n", Boot->BytesPerSector * Boot->SectorsPerCluster);
203 *RecognizedFS =
FALSE;
209 FatInfo.
FATStart = Boot->ReservedSectors;
215 FatInfo.
rootDirectorySectors = ((Boot->RootEntries * 32) + Boot->BytesPerSector - 1) / Boot->BytesPerSector;
218 FatInfo.
Sectors =
Sectors = Boot->Sectors ? Boot->Sectors : Boot->SectorsHuge;
246 if (PartitionInfoIsValid &&
249 *RecognizedFS =
FALSE;
252 if (pFatInfo && *RecognizedFS)
262 if (!*RecognizedFS && PartitionInfoIsValid)
265 if (BootFatX ==
NULL)
277 *RecognizedFS =
TRUE;
278 if (BootFatX->SysType[0] !=
'F' ||
279 BootFatX->SysType[1] !=
'A' ||
280 BootFatX->SysType[2] !=
'T' ||
281 BootFatX->SysType[3] !=
'X')
283 DPRINT1(
"SysType %02X%02X%02X%02X (%c%c%c%c)\n",
284 BootFatX->SysType[0], BootFatX->SysType[1], BootFatX->SysType[2], BootFatX->SysType[3],
285 isprint(BootFatX->SysType[0]) ? BootFatX->SysType[0] :
'.',
286 isprint(BootFatX->SysType[1]) ? BootFatX->SysType[1] :
'.',
287 isprint(BootFatX->SysType[2]) ? BootFatX->SysType[2] :
'.',
288 isprint(BootFatX->SysType[3]) ? BootFatX->SysType[3] :
'.');
290 *RecognizedFS =
FALSE;
294 BootFatX->SectorsPerCluster != 1 &&
295 BootFatX->SectorsPerCluster != 2 &&
296 BootFatX->SectorsPerCluster != 4 &&
297 BootFatX->SectorsPerCluster != 8 &&
298 BootFatX->SectorsPerCluster != 16 &&
299 BootFatX->SectorsPerCluster != 32 &&
300 BootFatX->SectorsPerCluster != 64 &&
301 BootFatX->SectorsPerCluster != 128)
303 DPRINT1(
"SectorsPerCluster %lu\n", BootFatX->SectorsPerCluster);
324 FatInfo.
VolumeID = BootFatX->VolumeID;
326 FatInfo.
FATCount = BootFatX->FATCount;
335 if (pFatInfo && *RecognizedFS)
344 DPRINT(
"VfatHasFileSystem done\n");
375 ULONG EntriesPerPage;
450 StringO.MaximumLength = StringO.Length =
Entry->FatX.FilenameLength;
465 if ((DirIndex % EntriesPerPage) == 0)
544 DPRINT(
"VfatMount(IrpContext %p)\n", IrpContext);
554 DeviceToMount = IrpContext->
Stack->
Parameters.MountVolume.DeviceObject;
563 if (RecognizedFS ==
FALSE)
565 DPRINT(
"VFAT: Unrecognized Volume\n");
573 HashTableSize = 4099;
578 HashTableSize = 16411;
582 HashTableSize = 65537;
584 DPRINT(
"VFAT: Recognized volume\n");
589 DeviceToMount->Characteristics,
600 DeviceExt->HashTableSize = HashTableSize;
605 DeviceExt->OverflowQueueCount = 0;
606 DeviceExt->PostedRequestCount = 0;
610 DeviceToMount->Vpb =
Vpb;
614 DPRINT(
"BytesPerSector: %u\n", DeviceExt->FatInfo.BytesPerSector);
615 DPRINT(
"SectorsPerCluster: %u\n", DeviceExt->FatInfo.SectorsPerCluster);
616 DPRINT(
"FATCount: %u\n", DeviceExt->FatInfo.FATCount);
617 DPRINT(
"FATSectors: %u\n", DeviceExt->FatInfo.FATSectors);
618 DPRINT(
"RootStart: %u\n", DeviceExt->FatInfo.rootStart);
619 DPRINT(
"DataStart: %u\n", DeviceExt->FatInfo.dataStart);
620 if (DeviceExt->FatInfo.FatType ==
FAT32)
622 DPRINT(
"RootCluster: %u\n", DeviceExt->FatInfo.RootCluster);
625 switch (DeviceExt->FatInfo.FatType)
655 if (DeviceExt->FatInfo.FatType ==
FATX16 ||
656 DeviceExt->FatInfo.FatType ==
FATX32)
659 DeviceExt->BaseDateYear = 2000;
664 DeviceExt->BaseDateYear = 1980;
668 DeviceExt->StorageDevice = DeviceToMount;
669 DeviceExt->StorageDevice->Vpb->DeviceObject =
DeviceObject;
670 DeviceExt->StorageDevice->Vpb->RealDevice = DeviceExt->StorageDevice;
671 DeviceExt->StorageDevice->Vpb->Flags |=
VPB_MOUNTED;
672 DeviceObject->StackSize = DeviceExt->StorageDevice->StackSize + 1;
682 if (DeviceExt->SpareVPB ==
NULL)
691 if (DeviceExt->Statistics ==
NULL)
701 DeviceExt->Statistics[
i].Base.Version = 1;
702 DeviceExt->Statistics[
i].Base.SizeOfCompleteStructure =
sizeof(
STATISTICS);
717 DeviceExt->FATFileObject->PrivateCacheMap =
NULL;
740 DeviceExt->LastAvailableCluster = 2;
746 VolumeFcb =
vfatNewFCB(DeviceExt, &VolumeNameU);
747 if (VolumeFcb ==
NULL)
757 DeviceExt->VolumeFcb = VolumeFcb;
764 DeviceObject->Vpb->SerialNumber = DeviceExt->FatInfo.VolumeID;
771 Vpb->VolumeLabelLength = VolumeLabelU.
Length;
786 DPRINT1(
"Mounting a dirty volume\n");
806 DPRINT(
"Mount success\n");
814 if (DeviceExt && DeviceExt->FATFileObject)
825 DeviceExt->FATFileObject =
NULL;
829 if (DeviceExt && DeviceExt->SpareVPB)
831 if (DeviceExt && DeviceExt->Statistics)
858 DPRINT(
"VfatVerify(IrpContext %p)\n", IrpContext);
867 DPRINT(
"Already verified\n");
880 DPRINT(
"VfatBlockDeviceIoControl() failed (Status %lx)\n",
Status);
899 VolumeLabelU.
Buffer = BufferU;
900 VolumeLabelU.Length = 0;
901 VolumeLabelU.MaximumLength =
sizeof(BufferU);
913 VpbLabelU.
Length =
Vpb->VolumeLabelLength;
943 DPRINT(
"VfatGetVolumeBitmap (IrpContext %p)\n", IrpContext);
957 ULONG MaxExtentCount;
961 ULONG CurrentCluster;
965 DPRINT(
"VfatGetRetrievalPointers(IrpContext %p)\n", IrpContext);
971 Stack->Parameters.DeviceIoControl.Type3InputBuffer ==
NULL)
976 if (IrpContext->
Irp->UserBuffer ==
NULL ||
987 RetrievalPointers = IrpContext->
Irp->UserBuffer;
989 MaxExtentCount = ((
Stack->Parameters.DeviceIoControl.OutputBufferLength -
sizeof(RetrievalPointers->
ExtentCount) -
sizeof(RetrievalPointers->
StartingVcn)) /
sizeof(RetrievalPointers->
Extents[0]));
999 Vcn.
u.LowPart * DeviceExt->FatInfo.BytesPerCluster,
1000 &CurrentCluster,
FALSE);
1008 RetrievalPointers->
Extents[0].Lcn.u.HighPart = 0;
1009 RetrievalPointers->
Extents[0].Lcn.u.LowPart = CurrentCluster - 2;
1011 while (CurrentCluster != 0xffffffff && RetrievalPointers->
ExtentCount < MaxExtentCount)
1013 LastCluster = CurrentCluster;
1021 if (LastCluster + 1 != CurrentCluster)
1025 if (RetrievalPointers->
ExtentCount < MaxExtentCount)
1028 RetrievalPointers->
Extents[RetrievalPointers->
ExtentCount].Lcn.u.LowPart = CurrentCluster - 2;
1047 DPRINT(
"VfatMoveFile(IrpContext %p)\n", IrpContext);
1058 DPRINT(
"VfatIsVolumeDirty(IrpContext %p)\n", IrpContext);
1062 else if (!IrpContext->
Irp->AssociatedIrp.SystemBuffer)
1087 DPRINT(
"VfatMarkVolumeDirty(IrpContext %p)\n", IrpContext);
1111 DPRINT(
"VfatLockOrUnlockVolume(%p, %d)\n", IrpContext,
Lock);
1116 Vpb = DeviceExt->FATFileObject->Vpb;
1144 if (
Lock && DeviceExt->OpenHandleCount != 1)
1156 ULONG HandleCount = 0;
1162 ListEntry = DeviceExt->FcbListHead.Flink;
1163 while (ListEntry != &DeviceExt->FcbListHead)
1166 ListEntry = ListEntry->
Flink;
1195 if (HandleCount > 2)
1212 DPRINT1(
"Can't lock: %u opened\n", DeviceExt->OpenHandleCount);
1214 ListEntry = DeviceExt->FcbListHead.Flink;
1215 while (ListEntry != &DeviceExt->FcbListHead)
1218 ListEntry = ListEntry->
Flink;
1237 DPRINT1(
"HACK: Using lock-hack!\n");
1281 DPRINT(
"VfatDismountVolume(%p)\n", IrpContext);
1329 if (
Fcb == DeviceExt->RootFcb)
1330 DeviceExt->RootFcb =
NULL;
1331 else if (
Fcb == DeviceExt->VolumeFcb)
1332 DeviceExt->VolumeFcb =
NULL;
1342 #ifndef ENABLE_SWAPOUT 1363 Buffer = IrpContext->
Irp->AssociatedIrp.SystemBuffer;
1400 DPRINT(
"VfatFileSystemControl(IrpContext %p)\n", IrpContext);
1460 DPRINT(
"VFATFS: IRP_MN_VERIFY_VOLUME\n");
VFAT_DISPATCH FatDispatch
NTSTATUS FAT12WriteCluster(PDEVICE_EXTENSION DeviceExt, ULONG ClusterToWrite, ULONG NewValue, PULONG OldValue)
#define DO_DEVICE_INITIALIZING
static NTSTATUS VfatVerify(PVFAT_IRP_CONTEXT IrpContext)
#define FSRTL_VOLUME_DISMOUNT
struct _FATDirEntry FAT_DIR_ENTRY
NTSTATUS NextCluster(PDEVICE_EXTENSION DeviceExt, ULONG FirstCluster, PULONG CurrentCluster, BOOLEAN Extend)
#define FSCTL_UNLOCK_VOLUME
struct STARTING_VCN_INPUT_BUFFER * PSTARTING_VCN_INPUT_BUFFER
LIST_ENTRY VolumeListHead
#define ENTRY_END(IsFatX, DirEntry)
NTSTATUS CountAvailableClusters(PDEVICE_EXTENSION DeviceExt, PLARGE_INTEGER Clusters)
#define STATUS_INSUFFICIENT_RESOURCES
_In_ ULONG _In_ ULONG _In_ ULONG Length
struct _FATXDirEntry FATX_DIR_ENTRY
#define ROUND_UP(n, align)
static NTSTATUS VfatMount(PVFAT_IRP_CONTEXT IrpContext)
struct RETRIEVAL_POINTERS_BUFFER::@3291 Extents[1]
PDEVICE_EXTENSION DeviceExt
IN BOOLEAN OUT PSTR Buffer
struct _VFATCCB * PVFATCCB
ULONG vfatDirEntryGetFirstCluster(PDEVICE_EXTENSION pDeviceExt, PDIR_ENTRY pFatDirEntry)
#define STATUS_INVALID_PARAMETER
#define BooleanFlagOn(F, SF)
FORCEINLINE VOID InsertHeadList(_Inout_ PLIST_ENTRY ListHead, _Inout_ __drv_aliasesMem PLIST_ENTRY Entry)
NTSTATUS FAT16GetDirtyStatus(PDEVICE_EXTENSION DeviceExt, PBOOLEAN DirtyStatus)
PDRIVER_OBJECT DriverObject
PVFATFCB vfatOpenRootFCB(PDEVICE_EXTENSION pVCB)
NTSTATUS vfatAttachFCBToFileObject(PDEVICE_EXTENSION vcb, PVFATFCB fcb, PFILE_OBJECT fileObject)
FORCEINLINE PLIST_ENTRY RemoveTailList(_Inout_ PLIST_ENTRY ListHead)
#define IOCTL_DISK_CHECK_VERIFY
NTSTATUS FAT32GetNextCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster, PULONG NextCluster)
VOID NTAPI CcUnpinData(IN PVOID Bcb)
#define FSRTL_VOLUME_UNLOCK
static NTSTATUS ReadVolumeLabel(PVOID Device, ULONG Start, BOOLEAN IsFatX, PUNICODE_STRING VolumeLabel)
VOID vfat8Dot3ToString(PFAT_DIR_ENTRY pEntry, PUNICODE_STRING NameU)
NTSTATUS VfatFlushVolume(PDEVICE_EXTENSION DeviceExt, PVFATFCB VolumeFcb)
NTSTATUS ExInitializeResourceLite(PULONG res)
FORCEINLINE BOOLEAN vfatFCBIsDirectory(PVFATFCB FCB)
#define STATUS_INVALID_DEVICE_REQUEST
IN PVOID IN PVOID IN USHORT IN USHORT Size
#define FAT_ENTRIES_PER_PAGE
NTSTATUS FAT32SetDirtyStatus(PDEVICE_EXTENSION DeviceExt, BOOLEAN DirtyStatus)
#define STATUS_WRONG_VOLUME
NTSTATUS FAT32FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt, PULONG Cluster)
#define STATUS_VERIFY_REQUIRED
struct _PARTITION_INFORMATION PARTITION_INFORMATION
#define FSCTL_MARK_VOLUME_DIRTY
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
#define ENTRY_VOLUME(IsFatX, DirEntry)
static NTSTATUS VfatHasFileSystem(PDEVICE_OBJECT DeviceToMount, PBOOLEAN RecognizedFS, PFATINFO pFatInfo, BOOLEAN Override)
#define STATUS_BUFFER_TOO_SMALL
BOOLEAN NTAPI ExAcquireResourceExclusiveLite(IN PERESOURCE Resource, IN BOOLEAN Wait)
#define FSRTL_VOLUME_LOCK_FAILED
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
_In_ PDEVICE_OBJECT DeviceObject
#define IRP_MN_VERIFY_VOLUME
NTSTATUS GetDirtyStatus(PDEVICE_EXTENSION DeviceExt, PBOOLEAN DirtyStatus)
#define STATUS_UNRECOGNIZED_VOLUME
static NTSTATUS VfatGetVolumeBitmap(PVFAT_IRP_CONTEXT IrpContext)
#define STATUS_INVALID_USER_BUFFER
#define EXCEPTION_EXECUTE_HANDLER
LARGE_INTEGER StartingVcn
FORCEINLINE VOID KeInitializeSpinLock(_Out_ PKSPIN_LOCK SpinLock)
NTSTATUS FAT12FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt, PULONG Cluster)
NTSTATUS FAT12GetNextCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster, PULONG NextCluster)
#define DO_SYSTEM_BOOT_PARTITION
NTSTATUS FAT32WriteCluster(PDEVICE_EXTENSION DeviceExt, ULONG ClusterToWrite, ULONG NewValue, PULONG OldValue)
NTSTATUS FAT16FindAndMarkAvailableCluster(PDEVICE_EXTENSION DeviceExt, PULONG Cluster)
#define MAXIMUM_VOLUME_LABEL_LENGTH
NTSTATUS VfatReadDisk(IN PDEVICE_OBJECT pDeviceObject, IN PLARGE_INTEGER ReadOffset, IN ULONG ReadLength, IN OUT PUCHAR Buffer, IN BOOLEAN Override)
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
struct _LARGE_INTEGER::@2284 u
PFILE_OBJECT NTAPI IoCreateStreamFileObject(IN PFILE_OBJECT FileObject, IN PDEVICE_OBJECT DeviceObject)
FSRTL_COMMON_FCB_HEADER RFCB
#define FSCTL_FILESYSTEM_GET_STATISTICS
#define FILE_DEVICE_DISK_FILE_SYSTEM
#define FSCTL_DISMOUNT_VOLUME
#define STATUS_INVALID_BUFFER_SIZE
FORCEINLINE BOOLEAN vfatVolumeIsFatX(PDEVICE_EXTENSION DeviceExt)
#define IRP_MN_MOUNT_VOLUME
struct _LIST_ENTRY * Flink
#define IRP_MN_USER_FS_REQUEST
BOOLEAN NTAPI CcMapData(IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN ULONG Length, IN ULONG Flags, OUT PVOID *BcbResult, OUT PVOID *Buffer)
PDEVICE_OBJECT DeviceObject
_Must_inspect_result_ _In_ ULONG Flags
#define FATX_ENTRIES_PER_PAGE
NTSTATUS NTAPI FsRtlNotifyVolumeEvent(IN PFILE_OBJECT FileObject, IN ULONG EventCode)
union _DIR_ENTRY * PDIR_ENTRY
VFAT_DISPATCH FatXDispatch
#define NT_SUCCESS(StatCode)
VOID NTAPI CcInitializeCacheMap(IN PFILE_OBJECT FileObject, IN PCC_FILE_SIZES FileSizes, IN BOOLEAN PinAccess, IN PCACHE_MANAGER_CALLBACKS Callbacks, IN PVOID LazyWriteContext)
#define ObDereferenceObject
_In_ ULONG _In_ struct _SET_PARTITION_INFORMATION_EX * PartitionInfo
static NTSTATUS VfatMarkVolumeDirty(PVFAT_IRP_CONTEXT IrpContext)
VOID vfatDestroyFCB(PVFATFCB pFCB)
#define STATUS_ACCESS_DENIED
static NTSTATUS VfatLockOrUnlockVolume(PVFAT_IRP_CONTEXT IrpContext, BOOLEAN Lock)
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
#define SL_ALLOW_RAW_MOUNT
FSRTL_COMMON_FCB_HEADER RFCB
#define ExAllocatePoolWithTag(hernya, size, tag)
VOID vfatDestroyCCB(PVFATCCB pCcb)
#define IRP_MN_KERNEL_CALL
static NTSTATUS VfatIsVolumeDirty(PVFAT_IRP_CONTEXT IrpContext)
#define IOCTL_DISK_GET_PARTITION_INFO
#define VCB_DISMOUNT_PENDING
ULONG RtlCompareUnicodeString(PUNICODE_STRING s1, PUNICODE_STRING s2, BOOLEAN UpCase)
static NTSTATUS VfatGetRetrievalPointers(PVFAT_IRP_CONTEXT IrpContext)
#define FSCTL_GET_RETRIEVAL_POINTERS
ULONG rootDirectorySectors
_Inout_ PFILE_OBJECT _In_ TYPE_OF_OPEN PFCB _In_opt_ PCCB Ccb
_Must_inspect_result_ _In_ WDFDEVICE Device
NTSYSAPI NTSTATUS NTAPI RtlOemStringToUnicodeString(PUNICODE_STRING DestinationString, PCOEM_STRING SourceString, BOOLEAN AllocateDestinationString)
NTSTATUS VfatFileSystemControl(PVFAT_IRP_CONTEXT IrpContext)
ClearFlag(Dirent->Flags, DIRENT_FLAG_NOT_PERSISTENT)
static NTSTATUS VfatDismountVolume(PVFAT_IRP_CONTEXT IrpContext)
_In_ ULONG _In_ ULONG Offset
static NTSTATUS VfatGetStatistics(PVFAT_IRP_CONTEXT IrpContext)
PVFAT_GLOBAL_DATA VfatGlobalData
CACHE_MANAGER_CALLBACKS CacheMgrCallbacks
NTSTATUS FAT32GetDirtyStatus(PDEVICE_EXTENSION DeviceExt, PBOOLEAN DirtyStatus)
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
struct _DISK_GEOMETRY DISK_GEOMETRY
#define FSRTL_VOLUME_LOCK
struct RETRIEVAL_POINTERS_BUFFER RETRIEVAL_POINTERS_BUFFER
#define STATUS_BUFFER_OVERFLOW
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
NTSTATUS VfatBlockDeviceIoControl(IN PDEVICE_OBJECT DeviceObject, IN ULONG CtlCode, IN PVOID InputBuffer OPTIONAL, IN ULONG InputBufferSize, IN OUT PVOID OutputBuffer OPTIONAL, IN OUT PULONG OutputBufferSize, IN BOOLEAN Override)
BOOLEAN NTAPI CcUninitializeCacheMap(IN PFILE_OBJECT FileObject, IN OPTIONAL PLARGE_INTEGER TruncateSize, IN OPTIONAL PCACHE_UNINITIALIZE_EVENT UninitializeEvent)
_In_ PFCB _In_ LONGLONG FileOffset
#define FSCTL_GET_VOLUME_BITMAP
#define InitializeListHead(ListHead)
#define VCB_IS_SYS_OR_HAS_PAGE
PVFATFCB vfatNewFCB(PDEVICE_EXTENSION pVCB, PUNICODE_STRING pFileNameU)
PDEVICE_OBJECT DeviceObject
#define FSCTL_IS_VOLUME_DIRTY
BOOLEAN NTAPI ExAcquireResourceSharedLite(IN PERESOURCE Resource, IN BOOLEAN Wait)
IN PVCB IN VBO IN ULONG OUT PBCB OUT PVOID IN BOOLEAN IN BOOLEAN Zero
struct _STATISTICS STATISTICS
#define VCB_VOLUME_LOCKED
VOID NTAPI FsRtlNotifyInitializeSync(IN PNOTIFY_SYNC *NotifySync)
NTSTATUS FAT16GetNextCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster, PULONG NextCluster)
#define STATUS_VOLUME_DISMOUNTED
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWAITLOCK * Lock
#define FSRTL_VOLUME_MOUNT
#define FSCTL_LOCK_VOLUME
NTSTATUS FAT16SetDirtyStatus(PDEVICE_EXTENSION DeviceExt, BOOLEAN DirtyStatus)
NTSTATUS NTAPI IoCreateDevice(IN PDRIVER_OBJECT DriverObject, IN ULONG DeviceExtensionSize, IN PUNICODE_STRING DeviceName, IN DEVICE_TYPE DeviceType, IN ULONG DeviceCharacteristics, IN BOOLEAN Exclusive, OUT PDEVICE_OBJECT *DeviceObject)
#define RtlZeroMemory(Destination, Length)
#define RtlCopyMemory(Destination, Source, Length)
VOID vfatReleaseFCB(PDEVICE_EXTENSION pVCB, PVFATFCB pFCB)
NTSTATUS FAT16WriteCluster(PDEVICE_EXTENSION DeviceExt, ULONG ClusterToWrite, ULONG NewValue, PULONG OldValue)
#define _SEH2_EXCEPT(...)
#define PARTITION_FAT32_XINT13
#define ExFreePoolWithTag(_P, _T)
#define _SEH2_GetExceptionCode()
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
NTSTATUS SetDirtyStatus(PDEVICE_EXTENSION DeviceExt, BOOLEAN DirtyStatus)
static NTSTATUS VfatMoveFile(PVFAT_IRP_CONTEXT IrpContext)
base of all file and directory entries
IN OUT PVCB IN PDEVICE_OBJECT IN PVPB Vpb
#define IOCTL_DISK_GET_DRIVE_GEOMETRY
#define FILESYSTEM_STATISTICS_TYPE_FAT
_Inout_ PIRP _In_ PDEVICE_OBJECT DeviceToVerify
#define RtlCompareMemory(s1, s2, l)
#define RTL_CONSTANT_STRING(s)
NTSTATUS OffsetToCluster(PDEVICE_EXTENSION DeviceExt, ULONG FirstCluster, ULONG FileOffset, PULONG Cluster, BOOLEAN Extend)