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