MiBuildNewCloneDescriptor

_QWORD *__fastcall MiBuildNewCloneDescriptor(ULONG_PTR a1, __int64 a2, __int64 a3){
  __int64 v4; 
  unsigned __int64 v7; 
  _QWORD *v9; 
  _QWORD *v10; 
  _OWORD *v11; 
  INT64 v12; 
  __int64 *v13; 
  __int64 *v14; 
  void *v15; 
  _MI_PARTITION *VmPartition; 
  v4 = 32 * a2;
  v7 = 32 * a2 + 32;
  if( (int)PsChargeProcessNonPagedPoolQuota(a1, v7) < 0 )
    return 0i64;
  LODWORD(v9) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
  v10 = v9;
  if( !v9 )
  {
    PsReturnProcessNonPagedPoolQuota(a1, v7);
    return 0i64;
  }
  LODWORD(v11) = MiAllocatePool((struct _SLIST_ENTRY *)0x112);
  v12 = (INT64)v11;
  if( !v11 )
  {
LABEL_6:
    PsReturnProcessNonPagedPoolQuota(a1, v7);
    ExFreePoolWithTag(v10, 0);
    return 0i64;
  }
  *v11 = 0i64;
  v11[1] = 0i64;
  LODWORD(v13) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
  v14 = v13;
  v15 = (void *)v12;
  if( !v13 )
  {
LABEL_8:
    ExFreePoolWithTag(v15, 0);
    goto LABEL_6;
  }
  if( !(unsigned int)MiLockPagedRange(v12, v7) )
  {
    ExFreePoolWithTag(v14, 0);
    v15 = (void *)v12;
    goto LABEL_8;
  }
  VmPartition = MiGetVmPartition((_MMSUPPORT_INSTANCE *)(a1 + 1664));
  *v14 = a2;
  v14[1] = 1i64;
  v14[2] = v12;
  v10[6] = 0i64;
  v10[4] = v12 + v4 - 32;
  v10[3] = v12;
  v10[5] = a2;
  v10[7] = v14;
  v10[8] = v7;
  v10[12] = a3;
  _InterlockedIncrement64((volatile signed __int64 *)VmPartition + 171);
  v14[3] = (__int64)VmPartition;
  return v10;
}

Referenced by:

MiCloneProcessAddressSpace
MiCloneVads