CcNotifyExternalCaches

VOID __stdcall CcNotifyExternalCaches(UINT64 ReasonForFlush){
  UINT64 v1; 
  unsigned int v2; 
  INT64 v3; 
  unsigned __int8 v4; 
  unsigned __int64 v5; 
  WORK_QUEUE_TYPE v6; 
  PVOID v7; 
  _QWORD *v8; 
  unsigned int v9; 
  unsigned __int64 v10; 
  __int64 *i; 
  __int64 v12; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  *(_QWORD *)&LockHandle.OldIrql = 0i64;
  v2 = ReasonForFlush;
  v3 = *((_QWORD *)PspSystemPartition + 1);
  KeAcquireSpinLockRaiseToDpc(&CcExternalCacheListLock, v1);
  LockHandle.LockQueue.Next = 0i64;
  LockHandle.LockQueue.Lock = (unsigned __int64 *volatile)(v3 + 128);
  v5 = v4;
  KxAcquireQueuedSpinLock((PIO_WORKITEM)&LockHandle, (PIO_WORKITEM_ROUTINE)(v3 + 128), v6, v7);
  v8 = (_QWORD *)(v3 + 640);
  v9 = CcCalculatePagesToWrite(v3, v2, v3 + 640, (UINT64 *)(v3 + 664), 0);
  if( v9 == 0xFFFFFFFFi64 )
  {
    LODWORD(v10) = 100;
  }
  else if( *v8 )
  {
    v10 = 100 * (unsigned __int64)v9 / *v8;
  }
  else
  {
    LODWORD(v10) = 0;
  }
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  if( (_DWORD)v10 )
  {
    for( i = (__int64 *)CcExternalCacheList; i != &CcExternalCacheList; i = (__int64 *)*i )
    {
      v12 = *(i - 3);
      if( v12 )
        ((void(__fastcall *)(__int64 *, unsigned __int64, _QWORD))*(i - 4))(
          i - 4,
          v12 * (unsigned __int64)(unsigned int)v10 / 0x64,
          v2);
    }
  }
  KxReleaseSpinLock(&CcExternalCacheListLock);
  __writecr8(v5);
}

Referenced by:

CcQueueLazyWriteScanThread