MiCountSystemPool
UINT64 __fastcall MiCountSystemPool(INT64 a1, UINT64 a2, INT64 a3){
int v4;
volatile signed __int64 *v5;
UINT64 v6;
UINT64 result;
__int64 v8;
unsigned __int64 v9;
v4 = a1;
switch( (_DWORD)a1 )
{
case 5:
v5 = &qword_140C4C608;
break;
case 6:
v5 = &qword_140C4EC68;
break;
case 1:
result = -(__int64)a2;
v8 = *(_QWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 1368i64);
v9 = a2;
if( (_DWORD)a3 != 1 )
v9 = -(__int64)a2;
v5 = (volatile signed __int64 *)(v8 + 184);
_InterlockedExchangeAdd64((volatile signed __int64 *)(v8 + 48), v9);
break;
default:
result = 0i64;
v5 = &qword_140C4C610;
if( (_DWORD)a1 != 15 )
v5 = 0i64;
break;
}
if( (_DWORD)a3 == 1 )
{
v6 = a2 + _InterlockedExchangeAdd64(v5, a2);
if( v4 == 5 )
{
result = (*(_QWORD *)MiState - v6) & -(__int64)(v6 < *(_QWORD *)MiState);
if( result < 0x300 )
return MiFreeExcessSegments(*(_QWORD *)MiState - v6);
}
}
else
{
_InterlockedExchangeAdd64(v5, -(__int64)a2);
}
return result;
}Referenced by:
MiCommitPoolMemory
MmFreePoolMemory
MmFreeSecurePoolMemory