80 #pragma alloc_text(PAGE, FFSFloppyFlush) 81 #pragma alloc_text(PAGE, FFSStartFloppyFlushDpc) 82 #pragma alloc_text(PAGE, FFSZeroHoles) 83 #pragma alloc_text(PAGE, FFSWrite) 84 #pragma alloc_text(PAGE, FFSWriteVolume) 85 #pragma alloc_text(PAGE, FFSv1WriteInode) 86 #pragma alloc_text(PAGE, FFSWriteFile) 87 #pragma alloc_text(PAGE, FFSWriteComplete) 306 Irp = IrpContext->Irp;
317 FFSPrint((
DBG_INFO,
"FFSWriteVolume: Off=%I64xh Len=%xh Paging=%xh Nocache=%xh\n",
322 Irp->IoStatus.Information = 0;
333 MainResourceAcquired =
TRUE;
338 MainResourceAcquired =
FALSE;
379 Irp = IrpContext->Irp;
401 Vcb->PartitionInformation.PartitionLength.QuadPart)
403 Irp->IoStatus.Information = 0;
443 if (Nocache && !PagingIo && (
Vcb->SectionObject.DataSectionObject !=
NULL))
446 MainResourceAcquired =
TRUE;
471 MainResourceAcquired =
FALSE;
476 #pragma prefast( suppress: 28137, "by design" ) 479 IrpContext->IsSynchronous))
485 MainResourceAcquired =
TRUE;
500 &
Vcb->PagingIoResource,
501 IrpContext->IsSynchronous))
507 PagingIoResourceAcquired =
TRUE;
514 Vcb->PartitionInformation.PartitionLength.QuadPart
518 Vcb->PartitionInformation.PartitionLength.QuadPart -
578 Vcb->PartitionInformation.PartitionLength.QuadPart)
581 Vcb->PartitionInformation.PartitionLength.QuadPart -
610 while (RemainLength > 0)
612 DirtyStart = DirtyLba;
625 DirtyLba = DirtyStart + DirtyLength;
634 ffs_bdl[Blocks].
Lba = DirtyLba;
640 if (DirtyLba + DirtyLength > DirtyStart + RemainLength)
650 RemainLength = (DirtyStart + RemainLength) -
651 (DirtyLba + DirtyLength);
654 DirtyLba = DirtyStart + DirtyLength;
693 Irp = IrpContext->Irp;
699 for (
i = 0;
i < Blocks;
i++)
729 if (PagingIoResourceAcquired)
732 &
Vcb->PagingIoResource,
736 if (MainResourceAcquired)
743 if (!IrpContext->ExceptionInProgress)
770 if (SynchronousIo && !PagingIo)
821 Totalblocks = (dinode1->di_blocks);
860 dwTotal, bWriteToDisk));
876 if (
Vcb->SectionObject.DataSectionObject !=
NULL)
917 if (dwRet) *dwRet =
size;
1004 Irp = IrpContext->Irp;
1015 FFSPrint((
DBG_INFO,
"FFSWriteFile: Off=%I64xh Len=%xh Paging=%xh Nocache=%xh\n",
1034 Irp->IoStatus.Information = 0;
1102 if (Nocache && !PagingIo && (
Fcb->SectionObject.DataSectionObject !=
NULL))
1104 #pragma prefast( suppress: 28137, "by design" ) 1108 MainResourceAcquired =
TRUE;
1134 MainResourceAcquired =
FALSE;
1139 #pragma prefast( suppress: 28137, "by design" ) 1142 IrpContext->IsSynchronous))
1148 MainResourceAcquired =
TRUE;
1162 IrpContext->IsSynchronous))
1168 PagingIoResourceAcquired =
TRUE;
1174 &
Fcb->FileLockAnchor,
1191 Irp->IoStatus.Information = 0;
1243 bNeedExtending =
TRUE;
1317 IrpContext->IsSynchronous,
1366 Irp = IrpContext->Irp;
1373 if (PagingIoResourceAcquired)
1380 if (MainResourceAcquired)
1387 if (!IrpContext->ExceptionInProgress)
1414 if (SynchronousIo && !PagingIo)
1463 Irp = IrpContext->Irp;
1475 if (!IrpContext->ExceptionInProgress)
1509 bCompleteRequest =
FALSE;
1557 bCompleteRequest =
FALSE;
1568 bCompleteRequest =
FALSE;
1579 if (bCompleteRequest)
1588 #endif // !FFS_READ_ONLY NTSTATUS FFSWriteComplete(IN PFFS_IRP_CONTEXT IrpContext)
#define READ_AHEAD_GRANULARITY
VOID FFSStartFloppyFlushDpc(PFFS_VCB Vcb, PFFS_FCB Fcb, PFILE_OBJECT FileObject)
#define ExGetCurrentResourceThread()
NTSTATUS FFSQueueRequest(IN PFFS_IRP_CONTEXT IrpContext)
BOOLEAN NTAPI CcPurgeCacheSection(IN PSECTION_OBJECT_POINTERS SectionObjectPointer, IN OPTIONAL PLARGE_INTEGER FileOffset, IN ULONG Length, IN BOOLEAN UninitializeCacheMaps)
#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
#define __drv_mustHoldCriticalRegion
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
IN BOOLEAN OUT PSTR Buffer
#define STATUS_INVALID_PARAMETER
__drv_mustHoldCriticalRegion BOOLEAN FFSSaveBuffer(IN PFFS_IRP_CONTEXT IrpContext, IN PFFS_VCB Vcb, IN LONGLONG Offset, IN ULONG Size, IN PVOID Buf)
BOOLEAN NTAPI FsRtlCheckLockForWriteAccess(IN PFILE_LOCK FileLock, IN PIRP Irp)
#define IRP_CONTEXT_FLAG_DEFERRED
#define STATUS_INVALID_DEVICE_REQUEST
__drv_mustHoldCriticalRegion VOID FFSFreeIrpContext(IN PFFS_IRP_CONTEXT IrpContext)
__drv_mustHoldCriticalRegion BOOLEAN FFSLookupMcbEntry(IN PFFS_VCB Vcb, IN LONGLONG Lba, OUT PLONGLONG pLba, OUT PLONGLONG pLength, OUT PLONGLONG RunStart, OUT PLONGLONG RunLength, OUT PULONG Index)
#define FILE_NOTIFY_CHANGE_SIZE
__drv_mustHoldCriticalRegion NTSTATUS FFSWriteVolume(IN PFFS_IRP_CONTEXT IrpContext)
NTSTATUS FFSLockUserBuffer(IN PIRP Irp, IN ULONG Length, IN LOCK_OPERATION Operation)
__drv_mustHoldCriticalRegion NTSTATUS FFSWriteFile(IN PFFS_IRP_CONTEXT IrpContext)
VOID NTAPI CcMdlWriteComplete(IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN PMDL MdlChain)
BOOLEAN FFSExpandFile(PFFS_IRP_CONTEXT IrpContext, PFFS_VCB Vcb, PFFS_FCB Fcb, PLARGE_INTEGER AllocationSize)
struct _FFS_FCB * PFFS_FCB
PDEVICE_OBJECT DeviceObject
#define STATUS_END_OF_FILE
__drv_mustHoldCriticalRegion BOOLEAN FFSAddMcbEntry(IN PFFS_VCB Vcb, IN LONGLONG Lba, IN LONGLONG Length)
#define FO_SYNCHRONOUS_IO
BOOLEAN NTAPI ExAcquireResourceExclusiveLite(IN PERESOURCE Resource, IN BOOLEAN Wait)
__drv_mustHoldCriticalRegion VOID FFSFloppyFlush(IN PVOID Parameter)
__GNU_EXTENSION typedef __int64 * PLONGLONG
struct _FFS_FLPFLUSH_CONTEXT * PFFS_FLPFLUSH_CONTEXT
_In_ PDEVICE_OBJECT DeviceObject
NTFSIDENTIFIER Identifier
#define CCB_ALLOW_EXTENDED_DASD_IO
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)
BOOLEAN FFSZeroHoles(IN PFFS_IRP_CONTEXT IrpContext, IN PFFS_VCB Vcb, IN PFILE_OBJECT FileObject, IN LONGLONG Offset, IN LONGLONG Count)
__drv_mustHoldCriticalRegion BOOLEAN FFSv1SaveInode(IN PFFS_IRP_CONTEXT IrpContext, IN PFFS_VCB Vcb, IN ULONG Inode, IN PFFSv1_INODE dinode1)
ULONG FFSDataBlocks(PFFS_VCB Vcb, ULONG TotalBlocks)
#define FILE_ACTION_MODIFIED
#define STATUS_INVALID_USER_BUFFER
PVOID FFSGetUserBuffer(IN PIRP Irp)
VOID NTAPI KeInitializeTimer(OUT PKTIMER Timer)
#define STATUS_MEDIA_WRITE_PROTECTED
struct _FFS_VCB * PFFS_VCB
__drv_mustHoldCriticalRegion NTSTATUS FFSv1WriteInode(IN PFFS_IRP_CONTEXT IrpContext, IN PFFS_VCB Vcb, IN PFFSv1_INODE dinode1, IN ULONGLONG offset, IN PVOID Buffer, IN ULONG size, IN BOOLEAN bWriteToDisk, OUT PULONG dwRet)
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
struct _FFS_FCBVCB * PFFS_FCBVCB
#define FILE_ATTRIBUTE_DIRECTORY
_In_opt_ PVOID _In_opt_ PVOID SystemArgument1
__drv_mustHoldCriticalRegion NTSTATUS FFSv2WriteInode(IN PFFS_IRP_CONTEXT IrpContext, IN PFFS_VCB Vcb, IN PFFSv2_INODE dinode2, IN ULONGLONG offset, IN PVOID Buffer, IN ULONG size, IN BOOLEAN bWriteToDisk, OUT PULONG dwRet)
NTSTATUS FFSReadWriteBlocks(IN PFFS_IRP_CONTEXT IrpContext, IN PFFS_VCB Vcb, IN PFFS_BDL FFSBDL, IN ULONG Length, IN ULONG Count, IN BOOLEAN bVerify)
#define ExInitializeWorkItem(Item, Routine, Context)
#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 ObDereferenceObject
#define FSRTL_FSP_TOP_LEVEL_IRP
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
__drv_mustHoldCriticalRegion NTSTATUS FFSWrite(IN PFFS_IRP_CONTEXT IrpContext)
#define STATUS_UNSUCCESSFUL
#define ExAllocatePoolWithTag(hernya, size, tag)
struct _FFS_FLPFLUSH_CONTEXT FFS_FLPFLUSH_CONTEXT
__drv_mustHoldCriticalRegion NTSTATUS FFSCompleteIrpContext(IN PFFS_IRP_CONTEXT IrpContext, IN NTSTATUS Status)
FFS_IDENTIFIER Identifier
VOID NTAPI IoSetTopLevelIrp(IN PIRP Irp)
#define VCB_DISMOUNT_PENDING
_In_ fcb _In_ chunk _In_ uint64_t _In_ uint64_t _In_ bool _In_opt_ void _In_opt_ PIRP Irp
ULONG FFSv1BuildBDL(IN PFFS_IRP_CONTEXT IrpContext, IN PFFS_VCB Vcb, IN PFFSv1_INODE dinode1, IN ULONGLONG Offset, IN ULONG Size, OUT PFFS_BDL *ffs_bdl)
#define FCB_FILE_MODIFIED
_In_ ULONG _In_ BATTERY_QUERY_INFORMATION_LEVEL _In_ LONG _In_ ULONG _Out_ PULONG ReturnedLength
_Must_inspect_result_ _Out_ PLARGE_INTEGER FileSize
_Inout_ PFILE_OBJECT _In_ TYPE_OF_OPEN PFCB _In_opt_ PCCB Ccb
__drv_mustHoldCriticalRegion VOID FFSRemoveMcbEntry(IN PFFS_VCB Vcb, IN LONGLONG Lba, IN LONGLONG Length)
VOID FFSFloppyFlushDpc(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
struct _FFS_CCB * PFFS_CCB
BOOLEAN NTAPI ExAcquireSharedStarveExclusive(IN PERESOURCE Resource, IN BOOLEAN Wait)
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
VOID FFSDeferWrite(IN PFFS_IRP_CONTEXT, PIRP Irp)
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
_In_ PIO_STACK_LOCATION IrpSp
VOID NTAPI CcSetFileSizes(IN PFILE_OBJECT FileObject, IN PCC_FILE_SIZES FileSizes)
#define IRP_CONTEXT_FLAG_REQUEUED
BOOLEAN NTAPI ExAcquireResourceSharedLite(IN PERESOURCE Resource, IN BOOLEAN Wait)
VOID FFSNotifyReportChange(IN PFFS_IRP_CONTEXT IrpContext, IN PFFS_VCB Vcb, IN PFFS_FCB Fcb, IN ULONG Filter, IN ULONG Action)
#define STATUS_FILE_LOCK_CONFLICT
struct tagContext Context
#define ObReferenceObject
if(!find_data_address_in_chunk(Vcb, c, length, &address)) return false
ERESOURCE PagingIoResource
VOID NTAPI ExReleaseResourceForThreadLite(IN PERESOURCE Resource, IN ERESOURCE_THREAD Thread)
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
VOID NTAPI KeInitializeDpc(IN PKDPC Dpc, IN PKDEFERRED_ROUTINE DeferredRoutine, IN PVOID DeferredContext)
__drv_mustHoldCriticalRegion NTSTATUS FFSPurgeVolume(IN PFFS_VCB Vcb, IN BOOLEAN FlushBeforePurge)
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)
CACHE_MANAGER_CALLBACKS CacheManagerCallbacks
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