MiCreateCloneChain

__int64 __fastcall MiCreateCloneChain(__int64 a1, _QWORD *a2){
  _ETHREAD *CurrentThread; 
  int v4; 
  _QWORD *v5; 
  unsigned __int64 v6; 
  __int64 v7; 
  INT64 *SharedVm; 
  KIRQL v9; 
  UINT8 v10; 
  _QWORD *v11; 
  _QWORD *i; 
  _QWORD *v13; 
  _QWORD **v14; 
  _QWORD *v15; 
  _QWORD *v16; 
  _QWORD *v17; 
  __int64 result; 
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  *a2 = 0i64;
  v4 = 0;
  v5 = 0i64;
  v6 = 0i64;
  v7 = *((_QWORD *)CurrentThread + 23);
  SharedVm = MiGetSharedVm(v7 + 1664);
  v9 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)SharedVm);
  *((_DWORD *)SharedVm + 1) = 0;
  v10 = v9;
  v11 = *(_QWORD **)(v7 + 1264);
  i = 0i64;
  while( v11 )
  {
    i = v11;
    v11 = (_QWORD *)*v11;
  }
  while( i )
  {
    if( i[6] )
    {
      LODWORD(v13) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
      if( !v13 )
      {
        v4 = -1073741670;
        break;
      }
      *v13 = v5;
      v5 = v13;
      v13[8] = i[8];
      v6 += i[8];
    }
    v14 = (_QWORD **)i[1];
    v15 = i;
    if( v14 )
    {
      v16 = *v14;
      for( i = (_QWORD *)i[1]; v16; v16 = (_QWORD *)*v16 )
        i = v16;
    }
    else
    {
      while( 1 )
      {
        i = (_QWORD *)(i[2] & 0xFFFFFFFFFFFFFFFCui64);
        if( !i || (_QWORD *)*i == v15 )
          break;
        v15 = i;
      }
    }
  }
  MiUnlockWorkingSetExclusive(v7 + 1664, v10);
  if( v4 < 0 )
    goto LABEL_22;
  if( v6 )
    v4 = PsChargeProcessNonPagedPoolQuota(a1, v6);
  if( v4 < 0 )
  {
LABEL_22:
    if( v5 )
    {
      do
      {
        v17 = (_QWORD *)*v5;
        ExFreePoolWithTag(v5, 0);
        v5 = v17;
      }
      while( v17 );
    }
    v5 = 0i64;
  }
  result = (unsigned int)v4;
  *a2 = v5;
  return result;
}

Referenced by:

MiCloneProcessAddressSpace