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