22 #define EXT2_FLPFLUSH_MAGIC 'FF2E' 117 DEBUG(
DL_FLP, (
"Ext2FloppyFlushDpc is to be started...\n"));
140 DEBUG(
DL_ERR, (
"Ex2StartFloppy...: failed to allocate Context\n"));
194 #if !EXT2_PRE_ALLOCATION_SUPPORT 270 Irp = IrpContext->Irp;
284 DEBUG(
DL_INF, (
"Ext2WriteVolume: Off=%I64xh Len=%xh Paging=%xh Nocache=%xh\n",
288 Irp->IoStatus.Information = 0;
307 Vcb->PartitionInformation.PartitionLength.QuadPart ) {
308 Irp->IoStatus.Information = 0;
350 if (
Ccb !=
NULL && !PagingIo) {
367 }
else if (Nocache && !PagingIo && (
Vcb->SectionObject.DataSectionObject !=
NULL)) {
370 MainResourceAcquired =
TRUE;
394 MainResourceAcquired =
FALSE;
441 }
else if (PagingIo) {
463 while (RemainLength > 0) {
465 DirtyStart = DirtyLba;
471 if (DirtyLba == -1) {
473 DirtyLba = DirtyStart + DirtyLength;
484 ASSERT(DirtyLba <= DirtyStart);
488 DEBUG(
DL_ERR, (
"Ex2WriteVolume: failed to allocate Extent\n"));
496 RemainLength - DirtyLba );
499 if (DirtyLba + DirtyLength >= DirtyStart + RemainLength) {
542 Irp = IrpContext->Irp;
589 Irp = IrpContext->Irp;
597 if (MainResourceAcquired) {
601 if (!IrpContext->ExceptionInProgress) {
624 if (SynchronousIo && !PagingIo) {
724 DEBUG(
DL_FLP, (
"Ext2WriteInode is starting FlushingDpc...\n"));
802 Irp = IrpContext->Irp;
816 DEBUG(
DL_INF, (
"Ext2WriteFile: %wZ Offset=%I64xh Length=%xh Paging=%xh Nocache=%xh\n",
831 Irp->IoStatus.Information = 0;
843 if (Nocache && !PagingIo &&
911 RecursiveWriteThrough =
TRUE;
922 PagingIoResourceAcquired =
TRUE;
929 Irp->IoStatus.Information = 0;
959 MainResourceAcquired =
TRUE;
964 if (Nocache &&
Ccb !=
NULL &&
Fcb->SectionObject.DataSectionObject !=
NULL) {
1025 PagingIoResourceAcquired =
TRUE;
1046 PagingIoResourceAcquired =
FALSE;
1068 FileSizesChanged =
TRUE;
1070 if (
Fcb->
Header.FileSize.QuadPart >= 0x80000000 &&
1076 DEBUG(
DL_IO, (
"Ext2WriteFile: expanding %wZ to FS: %I64xh FA: %I64xh\n",
1152 FileSizesChanged =
TRUE;
1161 DEBUG(
DL_FLP, (
"Ext2WriteFile is starting FlushingDpc...\n"));
1207 Irp = IrpContext->Irp;
1213 FileSizesChanged =
TRUE;
1228 DEBUG(
DL_IO, (
"Ext2WriteFile: %wZ written FS: %I64xh FA: %I64xh BO: %I64xh LEN: %u\n",
1235 if (FileSizesChanged) {
1254 if (PagingIoResourceAcquired) {
1258 if (MainResourceAcquired) {
1263 if (!OpPostIrp && !IrpContext->ExceptionInProgress) {
1278 if (SynchronousIo) {
1295 DEBUG(
DL_IO, (
"Ext2WriteFile: %wZ written at Offset=%I64xh Length=%xh PagingIo=%d Nocache=%d " 1296 "RetLen=%xh VDL=%I64xh FileSize=%I64xh i_size=%I64xh Status=%xh\n",
1320 Irp = IrpContext->Irp;
1329 if (!IrpContext->ExceptionInProgress) {
1358 bCompleteRequest =
FALSE;
1396 bCompleteRequest =
FALSE;
1410 bCompleteRequest =
FALSE;
1418 if (bCompleteRequest) {
#define READ_AHEAD_GRANULARITY
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR _In_opt_ PLONGLONG _In_opt_ PWDF_REQUEST_SEND_OPTIONS _Out_opt_ PULONG_PTR BytesWritten
struct _EXT2_FCB * PEXT2_FCB
struct _EXT2_EXTENT * Next
BOOLEAN Ext2RemoveVcbExtent(IN PEXT2_VCB Vcb, IN LONGLONG Vbn, IN LONGLONG Length)
BOOLEAN NTAPI CcPurgeCacheSection(IN PSECTION_OBJECT_POINTERS SectionObjectPointer, IN OPTIONAL PLARGE_INTEGER FileOffset, IN ULONG Length, IN BOOLEAN UninitializeCacheMaps)
NTSTATUS Ext2WriteComplete(IN PEXT2_IRP_CONTEXT IrpContext)
#define IsInodeSymLink(I)
#define IRP_CONTEXT_FLAG_WAIT
VOID NTAPI ExQueueWorkItem(IN PWORK_QUEUE_ITEM WorkItem, IN WORK_QUEUE_TYPE QueueType)
BOOLEAN NTAPI KeSetTimer(IN OUT PKTIMER Timer, IN LARGE_INTEGER DueTime, IN PKDPC Dpc OPTIONAL)
#define STATUS_INSUFFICIENT_RESOURCES
_In_ ULONG _In_ ULONG _In_ ULONG Length
_Must_inspect_result_ _In_ PWDF_DPC_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFDPC * Dpc
IN PVCB IN VBO IN ULONG OUT PBCB * Bcb
struct _EXT2_FLPFLUSH_CONTEXT EXT2_FLPFLUSH_CONTEXT
VOID NTAPI CcFlushCache(IN PSECTION_OBJECT_POINTERS SectionObjectPointer, IN OPTIONAL PLARGE_INTEGER FileOffset, IN ULONG Length, OUT OPTIONAL PIO_STATUS_BLOCK IoStatus)
FSRTL_ADVANCED_FCB_HEADER Header
BOOLEAN Ext2SaveSuper(IN PEXT2_IRP_CONTEXT IrpContext, IN PEXT2_VCB Vcb)
BOOLEAN Ext2ZeroData(IN PEXT2_IRP_CONTEXT IrpContext, IN PEXT2_VCB Vcb, IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER Start, IN PLARGE_INTEGER End)
#define CEILING_ALIGNED(T, A, B)
#define STATUS_INVALID_PARAMETER
#define IRP_CONTEXT_FLAG_WRITE_THROUGH
VOID Ext2StartFloppyFlushDpc(PEXT2_VCB Vcb, PEXT2_FCB Fcb, PFILE_OBJECT FileObject)
BOOLEAN NTAPI FsRtlCheckLockForWriteAccess(IN PFILE_LOCK FileLock, IN PIRP Irp)
_Must_inspect_result_ _In_ PFSRTL_PER_STREAM_CONTEXT Ptr
#define IRP_MJ_MAXIMUM_FUNCTION
#define IRP_CONTEXT_FLAG_DEFERRED
#define STATUS_INVALID_DEVICE_REQUEST
IN PVOID IN PVOID IN USHORT IN USHORT Size
NTSTATUS Ext2LockUserBuffer(IN PIRP Irp, IN ULONG Length, IN LOCK_OPERATION Operation)
VOID NTAPI Ext2FloppyFlush(IN PVOID Parameter)
#define FILE_NOTIFY_CHANGE_SIZE
NTSTATUS Ext2WriteVolume(IN PEXT2_IRP_CONTEXT IrpContext)
VOID NTAPI CcMdlWriteComplete(IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN PMDL MdlChain)
NTSTATUS Ext2BuildExtents(IN PEXT2_IRP_CONTEXT IrpContext, IN PEXT2_VCB Vcb, IN PEXT2_MCB Mcb, IN ULONGLONG Offset, IN ULONG Size, IN BOOLEAN bAlloc, OUT PEXT2_EXTENT *Chain)
NTSTATUS Ext2FlushVcb(IN PEXT2_VCB Vcb)
#define IsSpecialFile(Fcb)
#define STATUS_END_OF_FILE
EXT2_IDENTIFIER_TYPE Type
#define FO_SYNCHRONOUS_IO
BOOLEAN NTAPI ExAcquireResourceExclusiveLite(IN PERESOURCE Resource, IN BOOLEAN Wait)
#define FO_FILE_SIZE_CHANGED
_In_ PDEVICE_OBJECT DeviceObject
NTFSIDENTIFIER Identifier
int Ext2CheckFileAccess(PEXT2_VCB Vcb, PEXT2_MCB Mcb, int attempt)
NTSTATUS Ext2QueueRequest(IN PEXT2_IRP_CONTEXT IrpContext)
#define CCB_ALLOW_EXTENDED_DASD_IO
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
VOID NTAPI CcPrepareMdlWrite(IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN ULONG Length, OUT PMDL *MdlChain, OUT PIO_STATUS_BLOCK IoStatus)
VOID(NTAPI * PCC_POST_DEFERRED_WRITE)(_In_ PVOID Context1, _In_ PVOID Context2)
BOOLEAN NTAPI CcZeroData(IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER StartOffset, IN PLARGE_INTEGER EndOffset, IN BOOLEAN Wait)
#define IsWritingToEof(Pos)
VOID Ext2FreeIrpContext(IN PEXT2_IRP_CONTEXT IrpContext)
EXT2_IDENTIFIER Identifier
NTSTATUS Ext2Write(IN PEXT2_IRP_CONTEXT IrpContext)
#define CcIsFileCached(FO)
#define FILE_ACTION_MODIFIED
#define STATUS_INVALID_USER_BUFFER
VOID Ext2NotifyReportChange(IN PEXT2_IRP_CONTEXT IrpContext, IN PEXT2_VCB Vcb, IN PEXT2_MCB Mcb, IN ULONG Filter, IN ULONG Action)
#define IsFileDeleted(Mcb)
VOID NTAPI KeInitializeTimer(OUT PKTIMER Timer)
#define STATUS_MEDIA_WRITE_PROTECTED
#define ClearLongFlag(_F, _SF)
FAST_IO_POSSIBLE Ext2IsFastIoPossible(IN PEXT2_FCB Fcb)
#define FCB_ALLOC_IN_WRITE
#define STATUS_FILE_DELETED
struct _EXT2_FLPFLUSH_CONTEXT * PEXT2_FLPFLUSH_CONTEXT
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
_In_opt_ PVOID _In_opt_ PVOID SystemArgument1
#define ExInitializeWorkItem(Item, Routine, Context)
#define FILE_USE_FILE_POINTER_POSITION
#define NT_SUCCESS(StatCode)
BOOLEAN NTAPI CcCanIWrite(IN PFILE_OBJECT FileObject, IN ULONG BytesToWrite, IN BOOLEAN Wait, IN UCHAR Retrying)
VOID NTAPI CcInitializeCacheMap(IN PFILE_OBJECT FileObject, IN PCC_FILE_SIZES FileSizes, IN BOOLEAN PinAccess, IN PCACHE_MANAGER_CALLBACKS Callbacks, IN PVOID LazyWriteContext)
#define EXCEPTION_EXECUTE_HANDLER
#define IsVcbReadOnly(Vcb)
#define ObDereferenceObject
BOOLEAN Ext2AddVcbExtent(IN PEXT2_VCB Vcb, IN LONGLONG Vbn, IN LONGLONG Length)
struct _EXT2_FCBVCB * PEXT2_FCBVCB
PIRP NTAPI IoGetTopLevelIrp(VOID)
#define INODE_HAS_EXTENT(i)
#define STATUS_ACCESS_DENIED
#define FSRTL_MAX_TOP_LEVEL_IRP_FLAG
#define FSRTL_FSP_TOP_LEVEL_IRP
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
#define CCB_VOLUME_DASD_PURGE
#define STATUS_UNSUCCESSFUL
VOID NTAPI IoSetTopLevelIrp(IN PIRP Irp)
#define VCB_DISMOUNT_PENDING
NTSTATUS Ext2CompleteIrpContext(IN PEXT2_IRP_CONTEXT IrpContext, IN NTSTATUS Status)
_Must_inspect_result_ _In_ PFLT_INSTANCE _Out_ PBOOLEAN IsDirectory
NTSTATUS Ext2WriteFile(IN PEXT2_IRP_CONTEXT IrpContext)
_Must_inspect_result_ _In_ WDFCMRESLIST List
#define FCB_FILE_MODIFIED
_In_ ULONG _In_ BATTERY_QUERY_INFORMATION_LEVEL _In_ LONG _In_ ULONG _Out_ PULONG ReturnedLength
NTSTATUS Ext2PurgeVolume(IN PEXT2_VCB Vcb, IN BOOLEAN FlushBeforePurge)
_Inout_ PFILE_OBJECT _In_ TYPE_OF_OPEN PFCB _In_opt_ PCCB Ccb
NTSTATUS Ext2WriteInode(IN PEXT2_IRP_CONTEXT IrpContext, IN PEXT2_VCB Vcb, IN PEXT2_MCB Mcb, IN ULONGLONG Offset, IN PVOID Buffer, IN ULONG Size, IN BOOLEAN bDirectIo, OUT PULONG BytesWritten)
VOID NTAPI Ext2FloppyFlushDpc(IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
ClearFlag(Dirent->Flags, DIRENT_FLAG_NOT_PERSISTENT)
_In_opt_ PVOID _In_opt_ PVOID _In_opt_ PVOID SystemArgument2
BOOLEAN NTAPI CcCopyWrite(IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN ULONG Length, IN BOOLEAN Wait, IN PVOID Buffer)
_In_ ULONG _In_ ULONG Offset
IN PFCB IN PFILE_OBJECT FileObject IN ULONG AllocationSize
BOOLEAN Ext2SaveBuffer(IN PEXT2_IRP_CONTEXT IrpContext, IN PEXT2_VCB Vcb, IN LONGLONG Offset, IN ULONG Size, IN PVOID Buf)
BOOLEAN NTAPI ExAcquireSharedStarveExclusive(IN PERESOURCE Resource, IN BOOLEAN Wait)
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
PEXT2_EXTENT Ext2AllocateExtent()
VOID Ext2DeferWrite(IN PEXT2_IRP_CONTEXT, PIRP Irp)
NTSTATUS Ext2ExpandFile(PEXT2_IRP_CONTEXT IrpContext, PEXT2_VCB Vcb, PEXT2_MCB Mcb, PLARGE_INTEGER Size)
_In_ PIO_STACK_LOCATION IrpSp
VOID NTAPI CcSetFileSizes(IN PFILE_OBJECT FileObject, IN PCC_FILE_SIZES FileSizes)
IN PVCB IN ULONG IN OUT PULONG IN BOOLEAN OUT PLARGE_MCB Mcb
#define IsLazyWriter(Fcb)
#define SetLongFlag(_F, _SF)
#define IRP_CONTEXT_FLAG_REQUEUED
BOOLEAN NTAPI ExAcquireResourceSharedLite(IN PERESOURCE Resource, IN BOOLEAN Wait)
#define VCB_VOLUME_LOCKED
VOID NTAPI Ext2LockIrp(IN PVOID Context, IN PIRP Irp)
NTSTATUS Ext2ReadWriteBlocks(IN PEXT2_IRP_CONTEXT IrpContext, IN PEXT2_VCB Vcb, IN PEXT2_EXTENT Extent, IN ULONG Length)
#define STATUS_FILE_LOCK_CONFLICT
struct tagContext Context
#define ObReferenceObject
#define IsExt2FsDevice(DO)
ERESOURCE PagingIoResource
BOOLEAN Ext2LookupVcbExtent(IN PEXT2_VCB Vcb, IN LONGLONG Vbn, OUT PLONGLONG Lbn, OUT PLONGLONG Length)
VOID Ext2FreePool(IN PVOID P, IN ULONG Tag)
struct _EXT2_VCB * PEXT2_VCB
#define EXT2_FEATURE_RO_COMPAT_LARGE_FILE
#define _SEH2_EXCEPT(...)
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)
VOID Ext2DestroyExtentChain(IN PEXT2_EXTENT Chain)
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
VOID NTAPI KeInitializeDpc(IN PKDPC Dpc, IN PKDEFERRED_ROUTINE DeferredRoutine, IN PVOID DeferredContext)
struct _EXT2_CCB * PEXT2_CCB
PVOID Ext2AllocatePool(IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes, IN ULONG Tag)
CACHE_MANAGER_CALLBACKS CacheManagerCallbacks
VOID NTAPI Ext2OplockComplete(IN PVOID Context, IN PIRP Irp)
BOOLEAN Ext2SaveInode(IN PEXT2_IRP_CONTEXT IrpContext, IN PEXT2_VCB Vcb, IN struct inode *Inode)
PVOID Ext2GetUserBuffer(IN PIRP Irp)
VOID NTAPI CcDeferWrite(IN PFILE_OBJECT FileObject, IN PCC_POST_DEFERRED_WRITE PostRoutine, IN PVOID Context1, IN PVOID Context2, IN ULONG BytesToWrite, IN BOOLEAN Retrying)
#define IRP_SYNCHRONOUS_PAGING_IO
IN PDCB IN PCCB IN VBO IN OUT PULONG OUT PDIRENT OUT PBCB OUT PVBO ByteOffset
VOID NTAPI CcSetReadAheadGranularity(IN PFILE_OBJECT FileObject, IN ULONG Granularity)
_In_opt_ PVOID DeferredContext
#define EXT2_FLPFLUSH_MAGIC