PspInitializeProcessSecurity

NTSTATUS __stdcall PspInitializeProcessSecurity(
        _EPROCESS *ParentProcess,
        _EPROCESS *Child,
        VOID *TokenObject,
        UINT64 ExplicitToken,
        UINT64 ChildProcessPolicy,
        UINT64 IsSnapshotProcess,
        UINT64 AllApplicationPackagesPolicy,
        VOID *OriginClaimData,
        UINT64 OriginClaimDataSize,
        PSP_ALLOCATE_PROCESS_STATE *AllocateProcessState){
  __int64 v10; 
  int v12; 
  int *v13; 
  VOID *v16; 
  int SessionId; 
  int v18; 
  NTSTATUS v19; 
  int v20; 
  signed __int64 SecurityDomain; 
  UINT64 AllApplicationPackagesPolicya; 
  UINT64 OriginClaimDataSizea; 
  VOID *Object; 
  _DWORD v26[4]; 
  _EPROCESS *v27; 
  __int64 v28; 
  __int16 v29; 
  char v30; 
  INT64 v31; 
  int v32; 
  __int64 v33; 
  __int64 v34; 

  v10 = v34;
  v29 = 0;
  v30 = 0;
  Object = 0i64;
  v12 = ExplicitToken;
  *(_DWORD *)v34 = 0;
  v13 = (int *)(v10 + 4);
  *(_DWORD *)(v10 + 4) = 0;
  v16 = 0i64;
  if( ParentProcess )
  {
    v26[0] = ChildProcessPolicy;
    v26[1] = v32;
    v26[2] = IsSnapshotProcess;
    v26[3] = AllApplicationPackagesPolicy;
    v28 = v33;
    v27 = ParentProcess;
    SessionId = MmGetSessionId(Child);
    LODWORD(OriginClaimDataSizea) = (_DWORD)AllocateProcessState;
    LODWORD(AllApplicationPackagesPolicya) = (_DWORD)OriginClaimData;
    v19 = SeSubProcessToken(
            Child,
            TokenObject,
            (INT64 *)&Object,
            v18 != 0 ? 1 : 3,
            SessionId,
            (__int64)v26,
            AllApplicationPackagesPolicya,
            OriginClaimDataSize,
            OriginClaimDataSizea,
            v31,
            (__int64)&v29);
    if( v19 >= 0 )
    {
      ObInitializeFastReference(&Child->Token, Object);
      if( v12 || (_BYTE)v29 )
        *(_DWORD *)v10 = 1;
      if( HIBYTE(v29) )
      {
        *v13 = 1;
        v20 = 1;
      }
      else
      {
        v20 = *v13;
      }
      if( !v20 && v30 )
      {
        v16 = PsReferencePrimaryToken(ParentProcess);
        v19 = PspIdentityBasedJobBreakaway(v16, Object, (UINT64 *)(v10 + 4));
      }
    }
    if( *(_DWORD *)v10
      || (ParentProcess->MitigationFlags & 0x80000000) != 0
      || (Child->Flags3 & 0x800000) != 0 && !ParentProcess->SecurityDomain )
    {
      SecurityDomain = _InterlockedIncrement64(&PsNextSecurityDomain);
    }
    else
    {
      SecurityDomain = ParentProcess->SecurityDomain;
    }
    Child->SecurityDomain = SecurityDomain;
    Child->ParentSecurityDomain = SecurityDomain;
  }
  else
  {
    ObInitializeFastReference(&Child->Token, 0i64);
    SeAssignPrimaryToken(Child, TokenObject);
    v19 = 0;
  }
  if( v16 )
    ObFastDereferenceObject(&ParentProcess->Token, v16);
  return v19;
}

Referenced by:

PspAllocateProcess