CcNotifyExternalCaches

VOID __stdcall CcNotifyExternalCaches(UINT64 ReasonForFlush){
  unsigned int v1; 
  UINT64 v2; 
  unsigned __int64 v3; 
  _QWORD *v4; 
  unsigned int v5; 
  unsigned __int64 v6; 
  _QWORD *i; 
  __int64 v8; 
  _KLOCK_QUEUE_HANDLE LockQueue; 

  *(_QWORD *)&LockQueue.OldIrql = 0i64;
  v1 = ReasonForFlush;
  v2 = *(_QWORD *)(PspSystemPartition + 8);
  LockQueue.LockQueue.Next = 0i64;
  LockQueue.LockQueue.Lock = (unsigned __int64 *volatile)(v2 + 128);
  v3 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc((UINT64 *)&CmpDummyThreadEvent + 385);
  KxAcquireQueuedSpinLock(&LockQueue.LockQueue, (UINT64 *)(v2 + 128));
  v4 = (_QWORD *)(v2 + 640);
  v5 = CcCalculatePagesToWrite(v2, (_DIRTY_PAGE_STATISTICS *)v1, (_DIRTY_PAGE_THRESHOLDS *)(v2 + 640), v2 + 664);
  if( v5 == 0xFFFFFFFFi64 )
  {
    LODWORD(v6) = 100;
  }
  else if( *v4 )
  {
    v6 = 100 * (unsigned __int64)v5 / *v4;
  }
  else
  {
    LODWORD(v6) = 0;
  }
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
  if( (_DWORD)v6 )
  {
    for( i = (_QWORD *)*(&CmpDummyThreadEvent + 386);
          i != (_QWORD *)((char *)&CmpDummyThreadEvent + 3088);
          i = (_QWORD *)*i )
    {
      v8 = *(i - 3);
      if( v8 )
        ((void(__fastcall *)(_QWORD *, unsigned __int64, _QWORD))*(i - 4))(
          i - 4,
          v8 * (unsigned __int64)(unsigned int)v6 / 0x64,
          v1);
    }
  }
  KxReleaseSpinLock((UINT64 *)&CmpDummyThreadEvent + 385);
  __writecr8(v3);
}

Referenced by:

CcQueueLazyWriteScanThread