109 FastIoDispatch = RelatedDeviceObject->DriverObject->FastIoDispatch;
203 BOOLEAN WriteToEof, AcquiredShared, FileSizeChanged, Ret;
204 LARGE_INTEGER WriteOffset, LastOffset, InitialFileSize, InitialValidDataLength;
240 AcquiredShared =
FALSE;
241 FileSizeChanged =
FALSE;
247 if (!
Wait || (
Fcb->AllocationSize.HighPart != 0))
267 AcquiredShared =
TRUE;
295 if ((
Fcb->ValidDataLength.QuadPart + 0x2000 <= WriteOffset.
QuadPart) ||
297 (
Fcb->AllocationSize.QuadPart < LastOffset.
QuadPart))
306 if (AcquiredShared && LastOffset.
QuadPart >
Fcb->ValidDataLength.QuadPart)
334 if (
Fcb->AllocationSize.QuadPart < LastOffset.
QuadPart)
350 FastIoDispatch = RelatedDeviceObject->DriverObject->FastIoDispatch;
357 FALSE, &LocalIoStatus,
358 RelatedDeviceObject))
372 FileSizeChanged =
TRUE;
374 InitialValidDataLength.
QuadPart =
Fcb->ValidDataLength.QuadPart;
376 if (LastOffset.
HighPart !=
Fcb->FileSize.HighPart &&
398 if (LastOffset.
QuadPart >
Fcb->ValidDataLength.QuadPart)
426 if (LastOffset.
QuadPart >
Fcb->ValidDataLength.QuadPart)
428 if (LastOffset.
HighPart !=
Fcb->ValidDataLength.HighPart &&
432 Fcb->ValidDataLength.QuadPart = LastOffset.
QuadPart;
437 Fcb->ValidDataLength.QuadPart = LastOffset.
QuadPart;
463 Fcb->ValidDataLength.QuadPart = InitialValidDataLength.
QuadPart;
469 Fcb->ValidDataLength.QuadPart = InitialValidDataLength.
QuadPart;
492 AcquiredShared =
TRUE;
503 AboveFour = (LastOffset.
LowPart <
Fcb->FileSize.LowPart);
527 if ((
Fcb->AllocationSize.LowPart < LastOffset.
LowPart) ||
528 (WriteOffset.
LowPart >=
Fcb->ValidDataLength.LowPart + 0x2000) ||
538 if (AcquiredShared && LastOffset.
LowPart >
Fcb->ValidDataLength.LowPart)
551 AboveFour = (LastOffset.
LowPart <
Fcb->FileSize.LowPart);
567 if ((
Fcb->AllocationSize.LowPart < LastOffset.
LowPart) ||
568 (
Fcb->AllocationSize.HighPart != 0) || AboveFour)
584 FastIoDispatch = RelatedDeviceObject->DriverObject->FastIoDispatch;
591 FALSE, &LocalIoStatus,
592 RelatedDeviceObject))
604 if (LastOffset.
LowPart >
Fcb->FileSize.LowPart)
606 FileSizeChanged =
TRUE;
607 InitialFileSize.
LowPart =
Fcb->FileSize.LowPart;
608 InitialValidDataLength.
LowPart =
Fcb->ValidDataLength.LowPart;
623 if (LastOffset.
LowPart >
Fcb->ValidDataLength.LowPart)
646 if (LastOffset.
LowPart >
Fcb->ValidDataLength.LowPart)
648 Fcb->ValidDataLength.LowPart = LastOffset.
LowPart;
673 Fcb->FileSize.LowPart = InitialFileSize.
LowPart;
674 Fcb->ValidDataLength.LowPart = InitialValidDataLength.
LowPart;
679 Fcb->FileSize.LowPart = InitialFileSize.
LowPart;
680 Fcb->ValidDataLength.LowPart = InitialValidDataLength.
LowPart;
BOOLEAN FsRtlCopyRead2(IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN ULONG Length, IN BOOLEAN Wait, IN ULONG LockKey, OUT PVOID Buffer, OUT PIO_STATUS_BLOCK IoStatus, IN PDEVICE_OBJECT DeviceObject, IN PVOID TopLevelContext)
BOOLEAN NTAPI FsRtlIsNtstatusExpected(IN NTSTATUS NtStatus)
#define FsRtlEnterFileSystem
#define FsRtlExitFileSystem
IN PLARGE_INTEGER IN ULONG IN BOOLEAN IN ULONG IN BOOLEAN OUT PIO_STATUS_BLOCK IoStatus
#define BooleanFlagOn(F, SF)
PDEVICE_OBJECT NTAPI IoGetRelatedDeviceObject(IN PFILE_OBJECT FileObject)
#define STATUS_END_OF_FILE
BOOLEAN NTAPI ExAcquireResourceExclusiveLite(IN PERESOURCE Resource, IN BOOLEAN Wait)
#define FO_FILE_SIZE_CHANGED
#define EXCEPTION_CONTINUE_SEARCH
_Acquires_exclusive_lock_ Resource _Acquires_shared_lock_ Resource _Inout_ PERESOURCE Resource
BOOLEAN NTAPI CcZeroData(IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER StartOffset, IN PLARGE_INTEGER EndOffset, IN BOOLEAN Wait)
#define FO_FILE_FAST_IO_READ
CRITICAL_SECTION CriticalSection
#define EXCEPTION_EXECUTE_HANDLER
_Inout_ PFILE_OBJECT FileObject
#define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, _Size)
#define FILE_WRITE_TO_END_OF_FILE
IN PLARGE_INTEGER IN ULONG IN BOOLEAN IN ULONG LockKey
BOOLEAN NTAPI CcCanIWrite(IN PFILE_OBJECT FileObject, IN ULONG BytesToWrite, IN BOOLEAN Wait, IN UCHAR Retrying)
#define CcGetFileSizePointer(FO)
VOID NTAPI CcFastCopyRead(IN PFILE_OBJECT FileObject, IN ULONG FileOffset, IN ULONG Length, IN ULONG PageCount, OUT PVOID Buffer, OUT PIO_STATUS_BLOCK IoStatus)
_In_ ULONG _In_ ULONG _In_ ULONG Length
BOOLEAN FsRtlCopyWrite2(IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN ULONG Length, IN BOOLEAN Wait, IN ULONG LockKey, IN PVOID Buffer, OUT PIO_STATUS_BLOCK IoStatus, IN PDEVICE_OBJECT DeviceObject, IN PVOID TopLevelContext)
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
VOID NTAPI IoSetTopLevelIrp(IN PIRP Irp)
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)
NTKERNELAPI BOOLEAN NTAPI CcCopyWriteWontFlush(_In_ PFILE_OBJECT FileObject, _In_ PLARGE_INTEGER FileOffset, _In_ ULONG Length)
BOOLEAN NTAPI CcCopyWrite(IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN ULONG Length, IN BOOLEAN Wait, IN PVOID Buffer)
IN PDEVICE_OBJECT DeviceObject
_In_ PFCB _In_ LONGLONG FileOffset
FAST_IO_DISPATCH FastIoDispatch
BOOLEAN NTAPI ExAcquireResourceSharedLite(IN PERESOURCE Resource, IN BOOLEAN Wait)
PFAST_IO_CHECK_IF_POSSIBLE FastIoCheckIfPossible
ERESOURCE PagingIoResource
#define _SEH2_EXCEPT(...)
#define _SEH2_GetExceptionCode()
VOID NTAPI CcFastCopyWrite(IN PFILE_OBJECT FileObject, IN ULONG FileOffset, IN ULONG Length, IN PVOID Buffer)