CcWriteBehindInternal

VOID __stdcall CcWriteBehindInternal(_WORK_QUEUE_ENTRY *WorkQueueEntry){
  __int64 v1; 
  __int64 v3; 
  char *Partition; 
  char *v5; 
  unsigned __int64 *v6; 
  unsigned __int64 *v7; 
  _SHARED_CACHE_MAP *v8; 
  unsigned int v9; 
  unsigned int v10; 
  __int64 v11; 
  __int64 v12; 
  unsigned int v13; 
  _SECTION_OBJECT_POINTERS *v14; 
  _LARGE_INTEGER *v15; 
  _IO_STATUS_BLOCK *v16; 
  unsigned int v17; 
  INT64 Status; 
  int v19; 
  void **v20; 
  INT64 v21; 
  bool v22; 
  bool v23; 
  _FILE_OBJECT *v24; 
  int v25; 
  bool v26; 
  __int64 v27; 
  unsigned int v28; 
  _LARGE_INTEGER v29; 
  _FILE_OBJECT *v30; 
  int v31; 
  char v32; 
  int v33; 
  bool v34; 
  _FILE_OBJECT *v35; 
  int v36; 
  UINT64 v37; 
  UINT8 v38; 
  _KLOCK_QUEUE_HANDLE LockHandle; 
  _LARGE_INTEGER ValidDataLength; 
  _IO_STATUS_BLOCK *IoStatus; 
  __int64 v42; 
  _KLOCK_QUEUE_HANDLE v43; 
  _KLOCK_QUEUE_HANDLE v44; 
  bool v46; 
  char v47; 
  int v48; 

  v1 = *((_QWORD *)WorkQueueEntry + 2);
  v3 = *((unsigned __int8 *)WorkQueueEntry + 56);
  IoStatus = (_IO_STATUS_BLOCK *)*((_QWORD *)WorkQueueEntry + 3);
  v47 = v3;
  ValidDataLength.QuadPart = 0i64;
  v42 = 0i64;
  memset(&v43, 0, sizeof(v43));
  memset(&LockHandle, 0, sizeof(LockHandle));
  memset(&v44, 0, sizeof(v44));
  Partition = (char *)CcGetPartition((_QWORD *)v1);
  v5 = Partition;
  if( Partition != *((char **)WorkQueueEntry + 16) )
    KeBugCheckEx(0x34u, (PVOID)0x1A98, (PVOID)0xFFFFFFFFC0000420i64, 0i64, 0i64);
  v6 = (unsigned __int64 *)(Partition + 192);
  v7 = (unsigned __int64 *)(Partition + 128);
  while( 1 )
  {
    v46 = 0;
    KeAcquireInStackQueuedSpinLock(v7, &LockHandle);
    ++*(_DWORD *)(v1 + 4);
    ++*(_DWORD *)(v1 + 536);
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
    __writecr8(LockHandle.OldIrql);
    LOBYTE(v8) = 1;
    CcApplyLowIoPriorityToThread((UINT8)v5, v8);
    KeAcquireInStackQueuedSpinLock(v6, &v44);
    v9 = *((_DWORD *)v5 + 240);
    v10 = *((_DWORD *)v5 + 50);
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&v44);
    __writecr8(v44.OldIrql);
    if( v9 >= v10 )
      CcApplyLowIoPriorityToThread((UINT8)v5, 0i64);
    LOBYTE(v11) = 1;
    if( !(**(unsigned __int8(__fastcall ***)(_QWORD, __int64))(v1 + 208))(*(_QWORD *)(v1 + 216), v11) )
      break;
    ExAcquireFastMutex((PFAST_MUTEX)(v1 + 280));
    KeAcquireInStackQueuedSpinLock(v7, &LockHandle);
    v48 = *(_DWORD *)(v1 + 152) & 0x10000;
    v12 = *(_QWORD *)(v1 + 160);
    if( v12 )
    {
      v13 = *(_DWORD *)(v12 + 8);
      *(_DWORD *)(v12 + 4) = v13;
      v28 = *((_DWORD *)v5 + 124);
      if( v13 > v28 )
      {
        *(_DWORD *)(v12 + 4) = v28;
        v13 = v28;
      }
    }
    else
    {
      v13 = *(_DWORD *)(v1 + 192);
    }
    v14 = *(_SECTION_OBJECT_POINTERS **)((*(_QWORD *)(v1 + 96) & 0xFFFFFFFFFFFFFFF0ui64) + 0x28);
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
    __writecr8(LockHandle.OldIrql);
    KeReleaseGuardedMutex((PKGUARDED_MUTEX)(v1 + 280));
    _InterlockedExchangeAdd((volatile signed __int32 *)(*(_QWORD *)(v1 + 504) + 196i64), v13);
    if( (*(_DWORD *)(v1 + 152) & 0x1000000) != 0
      && (_InterlockedExchangeAdd((volatile signed __int32 *)(*(_QWORD *)(v1 + 504) + 200i64), v13),
          (*(_DWORD *)(v1 + 152) & 0x1000000) != 0) )
    {
      v15 = (_LARGE_INTEGER *)&v42;
      v42 = *(_QWORD *)(*(_QWORD *)(v1 + 240) + 112i64);
    }
    else
    {
      v15 = 0i64;
    }
    v16 = IoStatus;
    CcFlushCachePriv(v14, (_LARGE_INTEGER *)&CmpDummyThreadEvent + 359, 1ui64, v15, 0, IoStatus);
    CcApplyLowIoPriorityToThread((UINT8)v5, 0i64);
    v17 = -v13;
    _InterlockedExchangeAdd((volatile signed __int32 *)(*(_QWORD *)(v1 + 504) + 196i64), v17);
    if( (*(_DWORD *)(v1 + 152) & 0x1000000) != 0 )
      _InterlockedExchangeAdd((volatile signed __int32 *)(*(_QWORD *)(v1 + 504) + 200i64), v17);
    (*(void(__fastcall **)(_QWORD))(*(_QWORD *)(v1 + 208) + 8i64))(*(_QWORD *)(v1 + 216));
    Status = (unsigned int)v16->Status;
    if( (_DWORD)Status != -2147483626 && CcIsFatalWriteError((_SHARED_CACHE_MAP *)v1, Status) )
    {
      v35 = CcReferenceSharedCacheMapFileObject((_SHARED_CACHE_MAP *)v1);
      CcMmLogLostDelayedWriteError(v35, (unsigned int)v16->Status);
      CcDereferenceSharedCacheMapFileObject((_SHARED_CACHE_MAP *)v1, v35);
    }
    v19 = 0;
    ExAcquireFastMutex((PFAST_MUTEX)(v1 + 280));
    ValidDataLength = *(_LARGE_INTEGER *)(v1 + 40);
    v20 = (void **)CcGetPartition((_QWORD *)v1);
    v22 = *(_DWORD *)(v1 + 4) > 1u && v20[98] != v20 + 98;
    v23 = 0;
    if( (*(_DWORD *)(v1 + 152) & 0x400) != 0 )
    {
      v27 = *(_QWORD *)(v1 + 40);
      if( *(_QWORD *)(v1 + 48) >= v27 && v27 != 0x7FFFFFFFFFFFFFFFi64 && *(_QWORD *)(v1 + 8) )
        v23 = 1;
    }
    if( !*(_DWORD *)(v1 + 516) && v23 && !v22 )
    {
      v29.anonymous_0.LowPart = CcGetFlushedValidData((INT64)v14, 1, v21);
      ValidDataLength = v29;
      if( v29.QuadPart >= *(_QWORD *)(v1 + 40) )
      {
        if( (*(_DWORD *)(v1 + 152) & 0x40000000) != 0
          || (KeReleaseGuardedMutex((PKGUARDED_MUTEX)(v1 + 280)),
              v30 = CcReferenceSharedCacheMapFileObject((_SHARED_CACHE_MAP *)v1),
              CcSetValidData(v30, &ValidDataLength),
              v19 = v31,
              CcDereferenceSharedCacheMapFileObject((_SHARED_CACHE_MAP *)v1, v30),
              ExAcquireFastMutex((PFAST_MUTEX)(v1 + 280)),
              v19 >= 0) )
        {
          *(_LARGE_INTEGER *)(v1 + 40) = ValidDataLength;
        }
        else if( v19 != -1073741670 && v19 != -2147483626 && v19 != -1073741740 )
        {
          ValidDataLength = *(_LARGE_INTEGER *)(v1 + 48);
        }
      }
    }
    KeReleaseGuardedMutex((PKGUARDED_MUTEX)(v1 + 280));
    v7 = (unsigned __int64 *)(v5 + 128);
    KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)v5 + 16, &LockHandle);
    --*(_DWORD *)(v1 + 4);
    --*(_DWORD *)(v1 + 536);
    if( !*(_DWORD *)(v1 + 4) )
    {
      if( v19 == -1073741740 || v19 == -2147483626 || v19 == -1073741670 )
      {
        if( (*(_DWORD *)(v1 + 152) & 0x10000) != 0 )
          CcCancelMmWaitForUninitializeCacheMap((_SHARED_CACHE_MAP *)v1);
        if( !*(_DWORD *)(v1 + 112) )
        {
          CcInsertIntoDirtySharedCacheMapList((_SHARED_CACHE_MAP *)v1);
          v32 = 1;
          goto LABEL_51;
        }
      }
      else
      {
        KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
        __writecr8(LockHandle.OldIrql);
        v24 = CcReferenceSharedCacheMapFileObject((_SHARED_CACHE_MAP *)v1);
        FsRtlAcquireFileExclusive((INT64)v24);
        KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&WheapErrorSourceTable + 189, &v43);
        KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)v5 + 16, &LockHandle);
        v25 = *(_DWORD *)(v1 + 4);
        if( !v25
          && (!*(_DWORD *)(v1 + 112)
           && (*(_QWORD *)(v1 + 40) == 0x7FFFFFFFFFFFFFFFi64
            || (*(_DWORD *)(v1 + 152) & 0x400) == 0
            || ValidDataLength.QuadPart >= *(_QWORD *)(v1 + 48))
           || !*(_QWORD *)(v1 + 8) && (*(_DWORD *)(v1 + 152) & 4) == 0) )
        {
          CcDeleteSharedCacheMap((_SHARED_CACHE_MAP *)v1, (UINT8)&v43, (UINT64)&LockHandle, (_FILE_OBJECT *)1);
          IoStatus->Information = 0i64;
LABEL_28:
          v26 = v47 == 0;
          goto LABEL_29;
        }
        if( *(_DWORD *)(v1 + 112) )
        {
          if( (*(_DWORD *)(v1 + 152) & 0x10000) != 0 )
            CcCancelMmWaitForUninitializeCacheMap((_SHARED_CACHE_MAP *)v1);
        }
        else
        {
          v34 = v25 == 0;
          if( !v25 )
          {
            CcInsertIntoDirtySharedCacheMapList((_SHARED_CACHE_MAP *)v1);
            v34 = v36 == 0;
          }
          v46 = v34;
        }
        KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
        __writecr8(LockHandle.OldIrql);
        KeReleaseInStackQueuedSpinLockFromDpcLevel(&v43);
        __writecr8(v43.OldIrql);
        FsRtlReleaseFile(v24);
        CcDereferenceSharedCacheMapFileObject((_SHARED_CACHE_MAP *)v1, v24);
        KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)v5 + 16, &LockHandle);
      }
    }
    v32 = v46;
