MiCloneProcessAddressSpace

NTSTATUS __stdcall MiCloneProcessAddressSpace(
        ULONG_PTR ProcessToClone,
        ULONG_PTR ProcessToInitialize,
        UINT64 CloneFlags){
  char v3; 
  _EPROCESS *v4; 
  _EPROCESS *v5; 
  int v6; 
  _MMCLONE_DESCRIPTOR *v7; 
  _EPROCESS *Process; 
  int v10; 
  int CloneChain; 
  UINT64 v12; 
  _QWORD *v13; 
  _QWORD *v14; 
  _MMCLONE_DESCRIPTOR *v15; 
  unsigned __int64 NumberOfPtes; 
  volatile unsigned __int64 v17; 
  unsigned int v18; 
  __int64 v19; 
  UINT64 CloneFlagsa; 
  PVOID P; 
  UINT64 v22; 
  UINT64 LargePageVads; 
  UINT64 NumberOfVads; 
  _MMWSL_INSTANCE *VmWorkingSetList; 
  _EPROCESS *v26; 
  _KAPC_STATE ApcState; 

  LODWORD(v22) = CloneFlags;
  LargePageVads = 0i64;
  memset(&ApcState, 0, sizeof(ApcState));
  v3 = CloneFlags;
  v4 = *(_EPROCESS **)&ProcessToInitialize;
  v5 = *(_EPROCESS **)&ProcessToClone;
  v6 = 0;
  P = 0i64;
  v7 = 0i64;
  Process = KeGetCurrentThread()->ApcState.Process;
  v26 = Process;
  if( MiIsStoreProcess(*(_EPROCESS **)&ProcessToClone) )
    return -1073741637;
  MiLockDownWorkingSet((ULONG_PTR)v4, 1ui64);
  if( Process != v5 )
  {
    v6 = 1;
    KiStackAttachProcess(v5, 0i64, &ApcState);
  }
  v10 = v3 & 1;
  VmWorkingSetList = v5->Vm.Instance.VmWorkingSetList;
  if( !VmWorkingSetList[9].NextPteToTrim || v10 )
  {
    LODWORD(v12) = MiLockVadRange(v5, (VOID *)0xFFFFFFFFFFFFFFFFi64, (VOID *)0xFFFFFFFFFFFFFFFFi64);
    NumberOfVads = v12;
    if( v12 )
    {
      CloneChain = MiCreateCloneChain(v4, (_MMCLONE_DESCRIPTOR **)&P);
      if( CloneChain < 0 )
        goto LABEL_10;
      CloneChain = MiAllocateChildVads((ULONG_PTR)v4, &LargePageVads);
      if( CloneChain < 0 )
        goto LABEL_10;
      if( v10 )
      {
        v15 = MiBuildNewCloneDescriptor((ULONG_PTR)v4, 2ui64, (UINT64)VmWorkingSetList[9].NextPteToTrim);
        v7 = v15;
        if( !v15 )
        {
          CloneChain = -1073741670;
          goto LABEL_10;
        }
        memset(v15->StartingCloneBlock, 0i64, 32 * v15->NumberOfPtes);
        v7->StartingCloneBlock->CloneCommitCount = v7->StartingCloneBlock->CloneCommitCount & 0x7FFFFFFFFFFFFFFi64 | 0x2000000000000000i64;
        v7->StartingCloneBlock[1].CloneCommitCount = v7->StartingCloneBlock[1].CloneCommitCount & 0x7FFFFFFFFFFFFFFi64 | 0x800000000000000i64;
      }
      LODWORD(CloneFlagsa) = v22;
      CloneChain = MiCloneVads(v5, v4, (_MMCLONE_DESCRIPTOR *)P, v7, CloneFlagsa);
      if( CloneChain >= 0 )
      {
        P = 0i64;
        CloneChain = MiMapChildLargePageVads((ULONG_PTR)v4, LargePageVads);
        MiUnlockVadRange(v5, (VOID *)0xFFFFFFFFFFFFFFFFi64, NumberOfVads);
        if( v6 )
        {
          KiUnstackDetachProcess(&ApcState, 0i64);
          v6 = 0;
        }
        if( v26 != v4 )
        {
          v6 = 1;
          KiStackAttachProcess(v4, 0i64, &ApcState);
        }
        MiCreateForkWsles();
        if( v7 )
        {
          NumberOfPtes = v7->NumberOfPtes;
          v17 = 0i64;
          v18 = 0;
          if( !NumberOfPtes )
            goto LABEL_36;
          v19 = 0i64;
          do
          {
            ++v18;
            v17 += v7->StartingCloneBlock[v19].CloneRefCount;
            v19 = v18;
          }
          while( v18 < NumberOfPtes );
          if( v17 )
          {
            v7->NumberOfReferences = v17;
            MiInsertClone(v4, v7);
          }
          else
          {
LABEL_36:
            MiFreeCloneDescriptor((ULONG_PTR)v4, (ULONG_PTR)v7);
          }
          v7 = 0i64;
        }
        if( CloneChain >= 0 )
        {
          MiLockDownWorkingSet((ULONG_PTR)v4, 0i64);
          if( v6 )
            KiUnstackDetachProcess(&ApcState, 0i64);
          return CloneChain;
        }
        goto LABEL_11;
      }
    }
    else
    {
      CloneChain = -1073741558;
    }
LABEL_10:
    MiUnlockVadRange(v5, (VOID *)0xFFFFFFFFFFFFFFFFi64, NumberOfVads);
LABEL_11:
    v13 = P;
    if( P )
    {
      do
      {
        v14 = (_QWORD *)*v13;
        PsReturnProcessNonPagedPoolQuota(v4, v13[8]);
        ExFreePoolWithTag(v13, 0);
        v13 = v14;
      }
      while( v14 );
    }
    if( v7 )
      MiFreeCloneDescriptor((ULONG_PTR)v4, (ULONG_PTR)v7);
    goto LABEL_15;
  }
  CloneChain = -1073741637;
LABEL_15:
  if( v6 )
    KiUnstackDetachProcess(&ApcState, 0i64);
  MiLockDownWorkingSet((ULONG_PTR)v4, 0i64);
  MiDeleteInsertedCloneVads(v4);
  return CloneChain;
}

Referenced by:

MmInitializeProcessAddressSpace