23#define BugCheckFileId (FAT_BUG_CHECK_VERFYSUP)
29#define Dbg (DEBUG_TRACE_VERFYSUP)
50FatDetermineAndMarkFcbCondition (
74#pragma alloc_text(PAGE, FatCheckDirtyBit)
75#pragma alloc_text(PAGE, FatVerifyOperationIsLegal)
76#pragma alloc_text(PAGE, FatDeferredCleanVolume)
77#pragma alloc_text(PAGE, FatMatchFileSize)
78#pragma alloc_text(PAGE, FatDetermineAndMarkFcbCondition)
79#pragma alloc_text(PAGE, FatQuickVerifyVcb)
80#pragma alloc_text(PAGE, FatPerformVerify)
81#pragma alloc_text(PAGE, FatMarkFcbCondition)
82#pragma alloc_text(PAGE, FatResetFcb)
83#pragma alloc_text(PAGE, FatVerifyVcb)
84#pragma alloc_text(PAGE, FatVerifyFcb)
175 (FcbCondition ==
FcbBad)) &&
241#pragma prefast( push )
242#pragma prefast( disable: 28175, "touching Vpb is ok for a filesystem" )
245 if (
Vcb->Vpb->RealDevice->Vpb ==
Vcb->Vpb) {
260#pragma prefast( pop )
323 if (!DevMarkedForVerify &&
325 (IrpContext->OriginatingIrp !=
NULL)) {
332 DevMarkedForVerify =
TRUE;
340 if (DevMarkedForVerify) {
345 Vcb->Vpb->RealDevice );
454 FatDetermineAndMarkFcbCondition(IrpContext,
CurrentFcb);
486#pragma prefast( suppress:28159, "things are seriously wrong if we get here" )
557#pragma prefast( push )
558#pragma prefast( disable: 28193, "this will always wait" )
562#pragma prefast( pop )
567 Links = Links->
Flink) {
573 if (
Vcb == ExistingVcb ) {
703 &
Vcb->CleanVolumeDpc );
728#pragma prefast( suppress:28159, "prefast indicates this is an obsolete API, but it is ok for fastfat to keep using it" )
773 ULONG FsInfoOffset = 0;
809 for (ThisPass = 0; ThisPass < 2; ThisPass++) {
821 Vcb->Bpb.FsInfoSector == 0)) {
844 if (
Vcb->AllocationSupport.FatIndexBitSize == 12) {
870 if (
Vcb->Bpb.FsInfoSector == 1) {
875 FsInfoOffset =
Vcb->Bpb.BytesPerSector;
878 }
else if (ThisPass == 1) {
887 Offset.QuadPart =
Vcb->Bpb.BytesPerSector *
Vcb->Bpb.FsInfoSector;
904 DbgDoit( IrpContext->PinCount += 1 )
993 Vcb->TargetDeviceObject,
1051 while (
Irp->MdlAddress !=
NULL) {
1055 NextMdl =
Irp->MdlAddress->Next;
1061 Irp->MdlAddress = NextMdl;
1129 DebugTrace(+1,
Dbg,
"FatFspMarkVolumeDirtyWithRecover\n", 0);
1143 IrpContext.OriginatingIrp =
Irp;
1180 DebugTrace(-1,
Dbg,
"FatFspMarkVolumeDirtyWithRecover -> VOID\n", 0);
1245 VolumeLabel.
Length =
Vcb->Vpb->VolumeLabelLength;
1247 VolumeLabel.
Buffer = &
Vcb->Vpb->VolumeLabel[0];
1273 "FASTFAT: WARNING! Mounting Dirty Volume %Z\n",
1285 "FASTFAT: Volume %Z has been cleaned.\n",
1332 Irp = IrpContext->OriginatingIrp;
1424 LOGICAL IsRealPagingFile;
1445 IsRealPagingFile =
TRUE;
1449 IsRealPagingFile =
FALSE;
1454 !IsRealPagingFile ) {
1468 Fcb->
Header.AllocationSize.QuadPart = 0;
1523FatDetermineAndMarkFcbCondition (
1553 ULONG FirstClusterOfFile;
1577 FatGetDirentFromFcbOrDcb( IrpContext,
1587 if (DirentBcb ==
NULL) {
1605 Name.MaximumLength = 16;
1619 FirstClusterOfFile +=
Dirent->FirstClusterOfFileHi << 16;
1698 Vcb->Vpb->RealDevice );
1708 switch (
Vcb->VcbCondition) {
1738 Vcb->Vpb->RealDevice );
1758 Vcb->Vpb->RealDevice );
1782#pragma prefast( suppress:28159, "things are seriously wrong if we get here" )
1875 AllowRawMount =
TRUE;
1897 FatAcquireSharedVcb(IrpContext,
Vcb);
1917 (0 ==
Vcb->OpenFileCount) ) {
1922#pragma prefast( push )
1923#pragma prefast( disable: 28137, "prefast wants the wait to be a constant, but that isn't possible for the way fastfat is designed" )
1924#pragma prefast( disable: 28193 )
1928#pragma prefast( pop )
1934 VcbDeleted = FatCheckForDismount( IrpContext,
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
_In_ PFCB _In_ PDIRENT_ENUM_CONTEXT _Inout_ PDIRENT Dirent
_Inout_ PFCB * CurrentFcb
#define VCB_STATE_VPB_NOT_ON_DEVICE
#define IRP_CONTEXT_FLAG_WAIT
enum _FCB_CONDITION FCB_CONDITION
#define _Requires_lock_held_(lock)
#define NT_SUCCESS(StatCode)
_In_ PIO_STACK_LOCATION IrpSp
struct _FSINFO_SECTOR * PFSINFO_SECTOR
#define FatReservedBytes(B)
#define FSINFO_SECTOR_BEGIN_SIGNATURE
#define FSINFO_SECTOR_END_SIGNATURE
#define FAT_BOOT_SECTOR_TEST_SURFACE
#define FAT_BOOT_SECTOR_DIRTY
#define FatBytesPerFat(B)
#define FAT_DIRTY_BIT_INDEX
#define FatBugCheck(A, B, C)
#define ExAllocatePoolWithTag(hernya, size, tag)
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
#define KeInitializeEvent(pEvt, foo, foo2)
#define KeSetEvent(pEvt, foo, foo2)
#define ClearFlag(_F, _SF)
#define IsFileDeleted(Mcb)
#define BooleanFlagOn(F, SF)
VOID FatUnpinRepinnedBcbs(IN PIRP_CONTEXT IrpContext)
VOID FatReadVolumeFile(IN PIRP_CONTEXT IrpContext, IN PVCB Vcb, IN VBO StartingVbo, IN ULONG ByteCount, OUT PBCB *Bcb, OUT PVOID *Buffer)
NTSTATUS FatToggleMediaEjectDisable(IN PIRP_CONTEXT IrpContext, IN PVCB Vcb, IN BOOLEAN PreventRemoval)
VOID FatQuickVerifyVcb(IN PIRP_CONTEXT IrpContext, IN PVCB Vcb)
VOID NTAPI FatDeferredCleanVolume(_In_ PVOID Parameter)
NTSTATUS NTAPI FatMarkVolumeCompletionRoutine(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_reads_opt_(_Inexpressible_("varies")) PVOID Contxt)
VOID FatResetFcb(IN PIRP_CONTEXT IrpContext, IN PFCB Fcb)
BOOLEAN FatMatchFileSize(__in PIRP_CONTEXT IrpContext, __in PDIRENT Dirent, __in PFCB Fcb)
VOID FatCheckDirtyBit(IN PIRP_CONTEXT IrpContext, IN PVCB Vcb)
VOID FatVerifyVcb(IN PIRP_CONTEXT IrpContext, IN PVCB Vcb)
VOID FatVerifyOperationIsLegal(IN PIRP_CONTEXT IrpContext)
BOOLEAN FatMarkDevForVerifyIfVcbMounted(IN PVCB Vcb)
ULONG FatExceptionFilter(IN PIRP_CONTEXT IrpContext, IN PEXCEPTION_POINTERS ExceptionPointer)
#define DebugDump(STR, LEVEL, PTR)
#define DebugTrace(INDENT, LEVEL, X, Y)
@ VolumeDirtyWithSurfaceTest
#define FatVcbAcquiredExclusive(IRPCONTEXT, VCB)
PFCB FatGetNextFcbTopDown(IN PIRP_CONTEXT IrpContext, IN PFCB Fcb, IN PFCB TerminationFcb)
IN PVCB IN VBO IN ULONG OUT PBCB * Bcb
#define FatAcquireExclusiveGlobal(IRPCONTEXT)
#define FatUnpinBcb(IRPCONTEXT, BCB)
WORKER_THREAD_ROUTINE FatFspMarkVolumeDirtyWithRecover
NTSTATUS FatFsdPostRequest(IN PIRP_CONTEXT IrpContext, IN PIRP Irp)
#define FatCompleteRequest(IRPCONTEXT, IRP, STATUS)
#define FatReleaseGlobal(IRPCONTEXT)
#define FatAcquireExclusiveVcb(IC, V)
KDEFERRED_ROUTINE FatCleanVolumeDpc
#define FatIsFastIoPossible(FCB)
#define FatNormalizeAndRaiseStatus(IRPCONTEXT, STATUS)
#define FatRaiseStatus(IRPCONTEXT, STATUS)
BOOLEAN FatIsBootSectorFat(IN PPACKED_BOOT_SECTOR BootSector)
VOID Fat8dot3ToString(_In_ PIRP_CONTEXT IrpContext, _In_ PDIRENT Dirent, _In_ BOOLEAN RestoreCase, _Out_ POEM_STRING OutputString)
#define FatAcquireSharedGlobal(IRPCONTEXT)
enum _FAT_VOLUME_STATE FAT_VOLUME_STATE
IN PVCB IN FAT_VOLUME_STATE VolumeState
#define FatReleaseVcb(IRPCONTEXT, Vcb)
VOID FatMarkFcbCondition(IN PIRP_CONTEXT IrpContext, IN PFCB Fcb, IN FCB_CONDITION FcbCondition, IN BOOLEAN Recursive)
#define VCB_STATE_FLAG_VOLUME_DIRTY
#define VCB_STATE_FLAG_SHUTDOWN
#define VCB_STATE_FLAG_REMOVABLE_MEDIA
#define VCB_STATE_FLAG_BOOT_OR_PAGING_FILE
#define VCB_STATE_FLAG_MOUNTED_DIRTY
#define VCB_STATE_FLAG_WRITE_PROTECTED
#define FCB_LOOKUP_ALLOCATIONSIZE_HINT
#define VCB_STATE_FLAG_VOLUME_DISMOUNTED
#define FCB_STATE_PAGING_FILE
struct _CLEAN_AND_DIRTY_VOLUME_PACKET * PCLEAN_AND_DIRTY_VOLUME_PACKET
NTSTATUS NTAPI FsRtlBalanceReads(PDEVICE_OBJECT TargetDevice)
#define FSRTL_FSP_TOP_LEVEL_IRP
#define KeGetCurrentThread
#define EXCEPTION_EXECUTE_HANDLER
#define EXCEPTION_CONTINUE_SEARCH
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
VOID NTAPI FsRtlRemoveLargeMcbEntry(IN PLARGE_MCB Mcb, IN LONGLONG Vbn, IN LONGLONG SectorCount)
BOOLEAN NTAPI CcIsThereDirtyData(IN PVPB Vpb)
VOID NTAPI MmUnlockPages(IN PMDL Mdl)
_In_ NDIS_HANDLE _In_ PNDIS_PACKET Packet
#define DPFLTR_INFO_LEVEL
#define _In_reads_opt_(s)
#define FSCTL_MARK_VOLUME_DIRTY
NTSYSAPI BOOLEAN NTAPI RtlEqualString(PSTRING String1, PSTRING String2, BOOLEAN CaseInSensitive)
#define UNREFERENCED_PARAMETER(P)
_In_ ULONG _In_ ULONG Offset
BOOLEAN NTAPI FsRtlIsNtstatusExpected(IN NTSTATUS NtStatus)
#define IoCompleteRequest
PIRP NTAPI IoBuildAsynchronousFsdRequest(IN ULONG MajorFunction, IN PDEVICE_OBJECT DeviceObject, IN PVOID Buffer, IN ULONG Length, IN PLARGE_INTEGER StartingOffset, IN PIO_STATUS_BLOCK IoStatusBlock)
VOID NTAPI IoSetTopLevelIrp(IN PIRP Irp)
VOID NTAPI IoFreeIrp(IN PIRP Irp)
VOID NTAPI IoSetHardErrorOrVerifyDevice(IN PIRP Irp, IN PDEVICE_OBJECT DeviceObject)
VOID NTAPI IoReleaseVpbSpinLock(IN KIRQL Irql)
NTSTATUS NTAPI IoVerifyVolume(IN PDEVICE_OBJECT DeviceObject, IN BOOLEAN AllowRawMount)
VOID NTAPI IoAcquireVpbSpinLock(OUT PKIRQL Irql)
#define STATUS_FILE_CLOSED
#define STATUS_VOLUME_DISMOUNTED
#define STATUS_FILE_INVALID
BOOLEAN NTAPI CcPinRead(IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN ULONG Length, IN ULONG Flags, OUT PVOID *Bcb, OUT PVOID *Buffer)
#define _SEH2_GetExceptionCode()
#define _SEH2_EXCEPT(...)
#define _SEH2_GetExceptionInformation()
#define IRP_MJ_SET_INFORMATION
#define IRP_MJ_QUERY_INFORMATION
#define STATUS_MORE_PROCESSING_REQUIRED
UNICODE_STRING FullFileName
FCB_CONDITION FcbCondition
FSRTL_ADVANCED_FCB_HEADER Header
union _FCB::@734 Specific
struct _FCB::@734::@736 Dcb
union _FILE_NAME_NODE::@733 Name
ULONG SectorBeginSignature
struct _IO_STACK_LOCATION::@4024::@4039 FileSystemControl
PDEVICE_OBJECT DeviceObject
union _IO_STACK_LOCATION::@1584 Parameters
struct _LIST_ENTRY * Flink
BOOLEAN NTAPI KeSetTimer(IN OUT PKTIMER Timer, IN LARGE_INTEGER DueTime, IN PKDPC Dpc OPTIONAL)
#define RtlZeroMemory(Destination, Length)
#define CONTAINING_RECORD(address, type, field)
#define STATUS_MEDIA_WRITE_PROTECTED
#define STATUS_WRONG_VOLUME
#define STATUS_VERIFY_REQUIRED
_Must_inspect_result_ _In_ WDFDEVICE Device
_In_ PDEVICE_OBJECT DeviceObject
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
_Must_inspect_result_ _In_ PWDF_DPC_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFDPC * Dpc
VOID NTAPI ExQueueWorkItem(IN PWORK_QUEUE_ITEM WorkItem, IN WORK_QUEUE_TYPE QueueType)
_Must_inspect_result_ _In_ ULONG Flags
#define ExInitializeWorkItem(Item, Routine, Context)
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
#define IoIsErrorUserInduced(Status)
#define IRP_MJ_FILE_SYSTEM_CONTROL
#define IRP_MJ_SET_VOLUME_INFORMATION
#define IRP_MN_VERIFY_VOLUME
#define FO_CLEANUP_COMPLETE
#define IRP_MN_USER_FS_REQUEST
#define IRP_MJ_FLUSH_BUFFERS
#define IO_DISK_INCREMENT
#define MAXIMUM_VOLUME_LABEL_LENGTH
#define IRP_MN_MOUNT_VOLUME
_In_opt_ PVOID _In_opt_ PVOID SystemArgument1
_In_opt_ PVOID DeferredContext
_In_opt_ PVOID _In_opt_ PVOID _In_opt_ PVOID SystemArgument2
_Inout_opt_ PVOID Parameter