CcZeroData
UINT8 __stdcall CcZeroData(PFILE_OBJECT FileObject, PLARGE_INTEGER StartOffset, PLARGE_INTEGER EndOffset, BOOL Wait){
LONGLONG QuadPart;
char v8;
__int64 v9;
INT64 v10;
__int64 v11;
unsigned int v12;
__int64 v13;
unsigned int v14;
LONGLONG v15;
ULONG v16;
_LARGE_INTEGER EndOffseta;
INT64 v19;
ULONG v20;
int v21;
_IO_STATUS_BLOCK IoStatus;
_KLOCK_QUEUE_HANDLE LockHandle;
UINT8 v24;
_LARGE_INTEGER StartingOffset;
PLARGE_INTEGER v26;
UINT8 Waita;
Waita = Wait;
v26 = EndOffset;
QuadPart = StartOffset->QuadPart;
StartingOffset = *StartOffset;
EndOffseta.QuadPart = 0i64;
v24 = 0;
v19 = 0i64;
memset(&LockHandle, 0, sizeof(LockHandle));
if( (FileObject->Flags & 0x10) != 0 || (v8 = 0, !FileObject->PrivateCacheMap) )
v8 = 1;
v9 = EndOffset->QuadPart - QuadPart;
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&WheapErrorSourceTable + 189, &LockHandle);
LODWORD(v10) = CcGetPartitionFromFileObject((INT64)FileObject);
v19 = v10;
if( _InterlockedIncrement64((volatile signed __int64 *)(v10 + 968)) <= 1 )
__fastfail(0xEu);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( !v8 && v9 <= 0x200000 && (*(_QWORD *)(**(_QWORD **)(v19 + 8) + 7104i64) >= 0x800ui64 || v9 <= 0x2000) || Wait )
{
LODWORD(v11) = IoGetRelatedDeviceObject((INT64)FileObject);
v12 = *(unsigned __int16 *)(v11 + 304);
if( *(_WORD *)(v11 + 304) )
{
LODWORD(v13) = IoGetRelatedDeviceObject((INT64)FileObject);
v14 = *(unsigned __int16 *)(v13 + 304) - 1;
}
else
{
v14 = 0;
}
if( v8 )
{
if( (v14 & StartingOffset.anonymous_0.LowPart) != 0 )
{
IoStatus = 0i64;
StartingOffset.QuadPart += v14;
StartingOffset.anonymous_0.LowPart &= ~v14;
v16 = StartingOffset.anonymous_0.LowPart - StartOffset->anonymous_0.LowPart;
if( !CcZeroDataInCache(FileObject, StartOffset, v16, Waita) )
goto LABEL_35;
CcFlushCachePriv(FileObject->SectionObjectPointer, StartOffset, v16, 0i64, 0, &IoStatus);
if( IoStatus.Status < 0 )
RtlRaiseStatus(IoStatus.Status);
}
LABEL_16:
if( StartingOffset.QuadPart < v26->QuadPart )
{
v15 = v14 + v26->QuadPart;
EndOffseta.QuadPart = (~v14 | 0xFFFFFFFF00000000ui64) & v15;
CcZeroDataOnDisk(FileObject, &StartingOffset, &EndOffseta, v12);
}
v24 = 1;
goto LABEL_35;
}
if( *(_QWORD *)(**(_QWORD **)(v19 + 8) + 7104i64) >= 0x800ui64 )
goto LABEL_11;
if( v9 > 0x2000 && (StartingOffset.anonymous_0.LowPart & v14) != 0 )
{
v21 = (StartingOffset.QuadPart + (unsigned __int64)v14) >> 32;
v20 = ~v14 & (StartingOffset.anonymous_0.LowPart + v14);
LODWORD(v9) = v20 - StartingOffset.anonymous_0.LowPart;
}
else
{
if( v9 <= 0x2000 )
{
LABEL_11:
if( v9 > 0x200000 )
{
IoStatus.Pointer = (void *)(StartingOffset.QuadPart + 0x200000 + v14);
IoStatus.Status = ~v14 & (StartingOffset.anonymous_0.LowPart + 0x200000 + v14);
LODWORD(v9) = IoStatus.Status - StartingOffset.anonymous_0.LowPart;
}
goto LABEL_13;
}
LODWORD(v9) = 0;
}
LABEL_13:
if( (_DWORD)v9 && !CcZeroDataInCache(FileObject, &StartingOffset, (unsigned int)v9, Waita) )
goto LABEL_35;
StartingOffset.QuadPart += (unsigned int)v9;
goto LABEL_16;
}
LABEL_35:
CcDereferencePartition(v19);
return v24;
}Referenced by:
FsRtlCopyWrite
FsRtlPrepareMdlWriteDev