VmpAllocateMemoryRanges

CHAR *__fastcall VmpAllocateMemoryRanges(UINT64 a1){
  CHAR *v2; 
  CHAR *PoolWithTag; 
  CHAR *v4; 
  char *v5; 
  UINT64 v6; 
  char *v7; 
  char *v8; 
  char **v9; 
  v2 = 0i64;
  PoolWithTag = (CHAR *)ExAllocatePoolWithTag(NonPagedPoolNx, 0x38ui64, 0x72566D56ui64);
  v4 = PoolWithTag;
  if( PoolWithTag )
  {
    v5 = PoolWithTag + 40;
    *(_OWORD *)PoolWithTag = 0i64;
    v6 = 0i64;
    *((_OWORD *)PoolWithTag + 1) = 0i64;
    *((_OWORD *)PoolWithTag + 2) = 0i64;
    *((_QWORD *)PoolWithTag + 6) = 0i64;
    *((_QWORD *)PoolWithTag + 2) = -1i64;
    *((_QWORD *)PoolWithTag + 6) = PoolWithTag + 40;
    *((_QWORD *)PoolWithTag + 5) = PoolWithTag + 40;
    if( a1 )
    {
      while( 1 )
      {
        v7 = (char *)ExAllocatePoolWithTag(NonPagedPoolNx, 0x40ui64, 0x72476D56ui64);
        v8 = v7;
        if( !v7 )
          break;
        memset((INT64)v7, 0i64);
        *((_QWORD *)v8 + 5) = -1i64;
        *((_QWORD *)v8 + 2) = v4;
        v9 = (char **)*((_QWORD *)v4 + 6);
        if( *v9 != v5 )
          __fastfail(3u);
        *(_QWORD *)v8 = v5;
        ++v6;
        *((_QWORD *)v8 + 1) = v9;
        *v9 = v8;
        *((_QWORD *)v4 + 6) = v8;
        if( v6 >= a1 )
          goto LABEL_6;
      }
    }
    else
    {
LABEL_6:
      v2 = v4;
      v4 = 0i64;
    }
    if( v4 )
      VmpFreeMemoryRanges(v4);
  }
  return v2;
}

Referenced by:

VmCreateMemoryRange
VmPreallocateForRangeCreate
VmpSplitMemoryRange