MmCreateProcessAddressSpace

UINT8 __stdcall MmCreateProcessAddressSpace(UINT64 MaximumWorkingSetSize, UINT64 Flags, _EPROCESS *NewProcess){
  unsigned int v3; 
  unsigned int v4; 
  UINT64 v5; 
  UINT64 v6; 
  _EPROCESS *v7; 
  _MI_PARTITION *v8; 
  UINT64 v9; 
  UINT64 v10; 
  _MMPTE *v11; 
  _KTBFLUSH_TYPE v12; 
  UINT64 TopLevelPage; 
  _MM_SESSION_SPACE *v14; 
  INT64 v15; 
  __int64 v16; 
  unsigned __int64 *v17; 
  __int64 v18; 
  unsigned __int64 v19; 
  int v20; 
  unsigned __int64 v21; 
  _KTBFLUSH_TYPE v22; 
  UINT64 VerifyFlags; 
  __int64 WorkingSetMinimumInOut[2]; 
  _MM_SESSION_SPACE *SessionGlobalJoined; 
  UINT64 WorkingSetMaximumInOut; 
  INT64 v28; 

  WorkingSetMaximumInOut = (UINT64)NewProcess;
  SessionGlobalJoined = 0i64;
  v4 = v3;
  v5 = PspMinimumWorkingSet;
  v6 = (UINT64)NewProcess;
  v7 = (_EPROCESS *)v28;
  WorkingSetMinimumInOut[0] = PspMinimumWorkingSet;
  if( MaximumWorkingSetSize )
    v8 = **(_MI_PARTITION ***)(v28 + 2520);
  else
    v8 = &Irp;
  if( !MiMakePartitionActive(v8) )
    return 0;
  MiSetProcessPartitionId((INT64)v7, v8->Core.PartitionId);
  if( !MiChargeCommit(v8, 4ui64, 0i64) )
    return 0;
  v7->Vm.Instance.NextPageColor = (unsigned __int16)RtlRandomEx((UINT64 *)&stru_140C4DB30 + 5);
  v7->SharedCommitLinks.Blink = &v7->SharedCommitLinks;
  v7->SharedCommitLinks.Flink = &v7->SharedCommitLinks;
  v7->SharedCommitLock._bf_0 = 0i64;
  if( v6 != PsGetDefaultWsMaximum() )
  {
    LODWORD(VerifyFlags) = 1;
    MiCheckWsLimits(&v7->Vm.Instance, (UINT64 *)WorkingSetMinimumInOut, &WorkingSetMaximumInOut, v4, VerifyFlags);
    v6 = WorkingSetMaximumInOut;
    v5 = WorkingSetMinimumInOut[0];
  }
  v7->Vm.Instance.MinimumWorkingSetSize = v5;
  v7->Vm.Instance.MaximumWorkingSetSize = v6;
  if( (v4 & 1) != 0 )
    v7->Vm.Instance.Flags._bf_0 |= 0x40u;
  if( PsChargeProcessQuota(v7, v9) < 0 )
  {
LABEL_24:
    MiReturnCommit(v8, 4ui64);
    return 0;
  }
  if( MiChargeResident((ULONG_PTR *)&v8->Core.PartitionId, v5, 0i64) == MiChargeFailed )
  {
LABEL_23:
    PsReturnProcessQuota(v7, v10);
    goto LABEL_24;
  }
  v11 = MiReservePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), 1ui64);
  if( !v11 )
  {
LABEL_22:
    MiReturnResident((INT64)v8, v5);
    goto LABEL_23;
  }
  if( MiAllocateProcessShadow() < 0 )
  {
LABEL_21:
    MiReleasePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), v11, 1ui64, v12);
    goto LABEL_22;
  }
  if( !MiJoinSession(&SessionGlobalJoined) )
  {
    MiDeleteProcessShadow();
    goto LABEL_21;
  }
  v7->CommitCharge = 4i64;
  TopLevelPage = MiAllocateTopLevelPage(v7, (UINT64)v11);
  v14 = SessionGlobalJoined;
  v15 = TopLevelPage;
  if( SessionGlobalJoined )
  {
    v7->Session = SessionGlobalJoined;
    _InterlockedOr((volatile signed __int32 *)&v7->1124, 0x10000u);
    v14 = SessionGlobalJoined;
  }
  MiInsertNewProcess(v7, v14);
  v16 = (__int64)(((_QWORD)v11 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
  MiCreateNewProcessTopLevelMappings(v7, (_MMPTE *)v16);
  v17 = (unsigned __int64 *)(v16 + 8 * (((unsigned __int64)MmGetPxeSelfRef() >> 3) & 0x1FF));
  LODWORD(v18) = MiMakeValidPte(0i64, v15, 2415919110i64);
  v19 = v18 & 0xFFFFFFFFFFFFFEFFui64;
  LOBYTE(v20) = MiPteInShadowRange((UINT64)v17);
  if( v20 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v19 & 1) != 0 )
    v19 |= 0x8000000000000000ui64;
  *v17 = v19;
  LODWORD(v21) = KeMakeKernelDirectoryTableBase(v15 << 12);
  v7->Pcb.DirectoryTableBase = v21;
  MiSyncSystemPdes(v7);
  MiReleasePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), v11, 1ui64, v22);
  return 1;
}

Referenced by:

PspAllocateProcess