23#define BugCheckFileId (FAT_BUG_CHECK_READ)
29#define Dbg (DEBUG_TRACE_READ)
40#define OVERFLOW_READ_THRESHHOLD (0xE00)
42#define OVERFLOW_READ_THRESHHOLD (0x1000)
60FatPostStackOverflowRead (
85#define SafeZeroMemory(AT,BYTE_COUNT) { \
87 RtlZeroMemory((AT), (BYTE_COUNT)); \
88 } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { \
89 FatRaiseStatus( IrpContext, STATUS_INVALID_USER_BUFFER ); \
97#define CollectReadStats(VCB,OPEN_TYPE,BYTE_COUNT) { \
98 PFILESYSTEM_STATISTICS Stats = &(VCB)->Statistics[KeGetCurrentProcessorNumber() % FatData.NumberProcessors].Common; \
99 if (((OPEN_TYPE) == UserFileOpen)) { \
100 Stats->UserFileReads += 1; \
101 Stats->UserFileReadBytes += (ULONG)(BYTE_COUNT); \
102 } else if (((OPEN_TYPE) == VirtualVolumeFile || ((OPEN_TYPE) == DirectoryFile))) { \
103 Stats->MetaDataReads += 1; \
104 Stats->MetaDataReadBytes += (ULONG)(BYTE_COUNT); \
110#pragma alloc_text(PAGE, FatStackOverflowRead)
111#pragma alloc_text(PAGE, FatPostStackOverflowRead)
112#pragma alloc_text(PAGE, FatCommonRead)
248 Status = FatCommonRead( IrpContext,
Irp );
285FatPostStackOverflowRead (
317 DebugTrace(0,
Dbg,
"Getting too close to stack limit pass request to Fsp\n", 0 );
411FatStackOverflowRead (
469 SavedVerifyThread =
Vcb->VerifyThread;
479 (
VOID) FatCommonRead( IrpContext, IrpContext->OriginatingIrp );
497 IrpContext->OriginatingIrp->IoStatus.Information = 0;
500 (
VOID) FatProcessException( IrpContext, IrpContext->OriginatingIrp,
ExceptionCode );
507 if (SavedVerifyThread !=
NULL) {
510 Vcb->VerifyThread = SavedVerifyThread;
559 ULONG RequestedByteCount;
634 Irp->IoStatus.Information = 0;
683 if (IrpContext->FatIoContext ==
NULL) {
687 IrpContext->FatIoContext =
694 IrpContext->FatIoContext = &StackFatIoContext;
712 IrpContext->FatIoContext->Wait.Async.ResourceThreadId =
717 IrpContext->FatIoContext->Wait.Async.ResourceThreadId =
718 ((
ULONG_PTR)IrpContext->FatIoContext) | 3;
721 IrpContext->FatIoContext->Wait.Async.RequestedByteCount =
724 IrpContext->FatIoContext->Wait.Async.FileObject =
FileObject;
740 StartingLbo = StartingByte.
QuadPart;
742 DebugTrace(0,
Dbg,
"Type of read is User Volume or virtual volume file\n", 0);
786 FatFlushVolume( IrpContext,
Vcb,
Flush );
806 VolumeSize = (
LBO)
Vcb->Bpb.BytesPerSector *
807 (
Vcb->Bpb.Sectors != 0 ?
Vcb->Bpb.Sectors :
808 Vcb->Bpb.LargeSectors);
810 if (StartingLbo >= VolumeSize) {
811 Irp->IoStatus.Information = 0;
816 if (
ByteCount > VolumeSize - StartingLbo) {
818 ByteCount = RequestedByteCount = (
ULONG) (VolumeSize - StartingLbo);
827 IrpContext->FatIoContext->Wait.Async.RequestedByteCount =
860#if (NTDDI_VERSION >= NTDDI_WIN8)
886 IrpContext->FatIoContext =
NULL;
890 DebugTrace(-1,
Dbg,
"FatNonCachedIo -> STATUS_PENDING\n", 0);
911 if (SynchronousIo && !PagingIo) {
913 StartingLbo +
Irp->IoStatus.Information;
934 Irp->IoStatus.Information = 0;
953 ULONG ValidDataLength;
965 if (!PagingIo && NonCachedIo
973#ifndef REDUCE_SYNCHRONIZATION
974 if (!FatAcquireExclusiveFcb( IrpContext,
FcbOrDcb )) {
987#ifndef REDUCE_SYNCHRONIZATION
997#ifndef REDUCE_SYNCHRONIZATION
1019 IrpContext->FatIoContext->Wait.Async.Resource =
1030 if (!
Wait && NonCachedIo) {
1036 "Cannot acquire FcbOrDcb = %p shared without waiting\n",
1042 IrpContext->FatIoContext->Wait.Async.Resource =
1047 if (!FatAcquireSharedFcb( IrpContext,
FcbOrDcb )) {
1051 "Cannot acquire FcbOrDcb = %p shared without waiting\n",
1059 FcbOrDcbAcquired =
TRUE;
1065 FatVerifyFcb( IrpContext,
FcbOrDcb );
1082 OplockPostIrp =
TRUE;
1133 if (NonCachedIo && !
Wait) {
1135 IrpContext->FatIoContext->Wait.Async.RequestedByteCount =
1145 if ( NonCachedIo ) {
1162 if (ValidDataLength < FcbOrDcb->ValidDataToDisk) {
1174 ULONG ZeroingOffset;
1274 FatNonCachedNonAlignedRead( IrpContext,
1285#pragma prefast( suppress:28931, "needed for debug build" )
1296 if (FatNonCachedIo( IrpContext,
1305 IrpContext->FatIoContext =
NULL;
1331 Irp->IoStatus.Information = RequestedByteCount;
1366 FatLookupFileAllocationSize( IrpContext,
FcbOrDcb );
1371 FatPopUpFileCorrupt( IrpContext,
FcbOrDcb );
1408#if (NTDDI_VERSION >= NTDDI_WIN8)
1415 Irp->Tail.Overlay.Thread )) {
1489#pragma prefast( suppress:28931, "needed for debug build" )
1508 DebugTrace( 0,
Dbg,
"PagingIo dirent started beyond EOF.\n", 0 );
1510 Irp->IoStatus.Information = 0;
1517 DebugTrace( 0,
Dbg,
"PagingIo dirent extending beyond EOF.\n", 0 );
1526 if (FatNonCachedIo( IrpContext,
1534 IrpContext->FatIoContext =
NULL;
1565 DebugTrace( 0,
Dbg,
"CommonRead -> STATUS_INVALID_PARAMETER\n", 0);
1577#pragma prefast( suppress:28159, "things are seriously wrong if we get here" )
1591 ULONG ActualBytesRead;
1593 DebugTrace( 0,
Dbg,
"Completing request with status = %08lx\n",
1597 Irp->IoStatus.Information);
1603 ActualBytesRead = (
ULONG)
Irp->IoStatus.Information;
1610 if (SynchronousIo && !PagingIo) {
1630 if (!OplockPostIrp) {
1645 if (FcbOrDcbAcquired &&
Irp) {
1680 if (IrpContext->FatIoContext->ZeroMdl) {
1681 IoFreeMdl( IrpContext->FatIoContext->ZeroMdl );
1685 IrpContext->FatIoContext =
NULL;
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
PEPROCESS __stdcall PsGetThreadProcess(_In_ PETHREAD Thread)
VOID NTAPI CcMdlRead(IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN ULONG Length, OUT PMDL *MdlChain, OUT PIO_STATUS_BLOCK IoStatus)
VOID NTAPI CcSetReadAheadGranularity(IN PFILE_OBJECT FileObject, IN ULONG Granularity)
VOID NTAPI CcFlushCache(IN PSECTION_OBJECT_POINTERS SectionObjectPointer, IN OPTIONAL PLARGE_INTEGER FileOffset, IN ULONG Length, OUT OPTIONAL PIO_STATUS_BLOCK IoStatus)
_Inout_ PIRP _In_ NTSTATUS ExceptionCode
_Inout_ PFILE_OBJECT _In_ TYPE_OF_OPEN TypeOfOpen
_Inout_ PFILE_OBJECT _In_ TYPE_OF_OPEN PFCB _In_opt_ PCCB Ccb
_Acquires_exclusive_lock_ Resource _Acquires_shared_lock_ Resource _Inout_ PERESOURCE Resource
enum _TYPE_OF_OPEN TYPE_OF_OPEN
#define CCB_FLAG_ALLOW_EXTENDED_DASD_IO
#define IRP_CONTEXT_FLAG_WAIT
#define _Requires_lock_held_(lock)
#define NT_SUCCESS(StatCode)
_In_ PIO_STACK_LOCATION IrpSp
#define TAG_FAT_IO_CONTEXT
#define FatBugCheck(A, B, C)
#define PsGetCurrentThread()
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
#define KeInitializeEvent(pEvt, foo, foo2)
#define ExGetCurrentResourceThread()
#define KeSetEvent(pEvt, foo, foo2)
#define ExAcquireResourceExclusiveLite(res, wait)
#define ExAcquireResourceSharedLite(res, wait)
#define ClearFlag(_F, _SF)
#define IRP_CONTEXT_FLAG_USER_IO
#define IRP_CONTEXT_FLAG_VERIFY_READ
#define IRP_CONTEXT_STACK_IO_CONTEXT
#define BooleanFlagOn(F, SF)
VOID FatInitializeCacheMap(_In_ PFILE_OBJECT FileObject, _In_ PCC_FILE_SIZES FileSizes, _In_ BOOLEAN PinAccess, _In_ PCACHE_MANAGER_CALLBACKS Callbacks, _In_ PVOID LazyWriteContext)
NTSTATUS FatCompleteMdl(IN PIRP_CONTEXT IrpContext, IN PIRP Irp)
PVOID FatMapUserBuffer(IN PIRP_CONTEXT IrpContext, IN OUT PIRP Irp)
VOID FatWaitSync(IN PIRP_CONTEXT IrpContext)
VOID FatSingleAsync(IN PIRP_CONTEXT IrpContext, IN PVCB Vcb, IN LBO Lbo, IN ULONG ByteCount, IN PIRP Irp)
VOID FatLockUserBuffer(IN PIRP_CONTEXT IrpContext, IN OUT PIRP Irp, IN LOCK_OPERATION Operation, IN ULONG BufferLength)
VOID FatPagingFileIo(IN PIRP Irp, IN PFCB Fcb)
LOGICAL FatDiskAccountingEnabled
ULONG FatExceptionFilter(IN PIRP_CONTEXT IrpContext, IN PEXCEPTION_POINTERS ExceptionPointer)
BOOLEAN FatIsIrpTopLevel(IN PIRP Irp)
#define DebugDump(STR, LEVEL, PTR)
#define DebugTrace(INDENT, LEVEL, X, Y)
VOID FatQuickVerifyVcb(IN PIRP_CONTEXT IrpContext, IN PVCB Vcb)
#define FatDeleteIrpContext(IRPCONTEXT)
IN PVCB IN VBO StartingVbo
NTSTATUS FatFsdPostRequest(IN PIRP_CONTEXT IrpContext, IN PIRP Irp)
TYPE_OF_OPEN FatDecodeFileObject(_In_ PFILE_OBJECT FileObject, _Outptr_ PVCB *Vcb, _Outptr_ PFCB *FcbOrDcb, _Outptr_ PCCB *Ccb)
IN PFCB IN PCCB IN TYPE_OF_OPEN IN BOOLEAN IN BOOLEAN TopLevel
#define FatCompleteRequest(IRPCONTEXT, IRP, STATUS)
#define FatReleaseFcb(IRPCONTEXT, Fcb)
VOID NTAPI FatPrePostIrp(IN PVOID Context, IN PIRP Irp)
#define FatDeviceIsFatFsdo(D)
#define FatIsFastIoPossible(FCB)
VOID NTAPI FatOplockComplete(IN PVOID Context, IN PIRP Irp)
#define FatNormalizeAndRaiseStatus(IRPCONTEXT, STATUS)
#define FatRaiseStatus(IRPCONTEXT, STATUS)
_Acquires_shared_lock_ Fcb FINISHED FatAcquireSharedFcbWaitForEx(IN PIRP_CONTEXT IrpContext, IN PFCB Fcb)
#define FatGetFcbOplock(F)
PIRP_CONTEXT FatCreateIrpContext(IN PIRP Irp, IN BOOLEAN Wait)
#define VCB_STATE_FLAG_LOCKED
#define IRP_CONTEXT_FLAG_OVERRIDE_VERIFY
#define FCB_LOOKUP_ALLOCATIONSIZE_HINT
#define FCB_STATE_PAGING_FILE
#define CCB_FLAG_DASD_FLUSH_DONE
#define CCB_FLAG_SENT_FORMAT_UNIT
#define CCB_FLAG_COMPLETE_DISMOUNT
BOOLEAN NTAPI FsRtlCheckLockForReadAccess(IN PFILE_LOCK FileLock, IN PIRP Irp)
#define READ_AHEAD_GRANULARITY
#define SafeZeroMemory(IC, AT, BYTE_COUNT)
#define OVERFLOW_READ_THRESHHOLD
#define CollectReadStats(VCB, OPEN_TYPE, BYTE_COUNT)
VOID NTAPI FatOverflowPagingFileRead(IN PVOID Context, IN PKEVENT Event)
#define FsRtlEnterFileSystem
#define FsRtlExitFileSystem
_Must_inspect_result_ _Out_ PLARGE_INTEGER FileSize
#define KeGetCurrentThread
__in UCHAR __in POWER_STATE __in_opt PVOID __in PIO_STATUS_BLOCK IoStatus
_In_ NDIS_HANDLE _In_ PNDIS_PACKET Packet
DRIVER_DISPATCH(nfs41_FsdDispatch)
#define _Function_class_(n)
#define UNREFERENCED_PARAMETER(P)
BOOLEAN NTAPI CcCopyRead(IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN ULONG Length, IN BOOLEAN Wait, OUT PVOID Buffer, OUT PIO_STATUS_BLOCK IoStatus)
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
PVOID NTAPI FsRtlAllocatePoolWithTag(IN POOL_TYPE PoolType, IN ULONG NumberOfBytes, IN ULONG Tag)
VOID NTAPI IoSetTopLevelIrp(IN PIRP Irp)
#define STATUS_FILE_LOCK_CONFLICT
NTSTATUS NTAPI FsRtlCheckOplock(IN POPLOCK Oplock, IN PIRP Irp, IN PVOID Context, IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL, IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL)
#define _SEH2_AbnormalTermination()
#define _SEH2_GetExceptionCode()
#define _SEH2_EXCEPT(...)
#define _SEH2_GetExceptionInformation()
FORCEINLINE ULONG KeGetCurrentProcessorNumber(VOID)
#define STATUS_END_OF_FILE
VOID NTAPI FsRtlPostStackOverflow(IN PVOID Context, IN PKEVENT Event, IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine)
VOID NTAPI FsRtlPostPagingFileStackOverflow(IN PVOID Context, IN PKEVENT Event, IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine)
CACHE_MANAGER_CALLBACKS CacheManagerCallbacks
struct _FCB::@734::@737 Fcb
FSRTL_ADVANCED_FCB_HEADER Header
union _FCB::@734 Specific
struct _IO_STACK_LOCATION::@4024::@4028 Read
union _IO_STACK_LOCATION::@1584 Parameters
#define RtlZeroMemory(Destination, Length)
#define STATUS_INVALID_PARAMETER
#define STATUS_FILE_DELETED
#define STATUS_VERIFY_REQUIRED
#define STATUS_FILE_CORRUPT_ERROR
_In_ PDEVICE_OBJECT DeviceObject
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
_In_ WDFDPC _In_ BOOLEAN Wait
#define FO_FILE_FAST_IO_READ
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS _In_ LARGE_INTEGER ByteCount
#define FO_SYNCHRONOUS_IO