20 #define UDF_BUG_CHECK_ID UDF_FILE_WRITE 22 #ifndef UDF_READ_ONLY_BUILD 71 Irp->IoStatus.Status = RC;
72 Irp->IoStatus.Information = 0;
120 SIZE_T NumberBytesWritten = 0;
163 UDFPrint((
" FSRTL_FSP_TOP_LEVEL_IRP\n"));
166 UDFPrint((
" FSRTL_CACHE_TOP_LEVEL_IRP\n"));
169 UDFPrint((
" FSRTL_MOD_WRITE_TOP_LEVEL_IRP\n"));
172 UDFPrint((
" FSRTL_FAST_IO_TOP_LEVEL_IRP\n"));
176 UDFPrint((
" NULL TOP_LEVEL_IRP\n"));
182 UDFPrint((
" RECURSIVE_IRP, TOP = %x\n", TopIrp));
190 MmPrint((
" Enter Irp, MDL=%x\n",
Irp->MdlAddress));
191 if(
Irp->MdlAddress) {
242 UDFPrint((
" Flags: %s; %s; %s; %s; Irp(W): %8.8x\n",
243 CanWait ?
"Wt" :
"nw", PagingIo ?
"Pg" :
"np",
244 NonBufferedIo ?
"NBuf" :
"buff", SynchronousIo ?
"Snc" :
"Asc",
276 if (SynchronousIo && !PagingIo &&
NT_SUCCESS(RC)) {
306 UDFPrint((
" UDF_IRP_CONTEXT_FLUSH2_REQUIRED\n"));
312 #ifdef UDF_DELAYED_CLOSE 314 #endif //UDF_DELAYED_CLOSE 320 PtrResourceAcquired = &(
Vcb->VCBResource);
327 #if defined(_MSC_VER) && !defined(__clang__) 352 &NumberBytesWritten);
364 if(
Vcb->VerifyCtx.QueuedCount ||
384 if (!NonBufferedIo) {
390 UDFPrint((
"UDFCommonWrite: Defer write\n"));
391 MmPrint((
" CcDeferWrite()\n"));
400 NonBufferedIo =
TRUE;
447 #if defined(_MSC_VER) && !defined(__clang__) 465 if ( NonBufferedIo &&
467 NtReqFcb->SectionObject.DataSectionObject &&
476 PtrResourceAcquired = &(
NtReqFcb->MainResource);
483 PtrResourceAcquired2 = &(
NtReqFcb->PagingIoResource);
487 if((
ByteOffset.QuadPart + TruncatedLength) >
NtReqFcb->CommonFCBHeader.FileSize.QuadPart) {
488 NumberBytesWritten = TruncatedLength;
493 MmPrint((
" CcFlushCache()\n"));
496 if(PtrResourceAcquired2) {
498 PtrResourceAcquired2 =
NULL;
502 NumberBytesWritten = 0;
515 MmPrint((
" CcPurgeCacheSection()\n"));
517 NumberBytesWritten,
FALSE);
518 NumberBytesWritten = 0;
520 if(PtrResourceAcquired) {
522 PtrResourceAcquired =
NULL;
535 if(!IsThisADeferredWrite) {
542 PtrResourceAcquired2 = &(
NtReqFcb->PagingIoResource);
553 PtrResourceAcquired2 = &(
NtReqFcb->PagingIoResource);
562 PtrResourceAcquired = &(
NtReqFcb->MainResource);
590 RecursiveWriteThrough =
TRUE;
618 OldVDL =
NtReqFcb->CommonFCBHeader.ValidDataLength.QuadPart;
622 !RecursiveWriteThrough &&
623 !IsThisADeferredWrite) {
627 ExtendFS = (
ByteOffset.QuadPart + TruncatedLength >
NtReqFcb->CommonFCBHeader.FileSize.QuadPart);
629 if( WriteToEOF || ZeroBlock || ExtendFS) {
636 if (PtrResourceAcquired2) {
638 PtrResourceAcquired2 =
NULL;
640 if (PtrResourceAcquired) {
642 PtrResourceAcquired =
NULL;
655 PtrResourceAcquired = &(
NtReqFcb->MainResource);
660 AdPrint((
" Try to acquire PagingIoRes\n"));
662 PtrResourceAcquired2 = &(
NtReqFcb->PagingIoResource);
664 AdPrint((
" PagingIoRes Ok, Resizing...\n"));
670 if(PtrResourceAcquired2) {
672 PtrResourceAcquired2 =
NULL;
680 if(!
Vcb->LowFreeSpace) {
688 UDFPrint((
"UDFCommonWrite: Set size %x (alloc size %x)\n",
ByteOffset.LowPart + TruncatedLength,
NtReqFcb->CommonFCBHeader.AllocationSize.LowPart));
691 MmPrint((
" CcSetFileSizes()\n"));
702 ThPrint((
" UDFZeroDataEx(1)\n"));
705 NtReqFcb->CommonFCBHeader.FileSize.QuadPart - OldVDL,
708 ZeroBlockDone =
TRUE;
712 if (PtrResourceAcquired2) {
714 PtrResourceAcquired2 =
NULL;
731 #ifdef UDF_DISABLE_SYSTEM_CACHE_MANAGER 732 NonBufferedIo =
TRUE;
734 if(
Fcb &&
Fcb->FileInfo &&
Fcb->FileInfo->Dloc) {
735 AdPrint((
"UDFCommonWrite: DataLoc %x, Mapping %x\n",
Fcb->FileInfo->Dloc->DataLoc,
Fcb->FileInfo->Dloc->DataLoc.Mapping));
739 if (!NonBufferedIo) {
746 UDFPrint((
"UDFCommonWrite: Init system cache\n"));
747 MmPrint((
" CcInitializeCacheMap()\n"));
752 MmPrint((
" CcSetReadAheadGranularity()\n"));
757 if(ZeroBlock && !ZeroBlockDone) {
758 ThPrint((
" UDFZeroDataEx(2)\n"));
761 ByteOffset.QuadPart + TruncatedLength - OldVDL,
773 MmPrint((
" CcPrepareMdlWrite()\n"));
778 NumberBytesWritten = 0;
784 if(
NtReqFcb->SectionObject.DataSectionObject &&
785 TruncatedLength >= 0x10000 &&
792 MmPrint((
" CcFlushCache() 16Mb\n"));
810 PerfPrint((
"UDFCommonWrite: CcCopyWrite %x bytes at %x\n", TruncatedLength,
ByteOffset.LowPart));
822 NumberBytesWritten = TruncatedLength;
828 MmPrint((
" Write NonBufferedIo\n"));
833 if (!RecursiveWriteThrough &&
834 !IsThisADeferredWrite &&
844 if(OldVDL < (
ByteOffset.QuadPart + TruncatedLength)) {
845 NtReqFcb->CommonFCBHeader.ValidDataLength.QuadPart =
ByteOffset.QuadPart + TruncatedLength;
850 UDFPrint((
"FSRTL_MOD_WRITE_TOP_LEVEL_IRP => CanWait\n"));
854 UDFPrint((
"FSRTL_CACHE_TOP_LEVEL_IRP => CanWait\n"));
869 MmPrint((
" !PASSIVE_LEVEL\n"));
875 UDFPrint((
"UDFCommonWrite: Cached => CanWait\n"));
881 UDFPrint((
"UDFCommonWrite: Post physical write %x bytes at %x\n", TruncatedLength,
ByteOffset.LowPart));
888 PtrResourceAcquired2 = &(
NtReqFcb->PagingIoResource);
892 PerfPrint((
"UDFCommonWrite: Physical write %x bytes at %x\n", TruncatedLength,
ByteOffset.LowPart));
905 CacheLocked, (
PCHAR)SystemBuffer, &NumberBytesWritten);
909 #if defined(_MSC_VER) && !defined(__clang__) 917 WriteFileSizeToDirNdx =
TRUE;
931 if(PtrResourceAcquired2) {
934 if(PtrResourceAcquired) {
936 (PtrResourceAcquired ==
971 if (SynchronousIo && !PagingIo &&
NT_SUCCESS(RC)) {
983 if(!WriteFileSizeToDirNdx) {
991 if(!IsThisADeferredWrite &&
993 if(
NtReqFcb->CommonFCBHeader.ValidDataLength.QuadPart < (
ByteOffset.QuadPart + NumberBytesWritten)) {
995 NtReqFcb->CommonFCBHeader.ValidDataLength.QuadPart =
1010 Irp->IoStatus.Status = RC;
1011 Irp->IoStatus.Information = NumberBytesWritten;
1013 MmPrint((
" Complete Irp, MDL=%x\n",
Irp->MdlAddress));
1014 if(
Irp->MdlAddress) {
1053 UDFPrint((
"UDFDeferredWriteCallBack\n"));
1067 #define USE_CcCopyWrite_TO_ZERO 1082 #ifdef USE_CcCopyWrite_TO_ZERO 1084 #endif //USE_CcCopyWrite_TO_ZERO 1090 #define PURGE_BLOCK_SZ 0x10000000 1109 #ifndef USE_CcCopyWrite_TO_ZERO 1111 MmPrint((
" CcFlushCache(s) Offs %I64x, Len %x\n", Offset0, Off_l));
1113 #else //USE_CcCopyWrite_TO_ZERO 1121 MmPrint((
" ZeroCache (CcWrite) Offs %I64x, Len %x\n",
Offset, PgLen));
1136 MmPrint((
" Can't use CcWrite to zero cache\n"));
1139 #endif //USE_CcCopyWrite_TO_ZERO 1141 VDL =
NtReqFcb->CommonFCBHeader.ValidDataLength.QuadPart;
1146 #ifndef USE_CcCopyWrite_TO_ZERO 1149 ((
ULONG)(VDL-OffsetX));
1151 MmPrint((
" CcFlushCache(e) Offs %I64x, Len %x\n", OffsetX, Off_l));
1153 #else //USE_CcCopyWrite_TO_ZERO 1161 MmPrint((
" ZeroCache (CcWrite - 2) Offs %I64x, Len %x\n", OffsetX, PgLen));
1172 MmPrint((
" Can't use CcWrite to zero cache (2)\n"));
1175 #endif //USE_CcCopyWrite_TO_ZERO 1178 #ifndef USE_CcCopyWrite_TO_ZERO 1180 #else //USE_CcCopyWrite_TO_ZERO 1182 #endif //USE_CcCopyWrite_TO_ZERO 1184 MmPrint((
" CcPurgeCacheSection()\n"));
1195 #ifndef ALLOW_SPARSE 1197 #endif //ALLOW_SPARSE 1209 #ifndef ALLOW_SPARSE 1211 #endif //ALLOW_SPARSE 1216 #ifndef USE_CcCopyWrite_TO_ZERO 1218 #endif //USE_CcCopyWrite_TO_ZERO 1227 #endif //UDF_READ_ONLY_BUILD _Must_inspect_result_ _Outptr_ PVOID * SectionObject
#define KeGetCurrentIrql()
#define UDFAcquireResourceExclusive(Resource, CanWait)
#define UDF_VCB_FLAGS_MEDIA_READ_ONLY
VOID UDFReleaseIrpContext(PtrUDFIrpContext PtrIrpContext)
PtrUDFIrpContext UDFAllocateIrpContext(PIRP Irp, PDEVICE_OBJECT PtrTargetDeviceObject)
BOOLEAN NTAPI CcPurgeCacheSection(IN PSECTION_OBJECT_POINTERS SectionObjectPointer, IN OPTIONAL PLARGE_INTEGER FileOffset, IN ULONG Length, IN BOOLEAN UninitializeCacheMaps)
VOID NTAPI UDFDeferredWriteCallBack(IN PVOID Context1, IN PVOID Context2)
struct _UDFContextControlBlock * PtrUDFCCB
#define STATUS_INSUFFICIENT_RESOURCES
_In_ ULONG _In_ ULONG _In_ ULONG Length
#define UDFCloseAllSystemDelayedInDir(Vcb, FI)
#define FsRtlEnterFileSystem
#define FSRTL_MOD_WRITE_TOP_LEVEL_IRP
#define UDFGetFileAllocationSize(Vcb, FileInfo)
#define UDF_IRP_CONTEXT_NOT_TOP_LEVEL
#define PsGetCurrentThread()
VOID NTAPI CcFlushCache(IN PSECTION_OBJECT_POINTERS SectionObjectPointer, IN OPTIONAL PLARGE_INTEGER FileOffset, IN ULONG Length, OUT OPTIONAL PIO_STATUS_BLOCK IoStatus)
#define FsRtlExitFileSystem
VOID UDFLogEvent(NTSTATUS UDFEventLogId, NTSTATUS RC)
#define UDF_IRP_CONTEXT_WRITE_THROUGH
#define STATUS_INVALID_PARAMETER
#define UDF_NODE_TYPE_VCB
#define CollectStatistics2(VCB, Field)
BOOLEAN NTAPI FsRtlCheckLockForWriteAccess(IN PFILE_LOCK FileLock, IN PIRP Irp)
#define UDFReleaseResource(Resource)
#define STATUS_INVALID_DEVICE_REQUEST
struct _FCB::@709::@712 Fcb
#define FILE_NOTIFY_CHANGE_SIZE
#define FILE_NOTIFY_CHANGE_LAST_WRITE
void UDFSetFileSizeInDirNdx(IN PVCB Vcb, IN PUDF_FILE_INFO FileInfo, IN int64 *ASize)
#define UDF_IRP_CONTEXT_CAN_BLOCK
#define FILE_NOTIFY_CHANGE_STREAM_SIZE
#define UDF_VCB_FLAGS_RAW_DISK
#define FO_SYNCHRONOUS_IO
#define FO_FILE_SIZE_CHANGED
#define UDF_IRP_CONTEXT_FLUSH2_REQUIRED
#define UDF_VCB_FLAGS_VOLUME_READ_ONLY
_In_ PDEVICE_OBJECT DeviceObject
#define IO_DISK_INCREMENT
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
#define UDF_VCB_FLAGS_UNSAFE_IOCTL
#define CcIsFileCached(FO)
#define FILE_ACTION_MODIFIED
#define STATUS_INVALID_USER_BUFFER
#define _SEH2_GetExceptionInformation()
#define FILE_ACTION_MODIFIED_STREAM
#define _SEH2_AbnormalTermination()
#define UDF_VCB_FLAGS_SHUTDOWN
#define IoCompleteRequest
OSSTATUS UDFTWrite(IN void *_Vcb, IN void *Buffer, IN SIZE_T Length, IN uint32 LBA, OUT PSIZE_T WrittenBytes, IN uint32 Flags)
__inline VOID UDFNotifyFullReportChange(PVCB V, PUDF_FILE_INFO FI, ULONG E, ULONG A)
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
NTSTATUS UDFExceptionHandler(PtrUDFIrpContext PtrIrpContext, PIRP Irp)
#define UDF_MAX_VERIFY_CACHE
VOID UDFPurgeCacheEx_(PtrUDFNTRequiredFCB NtReqFcb, LONGLONG Offset, LONGLONG Length, BOOLEAN CanWait, PVCB Vcb, PFILE_OBJECT FileObject)
#define FILE_WRITE_TO_END_OF_FILE
#define UDF_VCB_SKIP_EJECT_CHECK
#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 UDF_FCB_DIRECTORY
PIRP NTAPI IoGetTopLevelIrp(VOID)
#define STATUS_ACCESS_DENIED
#define FSRTL_MAX_TOP_LEVEL_IRP_FLAG
#define FILE_NOTIFY_CHANGE_STREAM_WRITE
#define FSRTL_FSP_TOP_LEVEL_IRP
BOOLEAN __fastcall UDFIsIrpTopLevel(PIRP Irp)
#define UDF_IRP_CONTEXT_FORCED_POST
NTSTATUS NTAPI UDFWrite(PDEVICE_OBJECT DeviceObject, PIRP Irp)
#define CollectStatisticsEx(VCB, Field, a)
#define UDF_VCB_FLAGS_VOLUME_MOUNTED
VOID NTAPI IoSetTopLevelIrp(IN PIRP Irp)
OSSTATUS UDFWriteFile__(IN PVCB Vcb, IN PUDF_FILE_INFO FileInfo, IN int64 Offset, IN SIZE_T Length, IN BOOLEAN Direct, IN int8 *Buffer, OUT PSIZE_T WrittenBytes)
long UDFExceptionFilter(PtrUDFIrpContext PtrIrpContext, PEXCEPTION_POINTERS PtrExceptionPointers)
#define UDFIsFileCached__(Vcb, FileInfo, Offset, Length, ForWrite)
_Inout_ PFILE_OBJECT _In_ TYPE_OF_OPEN PFCB _In_opt_ PCCB Ccb
OSSTATUS WCacheEODirect__(IN PW_CACHE Cache, IN PVOID Context)
#define UDFZeroDataEx(NtReqFcb, Offset, Length, CanWait, Vcb, FileObject)
#define UDFAcquireResourceShared(Resource, CanWait)
#define UDF_FCB_PAGE_FILE
#define UFD_VERIFY_FLAG_WAIT
_In_ PNET_PNP_EVENT _In_ PTDI_PNP_CONTEXT _In_ PTDI_PNP_CONTEXT Context2
#define FSRTL_FAST_IO_TOP_LEVEL_IRP
BOOLEAN NTAPI CcCopyWrite(IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN ULONG Length, IN BOOLEAN Wait, IN PVOID Buffer)
FAST_IO_POSSIBLE NTAPI UDFIsFastIoPossible(IN PtrUDFFCB Fcb)
_In_ ULONG _In_ ULONG Offset
PVOID UDFGetCallersBuffer(PtrUDFIrpContext PtrIrpContext, PIRP Irp)
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
#define UDF_ERROR_INTERNAL_ERROR
NTSTATUS UDFPostRequest(IN PtrUDFIrpContext PtrIrpContext, IN PIRP Irp)
_In_ PIO_STACK_LOCATION IrpSp
VOID NTAPI CcSetFileSizes(IN PFILE_OBJECT FileObject, IN PCC_FILE_SIZES FileSizes)
#define UDF_CHECK_PAGING_IO_RESOURCE(NTReqFCB)
OSSTATUS UDFResizeFile__(IN PVCB Vcb, IN OUT PUDF_FILE_INFO FileInfo, IN int64 NewLength)
_In_ PNET_PNP_EVENT _In_ PTDI_PNP_CONTEXT Context1
VOID UDFMdlComplete(PtrUDFIrpContext PtrIrpContext, PIRP Irp, PIO_STACK_LOCATION IrpSp, BOOLEAN ReadCompletion)
#define UDFAcquireSharedStarveExclusive(Resource, CanWait)
#define CollectStatistics(VCB, Field)
ULONG UDFFlushLogicalVolume(IN PtrUDFIrpContext PtrIrpContext, IN PIRP Irp, IN PVCB Vcb, IN ULONG FlushFlags)
#define STATUS_FILE_LOCK_CONFLICT
VOID UDFCloseAllDelayed(IN PVCB Vcb)
#define UDF_IRP_CONTEXT_RES1_ACQ
NTSTATUS UDFUnlockCallersBuffer(PtrUDFIrpContext PtrIrpContext, PIRP Irp, PVOID SystemBuffer)
BOOLEAN UDFAcquireResourceExclusiveWithCheck(IN PERESOURCE Resource)
#define _SEH2_EXCEPT(...)
#define UDF_IRP_CONTEXT_DEFERRED_WRITE
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
#define FSRTL_CACHE_TOP_LEVEL_IRP
#define FILE_NOTIFY_CHANGE_LAST_ACCESS
VOID UDFVVerify(IN PVCB Vcb, IN ULONG Flags)
#define UDF_IRP_CONTEXT_RES2_ACQ
NTSTATUS UDFCommonWrite(PtrUDFIrpContext PtrIrpContext, PIRP Irp)
#define UDF_SYS_CACHE_STOP_THR
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)
NTSTATUS UDFLockCallersBuffer(PtrUDFIrpContext PtrIrpContext, PIRP Irp, BOOLEAN IsReadOperation, uint32 Length)
#define IRP_SYNCHRONOUS_PAGING_IO
IN PDCB IN PCCB IN VBO IN OUT PULONG OUT PDIRENT OUT PBCB OUT PVBO ByteOffset
#define UDF_NTREQ_FCB_MODIFIED
#define UDF_VCB_FLAGS_VOLUME_LOCKED
ULONG UDFIsResourceAcquired(IN PERESOURCE Resource)
VOID NTAPI CcSetReadAheadGranularity(IN PFILE_OBJECT FileObject, IN ULONG Granularity)