MiCountSystemPool
NTSTATUS __stdcall MiCountSystemPool(INT64 a1, UINT64 a2, INT64 a3){
int v4;
volatile signed __int64 *v5;
UINT64 v6;
unsigned __int64 v7;
_MM_SESSION_SPACE *Session;
unsigned __int64 v9;
v4 = a1;
switch( (_DWORD)a1 )
{
case 5:
v5 = &qword_140C4C608;
break;
case 6:
v5 = (volatile signed __int64 *)((char *)&stru_140C4DB30 + 4408);
break;
case 1:
v7 = -(__int64)a2;
Session = KeGetCurrentThread()->ApcState.Process->Session;
v9 = a2;
if( (_DWORD)a3 != 1 )
v9 = -(__int64)a2;
v5 = (volatile signed __int64 *)((char *)Session + 184);
_InterlockedExchangeAdd64((volatile signed __int64 *)Session + 6, v9);
break;
default:
LODWORD(v7) = 0;
v5 = (volatile signed __int64 *)&unk_140C4C610;
if( (_DWORD)a1 != 15 )
v5 = 0i64;
break;
}
if( (_DWORD)a3 == 1 )
{
v6 = a2 + _InterlockedExchangeAdd64(v5, a2);
if( v4 == 5 )
{
v7 = (MiState[0] - v6) & -(__int64)(v6 < MiState[0]);
if( v7 < 0x300 )
LODWORD(v7) = MiFreeExcessSegments(MiState[0] - v6);
}
}
else
{
_InterlockedExchangeAdd64(v5, -(__int64)a2);
}
return v7;
}Referenced by:
MiCommitPoolMemory
MmFreePoolMemory
MmFreeSecurePoolMemory