CcChargeDirtyPages

VOID __fastcall CcChargeDirtyPages(INT64 a1, INT64 a2, INT64 a3, UINT64 a4){
  unsigned __int64 v4; 
  __int64 v8; 
  v4 = (unsigned int)a4;
  if( a1 )
  {
    v8 = *(_QWORD *)(a1 + 528);
    if( *(_QWORD *)(a1 + 168)
      && v8 != *(_QWORD *)(MmGetControlAreaPartition(*(_QWORD *)((*(_QWORD *)(a1 + 96) & 0xFFFFFFFFFFFFFFF0ui64) + 0x28))
                         + 8) )
    {
      KeBugCheckEx(0x34u, 0x1313ui64, 0xFFFFFFFFC0000420ui64, 0i64, 0i64);
    }
  }
  else
  {
    v8 = *((_QWORD *)PspSystemPartition + 1);
  }
  *(_QWORD *)(v8 + 640) += v4;
  if( a2 )
    *(_DWORD *)(a2 + 8) += v4;
  if( a3 )
    *(_DWORD *)(a3 + 32) += v4;
  if( a1 )
  {
    *(_DWORD *)(a1 + 112) += v4;
    _InterlockedExchangeAdd64((volatile signed __int64 *)(*(_QWORD *)(a1 + 504) + 32i64), v4);
    if( (*(_DWORD *)(a1 + 152) & 0x1000000) != 0 )
    {
      _InterlockedExchangeAdd64((volatile signed __int64 *)(*(_QWORD *)(a1 + 240) + 24i64), v4);
      if( *(_QWORD *)(*(_QWORD *)(a1 + 240) + 136i64) == -1i64 )
        *(_QWORD *)(*(_QWORD *)(a1 + 240) + 136i64) = KUSER_SHARED_DATA.TickCountQuad;
    }
  }
  if( *(_BYTE *)(v8 + 964) && *(_QWORD *)(v8 + 640) >= 0x2000ui64 )
    CcScheduleLazyWriteScan(v8, 1u);
  if( *(_BYTE *)(v8 + 140) )
  {
    CcScheduleLazyWriteScan(v8, 0);
    *(_BYTE *)(v8 + 140) = 0;
  }
  CcAdjustWriteBehindThreadPoolIfNeeded(v8);
}

Referenced by:

CcAddDirtyPagesToExternalCache
CcSetDirtyInMask
CcSetDirtyPinnedData