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