CcFlushCachePriv

VOID __fastcall CcFlushCachePriv(
        _SECTION_OBJECT_POINTERS *SectionObjectPointer,
        _LARGE_INTEGER *FileOffset,
        UINT64 Length,
        _LARGE_INTEGER *LargestLsn,
        UINT8 MarkWritethrough,
        _IO_STATUS_BLOCK *IoStatus){
  char v6; 
  int v8; 
  __int64 v9; 
  _IO_STATUS_BLOCK *v10; 
  int v11; 
  _LARGE_INTEGER *v12; 
  _SHARED_CACHE_MAP *SharedCacheMap; 
  signed __int64 *v14; 
  WORK_QUEUE_TYPE v15; 
  PVOID v16; 
  unsigned int Flags; 
  int v18; 
  UINT8 *v19; 
  signed __int64 v20; 
  signed __int64 QuadPart; 
  _KEVENT *v22; 
  void **v23; 
  int v24; 
  int Status; 
  int v26; 
  int v27; 
  int v28; 
  char v29; 
  char v30; 
  unsigned int v31; 
  __int64 *p_IoObject; 
  unsigned int v33; 
  unsigned int v34; 
  INT64 v35; 
  unsigned int v36; 
  int v37; 
  INT64 VirtualAddressIfMapped; 
  _KEVENT *v39; 
  unsigned int v40; 
  __int64 v41; 
  struct _KEVENT *v42; 
  unsigned int v43; 
  void(__fastcall *Routine)(void *, void *, _IO_WORKITEM *); 
  UINT64 v45; 
  unsigned int v46; 
  int v47; 
  int v48; 
  INT64 v49; 
  CHAR v50; 
  char *v51; 
  int v52; 
  _KEVENT *v53; 
  int v54; 
  int v55; 
  int v56; 
  INT64 v57; 
  int v58; 
  INT64 v59; 
  INT64 v60; 
  __int64 v61; 
  LONGLONG v62; 
  void *v63; 
  ULONG_PTR BugCheckParameter4; 
  ULONG_PTR BugCheckParameter4a; 
  ULONG_PTR BugCheckParameter4b; 
  UINT64 v67; 
  UINT64 v68; 
  UINT64 v69; 
  INT64 v70; 
  int v71; 
  int v72; 
  unsigned int v73; 
  int v74; 
  int v75; 
  _LARGE_INTEGER *Offset; 
  INT64 Partition; 
  unsigned int v78; 
  _LARGE_INTEGER v79; 
  INT64 Information; 
  struct _IO_WORKITEM v81; 
  _IO_STATUS_BLOCK *v82; 
  __int128 v83; 
  _LARGE_INTEGER *v85; 
  unsigned int v86; 
  v86 = Length;
  v85 = FileOffset;
  v79.QuadPart = 0i64;
  v6 = 0;
  memset(&v81.IoObject, 0, 48);
  v70 = 0i64;
  v73 = 0;
  v8 = 0;
  v75 = 0;
  v9 = 0i64;
  v78 = 0;
  v74 = 0;
  v71 = 0;
  v72 = 0;
  Information = 0i64;
  Partition = 0i64;
  v83 = 0i64;
  memset(&v81, 0, 24);
  if( LargestLsn && FileOffset && FileOffset != (_LARGE_INTEGER *)CcNoDelay )
    KeBugCheckEx(0x34u, 0x1640ui64, 0xFFFFFFFFC0000420ui64, 0i64, 0i64);
  v10 = (_IO_STATUS_BLOCK *)&v83;
  if( IoStatus )
    v10 = IoStatus;
  v81.Routine = 0i64;
  v82 = v10;
  v10->Status = 0;
  if( FileOffset == (_LARGE_INTEGER *)CcNoDelay )
  {
    FileOffset = 0i64;
    Information = v10->Information;
    v85 = 0i64;
    v10->Status = -2147483626;
    v71 = 1;
  }
  else
  {
    v11 = 1;
    if( MarkWritethrough )
      v11 = 17;
    HIDWORD(v70) = v11;
  }
  v10->Information = 0i64;
  v12 = 0i64;
  if( FileOffset != &CcFlushForImageSection )
    v12 = FileOffset;
  KeAcquireInStackQueuedSpinLock(&CcMasterLock, (KLOCK_QUEUE_HANDLE *)&v81.Type);
  SharedCacheMap = (_SHARED_CACHE_MAP *)SectionObjectPointer->SharedCacheMap;
  v14 = (signed __int64 *)v12;
  Offset = v12;
  if( !SharedCacheMap )
  {
    v18 = v71;
    goto LABEL_29;
  }
  Partition = CcGetPartition(SharedCacheMap);
  v81.WorkItem.List.Flink = 0i64;
  v81.WorkItem.List.Blink = (_LIST_ENTRY *)(Partition + 128);
  KxAcquireQueuedSpinLock(&v81, (PIO_WORKITEM_ROUTINE)(Partition + 128), v15, v16);
  Flags = SharedCacheMap->Flags;
  v6 = 1;
  Offset = v12;
  v14 = (signed __int64 *)v12;
  if( (Flags & 0x2000) != 0 )
  {
    if( ((unsigned __int8)v12 & 1) == 0 )
      goto LABEL_36;
    v14 = (signed __int64 *)((unsigned __int64)v12 ^ 1);
    Offset = (_LARGE_INTEGER *)((unsigned __int64)v12 ^ 1);
  }
  v18 = v71;
  if( !v71 )
  {
    if( !v14 )
    {
LABEL_26:
      v19 = (UINT8 *)v86;
      ++SharedCacheMap->WritesInProgress;
      goto LABEL_30;
    }
    v20 = *v14;
    QuadPart = SharedCacheMap->SectionSize.QuadPart;
    if( *v14 < QuadPart )
    {
      v19 = (UINT8 *)v86;
      if( v20 + v86 <= QuadPart )
      {
        v14 = (signed __int64 *)Offset;
        ++SharedCacheMap->WritesInProgress;
        goto LABEL_30;
      }
      v86 = QuadPart - v20;
      v14 = (signed __int64 *)Offset;
      goto LABEL_26;
    }
LABEL_36:
    KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&v81);
LABEL_37:
    KeReleaseInStackQueuedSpinLock((PKLOCK_QUEUE_HANDLE)&v81.Type);
    return;
  }
  if( (Flags & 0x10000) == 0 )
  {
LABEL_29:
    v19 = (UINT8 *)v86;
    goto LABEL_30;
  }
  v19 = (UINT8 *)v86;
  v72 = 1;
  if( SharedCacheMap->WritesInProgress )
    v8 = 1;
  v14 = (signed __int64 *)Offset;
