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