MmAllocatePoolMemory

NTSTATUS __stdcall MmAllocatePoolMemory(INT64 *a1, UINT64 *a2, INT64 a3, UINT64 a4, CHAR a5){
  int v6; 
  unsigned int v8; 
  unsigned int v9; 
  unsigned int v10; 
  int v11; 
  CHAR v12; 
  int v14; 
  VOID *v15; 
  UINT64 v16; 
  INT64 v17[10]; 
  unsigned int v18; 

  v18 = a4;
  v6 = a3;
  memset(v17, 0i64, sizeof(v17));
  v8 = v6 & 0x7F;
  if( (v6 & 0x7F) == 0 || v8 > (unsigned __int16)KeNumberNodes )
    return -1073741583;
  v9 = v8 - 1;
  v10 = v6 & 0xFFFFFF80;
  if( (v10 & 0x2000) != 0 )
  {
    *a1 = 0i64;
    if( (a5 & 1) != 0 )
      v14 = (a5 & 0x20) != 0 ? 1 : 6;
    else
      v14 = 5;
    v15 = MiReservePoolMemory(0i64, v14, *a2, v9);
    if( !v15 )
      return -1073741801;
    *a1 = (INT64)v15;
  }
  v11 = 0;
  if( (v10 & 0x1000) != 0 )
  {
    v12 = a5 & 0xDF;
    if( (a5 & 1) != 0 )
      v12 = a5;
    LODWORD(v16) = v9;
    v11 = MiInitializePoolCommitPacket(a1, a2, v10, v18, v12, v16, 0i64, (INT64)v17);
    if( v11 < 0 || (v11 = MiCommitPoolMemory((INT64)v17), v11 < 0) )
    {
      if( (v10 & 0x2000) != 0 )
        MmFreePoolMemory((UINT64 *)a1, a2);
      *a1 = 0i64;
    }
    *a2 = (*a2 + 4095) & 0xFFFFFFFFFFFFF000ui64;
  }
  return v11;
}

Referenced by:

RtlpHpEnvAllocVA