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