MmInitializeProcessAddressSpace

VOID __fastcall MmInitializeProcessAddressSpace(
        _EPROCESS *ProcessToInitialize,
        _EPROCESS *ProcessToClone,
        VOID *SectionToMap,
        UINT64 *CreateFlags,
        UINT64 CloneFlags){
  char *Pool; 
  _MMWSL_INSTANCE *v10; 
  _MMSUPPORT_FULL *p_Vm; 
  _MMWSL_INSTANCE *v12; 
  VOID **v13; 
  INT64 v14; 
  VOID *v15; 
  _MMWSL_INSTANCE *VmWorkingSetList; 
  __int64 v17; 
  __int64 v18; 
  __int128 v19; 
  __int64 NextPteToTrim; 
  __int128 v21; 
  VOID **v22; 
  __int128 v23; 
  __int128 v24; 
  __int64 v25; 
  __int128 v26; 
  __int128 v27; 
  void *Peb; 
  _EWOW64PROCESS *WoW64Process; 
  NTSTATUS v30; 
  __int64 v31; 
  _MMWSL_INSTANCE *v32; 
  _ETHREAD *CurrentThread; 
  VOID **NoAccessVa; 
  _MMVAD_SHORT *VadList; 
  __int64 v36; 
  __int64 v37; 
  VOID *v38[8]; 
  _KAPC_STATE ApcState; 
  char Src[224]; 

  memset(&ApcState, 0, sizeof(ApcState));
  memset(Src, 0i64, 0xD8u);
  Pool = (char *)MiAllocatePool(64i64, 0x270ui64, 0x3250694Dui64);
  v10 = (_MMWSL_INSTANCE *)Pool;
  if( Pool )
  {
    ExInitializeAutoExpandPushLock((_EX_PUSH_LOCK_AUTO_EXPAND *)(Pool + 408), 1ui64);
    if( ProcessToClone )
    {
      VmWorkingSetList = ProcessToClone->Vm.Instance.VmWorkingSetList;
      memmove(Src, &VmWorkingSetList[1].NextPteToAge, 0xD8u);
      v17 = *(_QWORD *)&VmWorkingSetList[6].LastAccessClearingRemainder;
      v18 = 2i64;
      v19 = *(_OWORD *)&VmWorkingSetList[11].NextPteToAccessClear;
      NextPteToTrim = (__int64)VmWorkingSetList[9].NextPteToTrim;
      *(_OWORD *)v38 = *(_OWORD *)&VmWorkingSetList[11].NextPteToTrim;
      v21 = *(_OWORD *)&VmWorkingSetList[11].LockedEntries;
      v36 = v17;
      v22 = &v38[2];
      *(_OWORD *)&v38[2] = v19;
      v23 = *(_OWORD *)&VmWorkingSetList[12].NextPteToAge;
      v37 = NextPteToTrim;
      *(_OWORD *)&v38[4] = v21;
      *(_OWORD *)&v38[6] = v23;
      do
      {
        *v22 = 0i64;
        v22 += 4;
        --v18;
      }
      while( v18 );
    }
    else
    {
      v36 = 0i64;
      v37 = 0i64;
      memset(v38, 0i64, sizeof(v38));
    }
    KiStackAttachProcess(ProcessToInitialize, 0i64, &ApcState);
    ProcessToInitialize->AddressCreationLock._bf_0 = 0i64;
    ProcessToInitialize->PageTableCommitmentLock._bf_0 = 0i64;
    ProcessToInitialize->VadRoot.Root = 0i64;
    if( (MmTrackLockedPages & 1) != 0 && (MmTrackLockedPages & 0x10000000) == 0 )
      MiInitializeLockedPagesTracking(ProcessToInitialize);
    p_Vm = &ProcessToInitialize->Vm;
    NoAccessVa = 0i64;
    MiInitializeWorkingSetList(&ProcessToInitialize->Vm.Instance, v10, 0i64, 0i64);
    v12 = ProcessToInitialize->Vm.Instance.VmWorkingSetList;
    LODWORD(v12[7].NextPteToTrim) = 1;
    MiInitializeProcessPageTableCommitmentBitMaps((INT64)ProcessToInitialize);
    _InterlockedOr((volatile signed __int32 *)&ProcessToInitialize->1124, 0x400u);
    VadList = 0i64;
    if( MiComputeProcessUserVa(
           (ULONG_PTR)ProcessToInitialize,
           ProcessToClone,
           (_SECTION *)SectionToMap,
           &VadList,
           NoAccessVa) < 0 )
      goto LABEL_25;
    if( !ProcessToClone && (ProcessToInitialize->Flags3 & 1) == 0 )
    {
      MiAllocateProcessVads();
      NoAccessVa = v13;
      if( !v13 )
        goto LABEL_25;
    }
    InitializeSListHead((PSLIST_HEADER)&v12[9].NextPteToAge);
    if( !ProcessToClone )
    {
      MiInitializeProcessBottomUpEntropy(ProcessToInitialize);
      MiInitializeProcessTopDownEntropy(ProcessToInitialize, (_SECTION *)SectionToMap, v14);
      if( MiInitializeVadBitMap(0i64) < 0 )
        goto LABEL_25;
    }
    if( MiInsertProcessVads(ProcessToInitialize, (_MMVAD_SHORT **)&NoAccessVa) < 0 )
      goto LABEL_25;
    if( SectionToMap )
    {
      MiMapProcessExecutable(ProcessToInitialize, (_SECTION *)SectionToMap, CreateFlags, v15);
LABEL_14:
      MiAllowWorkingSetExpansion(&ProcessToInitialize->Vm.Instance);
LABEL_18:
      KiUnstackDetachProcess(&ApcState, 0i64);
      return;
    }
    if( (ProcessToInitialize->Flags3 & 1) != 0 && !ProcessToClone )
      goto LABEL_14;
    *(_DWORD *)CreateFlags &= ~0x10u;
    if( !ProcessToClone )
      goto LABEL_18;
    if( (*(_BYTE *)&ProcessToClone->Pcb.SecureState & 1) != 0 )
      goto LABEL_25;
    *(_QWORD *)ProcessToInitialize->ImageFileName = *(_QWORD *)ProcessToClone->ImageFileName;
    *(_DWORD *)&ProcessToInitialize->ImageFileName[8] = *(_DWORD *)&ProcessToClone->ImageFileName[8];
    *(_WORD *)&ProcessToInitialize->ImageFileName[12] = *(_WORD *)&ProcessToClone->ImageFileName[12];
    ProcessToInitialize->ImageFileName[14] = ProcessToClone->ImageFileName[14];
    ProcessToInitialize->HighestUserAddress = ProcessToClone->HighestUserAddress;
    memmove(&v12[1].NextPteToAge, Src, 0xD8u);
    v24 = *(_OWORD *)&v38[2];
    v25 = v36;
    *(_OWORD *)&v12[11].NextPteToTrim = *(_OWORD *)v38;
    *(_QWORD *)&v12[6].LastAccessClearingRemainder = v25;
    v26 = *(_OWORD *)&v38[4];
    *(_OWORD *)&v12[11].NextPteToAccessClear = v24;
    v27 = *(_OWORD *)&v38[6];
    *(_OWORD *)&v12[11].LockedEntries = v26;
    *(_OWORD *)&v12[12].NextPteToAge = v27;
    if( MiInitializeVadBitMap(1ui64) < 0 )
    {
LABEL_25:
      MiReturnProcessVads((_MMVAD_SHORT *)NoAccessVa);
      goto LABEL_18;
    }
    WoW64Process = ProcessToClone->WoW64Process;
    if( WoW64Process )
    {
      Peb = WoW64Process->Peb;
      if( WoW64Process->Peb )
        ProcessToInitialize->WoW64Process->Peb = Peb;
    }
    if( (*(_DWORD *)CreateFlags & 0x80u) == 0 )
      v30 = 0;
    else
      v30 = MiSessionCreate((UINT64 *)Peb);
    v31 = 2i64;
    v12[9].NextPteToTrim = (_MMPTE *)((v37 + 1) & -(__int64)((CloneFlags & 1) != 0));
    v32 = v12 + 8;
    do
    {
      v32->NextPteToAge = (_MMPTE *)v32;
      v32->NextPteToTrim = (_MMPTE *)v32;
      v32 = (_MMWSL_INSTANCE *)((char *)v32 + 16);
      --v31;
    }
    while( v31 );
    KiUnstackDetachProcess(&ApcState, 0i64);
    if( v30 >= 0
      && MiCloneProcessAddressSpace((ULONG_PTR)ProcessToClone, (ULONG_PTR)ProcessToInitialize, (unsigned int)CloneFlags) >= 0 )
    {
      KiStackAttachProcess(ProcessToInitialize, 0i64, &ApcState);
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      if( v38[5] )
        MiReferenceCfgVad(CurrentThread, v38[4], CfgBitMapWow64);
      if( v38[1] )
        MiReferenceCfgVad(CurrentThread, v38[0], CfgBitMapNative);
      KiUnstackDetachProcess(&ApcState, 0i64);
    }
    MiAllowWorkingSetExpansion(&p_Vm->Instance);
  }
}

Referenced by:

PspAllocateProcess