RtlpHpEnvAllocVA

NTSTATUS __stdcall RtlpHpEnvAllocVA(
        INT64 *a1,
        INT64 *a2,
        UINT64 a3,
        INT64 a4,
        UINT64 a5,
        INT64 a6,
        INT64 a7,
        INT64 a8,
        INT64 a9){
  INT64 v9; 
  UINT64 v10; 
  int v13; 
  int v14; 
  unsigned int v15; 
  CHAR v16; 
  int v17; 
  INT64 v19; 
  INT64 v20; 
  NTSTATUS v21; 
  NTSTATUS v22; 
  UINT64 v23[2]; 
  INT64 v24; 
  UINT64 v25; 

  v9 = *a2;
  v10 = 1i64;
  if( a3 )
    v10 = a3;
  v13 = 2;
  if( (a4 & 0x20001000) != 536875008 )
    v13 = a7;
  if( ((_DWORD)a9 + 1) & 0x2000 | a4 & 0x2000 )
  {
    v9 = v9 - ((v9 - 1) & 0x1FFFFF) + 0x1FFFFF;
    v25 = v9;
    if( v10 > 0x200000 )
      v25 = v10 + v9;
  }
  else
  {
    v25 = *a2;
  }
  if( v13 )
  {
    v14 = 512;
  }
  else
  {
    v14 = 33;
    if( (_DWORD)a6 == 1 )
      v14 = 1;
  }
  if( (a5 & 0x60) != 0 && v14 == 512 )
    LOBYTE(v14) = 0;
  v24 = *a1;
  v15 = (a9 + 1) & 0xFFFBFFFF | a4 & 0xFFEBFFFF;
  v16 = v14;
  if( !(((_DWORD)a9 + 1) & 0x40000 | a4 & 0x40000) )
    v15 = (a9 + 1) | a4 & 0xFFEFFFFF;
  if( !(((_DWORD)a9 + 1) & 0x40000 | a4 & 0x40000) )
    v16 = v14;
  v17 = MmAllocatePoolMemory(&v24, &v25, v15, (unsigned int)a5, v16);
  if( v17 >= 0 && (v15 & 0x2000) != 0 )
  {
    v23[0] = v24;
    v19 = -(__int64)v10 & (v10 + v24 - 1);
    v24 = v19;
    v20 = v19 - v23[0];
    a8 = v19 - v23[0];
    if( v19 != v23[0] )
    {
      v22 = RtlpHpEnvFreeVA(v23, (UINT64 *)&a8, 0x8000i64);
      v20 = a8;
      v17 = v22;
      v19 = v24;
    }
    v23[0] = v19 + v9;
    a8 = v25 - v20 - v9;
    if( v25 - v20 != v9 )
    {
      v21 = RtlpHpEnvFreeVA(v23, (UINT64 *)&a8, 0x8000i64);
      v19 = v24;
      v17 = v21;
    }
    *a1 = v19;
    *a2 = v9;
  }
  return v17;
}

Referenced by:

RtlCSparseBitmapStart
RtlpCSparseBitmapPageCommit
RtlpHpAllocVA
RtlpHpVaMgrAllocAligned