SmcGetCacheStats
__int64 __fastcall SmcGetCacheStats(__int64 a1, _DWORD *a2){
struct EX_RUNDOWN_REF v4;
unsigned __int64 Count;
int Path;
unsigned int v7;
int v8;
_ETHREAD *CurrentThread;
INT64 *v10;
_DWORD *v11;
__int64 v12;
memset((INT64)(a2 + 2), 0i64);
v4.Count = SmcCacheReference(a1, (unsigned int)a2[1]).Count;
Count = v4.Count;
if( v4.Count )
{
v7 = a2[7] & 0xFFFFFFC0 | 1;
a2[7] = v7;
*((_QWORD *)a2 + 1) = *(_QWORD *)(v4.Count + 16);
a2[5] = *(_DWORD *)(v4.Count + 8);
a2[6] = *(_DWORD *)(v4.Count + 24);
a2[25] = *(_DWORD *)(v4.Count + 32);
a2[7] = v7 ^ ((unsigned __int8)v7 ^ (unsigned __int8)((unsigned __int8)*(_DWORD *)(v4.Count + 28) << 6)) & 0x40;
if( (*a2 & 0x100) != 0 || (Path = SmKmFileInfoGetPath(v4.Count + 40, a2 + 26, 0x400u), Path >= 0) )
{
a2[24] = 0;
v8 = 0;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
v10 = (INT64 *)(Count + 160);
ExAcquirePushLockSharedEx(Count + 160, 0i64);
v11 = (_DWORD *)(Count + 168);
v12 = 16i64;
do
{
if( *v11 != -1 )
{
a2[v8 + 8] = *v11;
if( (v11[1] & 3) == 0 )
a2[24] |= 1 << v8;
++v8;
}
v11 += 6;
--v12;
}
while( v12 );
if( _InterlockedCompareExchange64(v10, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(v10);
KeAbPostRelease(v10);
KeLeaveCriticalRegion();
a2[4] = v8;
Path = 0;
}
ExReleaseRundownProtection((PEX_RUNDOWN_REF)(32i64 * (a2[1] & 0xF) + a1 + 8));
}
else
{
return(unsigned int)-1073741672;
}
return(unsigned int)Path;
}Referenced by:
SmcProcessStatsRequest