LABEL_30:
  if( v14 && !(_DWORD)v19 )
  {
    if( SharedCacheMap )
    {
      if( !v18 )
        --SharedCacheMap->WritesInProgress;
    }
    if( !v6 )
      goto LABEL_37;
    goto LABEL_36;
  }
  if( v85 == &CcFlushForImageSection )
  {
    if( !SharedCacheMap )
      goto LABEL_45;
    if( SharedCacheMap->WritesInProgress >= 2 || !CcSerializeWithLazyWriter(Partition, (INT64)SharedCacheMap, v19) )
    {
      --SharedCacheMap->WritesInProgress;
      KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&v81);
      KeReleaseInStackQueuedSpinLock((PKLOCK_QUEUE_HANDLE)&v81.Type);
      v10->Status = -1073741740;
      return;
    }
  }
  if( SharedCacheMap )
  {
    ++SharedCacheMap->OpenCount;
    ++SharedCacheMap->InternalRefCount;
    v9 = *(_QWORD *)((SharedCacheMap->FileObjectFastRef.Value & 0xFFFFFFFFFFFFFFF0ui64) + 0x18);
  }
LABEL_45:
  if( v6 )
    KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&v81);
  KeReleaseInStackQueuedSpinLock((PKLOCK_QUEUE_HANDLE)&v81.Type);
  if( SharedCacheMap && (SharedCacheMap->Flags & 0x40000000) != 0 )
    v8 = 1;
  if( (xmmword_140CFB490 & 0x20000) != 0 )
    CcPerfLogFlushCache(Information, (INT64)SharedCacheMap, (INT64 *)Offset, v86, v18, v72, v8 == 1);
  if( !v18 )
  {
    if( !SharedCacheMap )
      goto LABEL_64;
    if( (SharedCacheMap->Flags & 0x20) != 0 )
      CcBoostLowPriorityWorkerThread((_SHARED_CACHE_MAP *)Partition);
  }
  if( (!SharedCacheMap
     || (*(_BYTE *)(v9 + 6) & 0x10) != 0 && (*(_BYTE *)(v9 + 4) & 0x20) != 0
     || (SharedCacheMap->Flags & 0x20000) != 0)
    && !v18
    || v8 )
  {
    goto LABEL_64;
  }
  if( !SharedCacheMap )
    return;
  if( (SharedCacheMap->Flags & 0x4000000) != 0 )
  {
LABEL_64:
    if( (xmmword_140CFB490 & 0x20000) != 0 )
    {
      LODWORD(BugCheckParameter4) = HIDWORD(v70);
      CcPerfLogFlushSection((_WORK_QUEUE_ENTRY *)Information, SharedCacheMap, Offset, v86, BugCheckParameter4);
    }
    if( SharedCacheMap )
      CcUnmapVacbArray(SharedCacheMap, Offset, v86, 0, 0);
    LODWORD(v67) = HIDWORD(v70);
    v23 = (void **)Offset;
    MmFlushSection(SectionObjectPointer, Offset, v86, v22, v10, v67);
    if( v24 >= 0 )
      goto LABEL_74;
    Status = v10->Status;
    if( v18 )
    {
      if( Status != -2147483626 )
        goto LABEL_74;
    }
    else if( Status )
    {
LABEL_74:
      v26 = v75;
      if( v10->Status < 0 )
        v26 = v10->Status;
      v75 = v26;
      goto LABEL_78;
    }
    v10->Status = v24;
    goto LABEL_74;
  }
  v26 = v75;
  v23 = (void **)Offset;