LABEL_51:
    v33 = *(_DWORD *)(v1 + 152);
    if( (v33 & 0x10000) == 0 || v48 )
    {
      if( IoStatus->Information != 35422 )
        *(_DWORD *)(v1 + 152) = v33 & 0xFFFFFFDF;
      if( v32 )
      {
        v5[633] = 1;
        CcScheduleLazyWriteScan((UINT8)v5, (*(_DWORD *)(v1 + 152) & 0x10000) != 0);
      }
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
      __writecr8(LockHandle.OldIrql);
      goto LABEL_28;
    }
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
    __writecr8(LockHandle.OldIrql);
    v6 = (unsigned __int64 *)(v5 + 192);
  }
  CcApplyLowIoPriorityToThread((UINT8)v5, 0i64);
  KeAcquireInStackQueuedSpinLock(v7, &LockHandle);
  *(_DWORD *)(v1 + 152) &= ~0x20u;
  if( (*(_DWORD *)(v1 + 152) & 0x10000) != 0 )
    CcCancelMmWaitForUninitializeCacheMap((_SHARED_CACHE_MAP *)v1);
  CcDecrementOpenCount((_SHARED_CACHE_MAP *)v1, v37, v38);
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  __writecr8(LockHandle.OldIrql);
  v26 = v47 == 0;
  IoStatus->Status = -1073741740;
LABEL_29:
  if( !v26 )
    KeSetEvent((PRKEVENT)((char *)WorkQueueEntry + 32), 0, 0);
}

Referenced by:

CcWriteBehind