PspSetupUserProcessAddressSpace

NTSTATUS __stdcall PspSetupUserProcessAddressSpace(
        _EPROCESS *ParentProcess,
        _EPROCESS *TargetProcess,
        _KAPC_STATE *ApcState,
        PSP_CREATE_PROCESS_CONTEXT *CreateContext){
  VOID **v5; 
  unsigned int *v8; 
  int v10; 
  int v11; 
  unsigned int v12; 
  int v13; 
  _EJOB *v14; 
  int inited; 
  UINT64 v16; 
  PSP_CREATE_PROCESS_CONTEXT *v17; 
  INT64 v18; 
  int v19; 
  NTSTATUS result; 
  unsigned int ProcessNtdllType; 
  UINT64 AllocationType; 
  INT64 AllocationTypea; 
  UINT64 Protect; 
  INT64 Protecta; 
  UINT64 RegionSize; 
  INT64 CurrentThread; 
  VOID *StandardHandleList[2]; 
  __int64 v29; 

  RegionSize = 0i64;
  v5 = 0i64;
  v29 = 0i64;
  v8 = (unsigned int *)*((_QWORD *)CreateContext + 26);
  v10 = (*((unsigned __int8 *)CreateContext + 9) >> 2) & 3;
  CurrentThread = (INT64)KeGetCurrentThread();
  *(_OWORD *)StandardHandleList = 0i64;
  v11 = v10 - 1;
  if( v11 )
  {
    if( v11 == 1 )
      v5 = (VOID **)(v8 + 8);
  }
  else if( CreateContext[20] == CreateContext[72] )
  {
    v5 = StandardHandleList;
    result = PspGetStandardHandleList(ParentProcess, StandardHandleList);
    if( result < 0 )
      return result;
  }
  v12 = v8[2];
  v13 = v12 & 0x60;
  if( (PspGlobalFlags & 1) != 0 )
  {
    v12 |= 0x8000u;
    v8[2] = v12;
  }
  if( !v8[259] )
    v8[259] = PsDefaultLoaderThreads;
  LODWORD(v14) = PsGetProcessServerSilo((INT64)TargetProcess);
  if( PsGetServerSiloGlobals(v14)->OneCoreForwardersEnabled )
    v8[2] = v12 | 0x20000000;
  KiStackAttachProcess(TargetProcess, 0i64, ApcState);
  if( (CreateContext[2] & 0x10) == 0 || (inited = PspLocateInPEManifest(TargetProcess, CreateContext), inited >= 0) )
  {
    v16 = *v8 + *((_QWORD *)v8 + 126);
    RegionSize = v16;
    if( !v13 )
    {
      if( v16 < 0x20000 )
        v16 = 0x20000i64;
      RegionSize = v16;
    }
    LODWORD(Protect) = 4;
    *((_QWORD *)CreateContext + 27) = 0i64;
    LODWORD(AllocationType) = 12288;
    inited = ZwAllocateVirtualMemory(
               (VOID *)0xFFFFFFFFFFFFFFFFi64,
               (VOID **)CreateContext + 27,
               0i64,
               &RegionSize,
               AllocationType,
               Protect);
    if( inited >= 0 )
    {
      inited = PspCopyAndFixupParameters(ParentProcess, v5, CreateContext);
      if( inited >= 0 )
      {
        if( (*(_BYTE *)&KeGetCurrentThread()->ApcState.Process->Pcb.SecureState & 1) == 0 )
          inited = PspPrepareSystemDllInitBlock(0i64);
        if( inited >= 0 )
        {
          inited = PspWow64SetupUserProcessAddressSpace(
                     TargetProcess,
                     (_EPROCESS *)CreateContext,
                     v17,
                     v18,
                     AllocationTypea,
                     Protecta,
                     RegionSize,
                     CurrentThread);
          if( inited >= 0 )
          {
            if( TargetProcess->WoW64Process )
            {
              ProcessNtdllType = PsWow64GetProcessNtdllType((INT64)TargetProcess);
              inited = PspPrepareSystemDllInitBlock((PSP_CREATE_PROCESS_CONTEXT *)ProcessNtdllType);
            }
            if( inited >= 0 )
            {
              PspWritePebAffinityInfo((_ETHREAD *)CurrentThread, (_EX_RUNDOWN_REF *)TargetProcess);
              MmMapApiSetView(TargetProcess);
              inited = v19;
              if( v19 >= 0 )
                inited = PspMapSiloSharedDataView(TargetProcess);
            }
          }
        }
      }
    }
  }
  KiUnstackDetachProcess(ApcState, 0i64);
  return inited;
}

Referenced by:

PspAllocateProcess