LABEL_78:
  if( !SharedCacheMap )
    goto LABEL_193;
  if( (SharedCacheMap->Flags & 0x4000000) != 0 )
    goto LABEL_184;
  if( v23 )
    v81.IoObject = *v23;
  v27 = 1;
  if( v86 )
    v27 = v86;
  LODWORD(v70) = v27;
  if( v18 )
    v81.Routine = (void(__fastcall *)(void *, void *, _IO_WORKITEM *))KUSER_SHARED_DATA.TickCountQuad;
  do
  {
LABEL_86:
    v28 = v72;
    if( !SharedCacheMap->PagesToWrite && v18 && !v72
      || !SharedCacheMap->FileSize.QuadPart && (SharedCacheMap->Flags & 4) == 0 && !SharedCacheMap->DirtyPages
      || v74 )
    {
      goto LABEL_181;
    }
    v30 = 0;
    if( v18 )
    {
      CcAmILowPriorityWriter(SharedCacheMap);
      if( v29 )
        v30 = 1;
    }
    v31 = !v18 || v28 ? v70 : 0;
    if( !v18 || v28 )
    {
      p_IoObject = (__int64 *)&v81.IoObject;
      if( !Offset )
        p_IoObject = 0i64;
    }
    else
    {
      p_IoObject = 0i64;
    }
    if( !CcAcquireByteRangeForWrite(
            (__int64)SharedCacheMap,
            p_IoObject,
            v31,
            LargestLsn,
            &v79,
            (unsigned int *)&v70,
            (__int64 *)&v81.WorkOnBehalfThread,
            v30) )
      goto LABEL_181;
    v33 = v70;
    v34 = 0;
    v35 = Partition;
    v36 = v70;
    v37 = v72;
    while( 1 )
    {
      VirtualAddressIfMapped = CcGetVirtualAddressIfMapped(
                                 (INT64)SharedCacheMap,
                                 v79.QuadPart + v33 - (unsigned __int64)v36,
                                 (INT64 *)&v81.Context,
                                 &v73);
      if( VirtualAddressIfMapped )
      {
        v40 = v73;
        if( v73 > v36 )
          v40 = v36;
        v73 = v40;
        if( !(unsigned __int8)MmSetAddressRangeModifiedEx(VirtualAddressIfMapped, v40) && !v34
          || v79.QuadPart + (unsigned int)v70 >= SharedCacheMap->ValidDataLength.QuadPart
          || (SharedCacheMap->LazyWritePassCount & 0xF) == 0
          || !v18
          || v37
          || (SharedCacheMap->Flags & 0x200) != 0
          || (v34 = 1, *(_BYTE *)(v35 + 964)) )
        {
          v34 = 0;
        }
        v41 = *((_QWORD *)v81.Context + 1);
        if( !(unsigned __int16)_InterlockedDecrement((volatile signed __int32 *)v81.Context + 4) )
        {
          v42 = *(struct _KEVENT **)(v41 + 184);
          if( v42 )
            KeSetEvent(v42, 0);
          _InterlockedDecrement((volatile signed __int32 *)(v41 + 544));
        }
        v18 = v71;
      }
      else
      {
        v43 = v73;
        if( v73 > v36 )
          v43 = v36;
        v73 = v43;
      }
      v36 -= v73;
      if( !v36 )
        break;
      v33 = v70;
    }
    __addgsdword(0x8128u, v34);
    Routine = v81.Routine;
    v10 = v82;
    v26 = v75;
    if( v34 )
    {
      v59 = Partition;
      KeAcquireInStackQueuedSpinLock((UINT64 *)(Partition + 128), (KLOCK_QUEUE_HANDLE *)&v81);
      *(_QWORD *)(v59 + 752) += (unsigned __int64)(unsigned int)v70 >> 12;
      KeReleaseInStackQueuedSpinLock((PKLOCK_QUEUE_HANDLE)&v81);
      goto LABEL_167;
    }
    if( (xmmword_140CFB490 & 0x20000) != 0 )
    {
      LODWORD(BugCheckParameter4a) = HIDWORD(v70);
      CcPerfLogFlushSection(
        (_WORK_QUEUE_ENTRY *)Information,
        SharedCacheMap,
        &v79,
        (unsigned int)v70,
        BugCheckParameter4a);
    }
    v45 = (unsigned int)v70;
    LODWORD(v68) = HIDWORD(v70);
    v46 = v18 != 0 ? 0x80000016 : 0;
    v10->Status = v46;
    MmFlushSection(SectionObjectPointer, &v79, v45, v39, v10, v68);
    if( v47 >= 0 )
      goto LABEL_139;
    v48 = v10->Status;
    if( v18 )
    {
      if( v48 != -2147483626 )
        goto LABEL_139;
LABEL_138:
      v10->Status = v47;
      goto LABEL_139;
    }
    if( !v48 )
      goto LABEL_138;
LABEL_139:
    v49 = (unsigned int)v10->Status;
    if( (int)v49 >= 0 )
    {
      if( (SharedCacheMap->Flags & 0x400) == 0 )
      {
        KeAcquireInStackQueuedSpinLock((UINT64 *)(Partition + 128), (KLOCK_QUEUE_HANDLE *)&v81);
        SharedCacheMap->Flags |= 0x400u;
        KeReleaseInStackQueuedSpinLock((PKLOCK_QUEUE_HANDLE)&v81);
      }
      if( v18 )
      {
        __incgsdword(0x812Cu);
        __addgsdword(0x8130u, (unsigned int)(v70 + 4095) >> 12);
        v50 = 0;
      }
      else
      {
LABEL_160:
        v50 = 0;
      }
      goto LABEL_168;
    }
    v51 = (char *)v79.QuadPart;
    v52 = v70;
    v81.WorkItem.Parameter = (void *)v79.QuadPart;
    if( !CcIsFatalWriteError((INT64)SharedCacheMap, v49) )
    {
      v74 = 1;
      goto LABEL_167;
    }
    v54 = v71;
    do
    {
      if( (xmmword_140CFB490 & 0x20000) != 0 )
      {
        LODWORD(BugCheckParameter4b) = HIDWORD(v70);
        CcPerfLogFlushSection(
          (_WORK_QUEUE_ENTRY *)Information,
          SharedCacheMap,
          (_LARGE_INTEGER *)&v81.WorkItem.Parameter,
          0x1000ui64,
          BugCheckParameter4b);
      }
      LODWORD(v69) = HIDWORD(v70);
      v10->Status = v46;
      MmFlushSection(SectionObjectPointer, (_LARGE_INTEGER *)&v81.WorkItem.Parameter, 0x1000ui64, v53, v10, v69);
      if( v55 < 0 )
      {
        v56 = v10->Status;
        if( !v54 )
        {
          if( v56 )
            goto LABEL_155;
LABEL_154:
          v10->Status = v55;
          goto LABEL_155;
        }
        if( v56 == -2147483626 )
          goto LABEL_154;
      }
LABEL_155:
      v57 = (unsigned int)v10->Status;
      if( (int)v57 >= 0 )
      {
        KeAcquireInStackQueuedSpinLock((UINT64 *)(Partition + 128), (KLOCK_QUEUE_HANDLE *)&v81);
        SharedCacheMap->Flags |= 0x400u;
        KeReleaseInStackQueuedSpinLock((PKLOCK_QUEUE_HANDLE)&v81);
LABEL_157:
        v58 = v74;
        goto LABEL_158;
      }
      if( CcIsFatalWriteError((INT64)SharedCacheMap, v57) )
      {
        if( !v26 )
          v26 = v10->Status;
        goto LABEL_157;
      }
      v58 = 1;
      v74 = 1;
      if( !v26 )
        v26 = v10->Status;
LABEL_158:
      v51 += 4096;
      v81.WorkItem.Parameter = v51;
      v52 -= 4096;
    }
    while( v52 );
    Routine = v81.Routine;
    v75 = v26;
    if( !v58 )
      goto LABEL_160;
LABEL_167:
    v50 = 1;
LABEL_168:
    CcReleaseByteRangeFromWrite((INT64)SharedCacheMap, (INT64 *)&v79, (unsigned int)v70, v81.WorkOnBehalfThread, v50);
    v60 = Partition;
    v78 += v70;
    if( v78 >= 0x40000 && *(_QWORD *)(Partition + 784) != Partition + 784 )
    {
      CcPostDeferredWrites();
      v60 = Partition;
      v78 = 0;
    }
    v18 = v71;
    if( v71 && !v72 )
    {
      v61 = *(_QWORD *)(v60 + 784) == v60 + 784 ? CcIdleDelayTick / 0xAu : (unsigned int)CcIdleDelayTick;
      if( (__int64)KUSER_SHARED_DATA.TickCountQuad > (__int64)Routine + v61 )
      {
        v10->Information = 35422i64;
        goto LABEL_181;
      }
    }
  }
  while( !Offset );
  v62 = Offset->QuadPart;
  v63 = (void *)((unsigned int)v70 + v79.QuadPart);
  v79.QuadPart = (LONGLONG)v63;
  if( v62 + v86 > (__int64)v63 )
  {
    v81.IoObject = v63;
    LODWORD(v70) = v86 + v62 - (_DWORD)v63;
    goto LABEL_86;
  }
LABEL_181:
  if( v78 && *(_QWORD *)(Partition + 784) != Partition + 784 )
    CcPostDeferredWrites();
LABEL_184:
  KeAcquireInStackQueuedSpinLock((UINT64 *)(Partition + 128), (KLOCK_QUEUE_HANDLE *)&v81);
  CcDecrementOpenCount((INT64)SharedCacheMap);
  if( !v18 )
    --SharedCacheMap->WritesInProgress;
  if( v85 == &CcFlushForImageSection
    && v10->Status >= 0
    && v26 >= 0
    && (SharedCacheMap->DirtyPages || SharedCacheMap->WritesInProgress) )
  {
    v26 = -1073741740;
  }
  KeReleaseInStackQueuedSpinLock((PKLOCK_QUEUE_HANDLE)&v81);
LABEL_193:
  if( v26 < 0 )
    v10->Status = v26;
}

Referenced by:

CcCoherencyFlushAndPurgeCache
CcFlushCache
CcFlushCacheToLsn
CcMapAndCopyInToCache
CcWriteBehindInternal
CcZeroData
CcZeroEndOfLastPage
MiFlushDataSection