KiMonitorCacheErrata
VOID __stdcall KiMonitorCacheErrata(KTRAP_FRAME *TrapFrame, PVOID Context){
struct _KPRCB *CurrentPrcb;
_DWORD *v3;
__int64 v4;
volatile signed __int32 *v5;
unsigned __int64 v6;
INT64 v7;
__int64 v8;
unsigned __int8 CurrentIrql;
const UINT64 *v10;
UINT64 v11;
_IMAGE_RESOURCE_DATA_ENTRY **v12;
INT64 v13;
BYTE v15;
char v16;
CurrentPrcb = KeGetCurrentPrcb();
v3 = (_DWORD *)KiCacheErrataMonitor;
v15 = 0;
v16 = 0;
v4 = KiCacheErrataMonitor + 16 * (*((unsigned int *)CurrentPrcb + 9) + 16i64);
_InterlockedExchange64((volatile __int64 *)v4, -1i64);
*(_DWORD *)(v4 + 8) -= KiSanitizedProfileInterval;
if( *(int *)(v4 + 8) <= 0 )
{
v5 = &v3[4 * *(unsigned int *)(v4 + 12) + 64];
if( (volatile signed __int32 *)v4 != v5 && !_interlockedbittestandreset64(v5, *((unsigned int *)CurrentPrcb + 9)) )
{
v6 = 0i64;
v7 = (INT64)*(&KiProcessorBlock + *(unsigned int *)(v4 + 12));
v8 = *(_QWORD *)(v7 + 8);
CurrentIrql = KeGetCurrentIrql();
__writecr8(0xFui64);
if( KiTryToAcquirePrcbLock(v7, &v15) )
{
v13 = *(_QWORD *)(v7 + 8);
if( KiTryToAcquireThreadLock(v13, &v16) )
{
v6 = *(_QWORD *)(v13 + 184);
if( (__int64 *)v6 != KiInitialProcess )
v6 &= -(__int64)(ObReferenceObjectSafeWithTag(*(PVOID *)(v13 + 184), 0x61727245ui64) != 0);
KiReleaseThreadLockSafe(v13);
}
_InterlockedAnd64((volatile signed __int64 *)(v7 + 48), 0i64);
v10 = (const UINT64 *)*((_QWORD *)KeGetCurrentPrcb() + 4247);
}
if( v8 == *(_QWORD *)(v7 + 8) )
MmReadProcessPageTables((VOID *)v7, v10, v11, v12);
__writecr8(CurrentIrql);
if( v6 )
{
if( (__int64 *)v6 != KiInitialProcess )
ObDereferenceObjectDeferDeleteWithTag((PVOID)v6, 0x61727245ui64);
}
}
*(_DWORD *)(v4 + 8) = *v3;
*(_DWORD *)(v4 + 12) = (*(_DWORD *)(v4 + 12) + 1) % (unsigned int)KeNumberProcessors_0;
}
}Referenced by:
No references.