PspCombineSecurityDomains

NTSTATUS __stdcall PspCombineSecurityDomains(PVOID Object, PVOID a2){
  __int64 v4; 
  __int64 v5; 
  int v6; 
  NTSTATUS v7; 
  signed __int64 v9; 
  int v10[8]; 
  _GENERIC_MAPPING *GenericMapping; 
  VOID *v12; 
  VOID *Handle; 
  _SECURITY_SUBJECT_CONTEXT v14[5]; 
  _AUX_ACCESS_DATA AuxData; 

  memset(v14, 0i64, sizeof(v14));
  memset(&AuxData, 0i64, sizeof(AuxData));
  if( (*((_DWORD *)Object + 543) & 0x400000) == 0 || (*((_DWORD *)a2 + 543) & 0x400000) == 0 )
    return -1073741700;
  _InterlockedOr(v10, 0);
  v4 = *((_QWORD *)Object + 316);
  v5 = *((_QWORD *)a2 + 316);
  if( v4 == v5 )
    return 0;
  if( !v4 || !v5 || *((int *)Object + 628) < 0 || *((int *)a2 + 628) < 0 )
    return -1073740699;
  Handle = 0i64;
  v12 = 0i64;
  v6 = SeCreateAccessStateEx(
         0i64,
         (_KPROCESS *)a2,
         (_ACCESS_STATE *)v14,
         &AuxData,
         40,
         (_GENERIC_MAPPING *)((char *)PsProcessType + 76));
  if( v6 >= 0 )
  {
    LOBYTE(GenericMapping) = 0;
    v7 = ObOpenObjectByPointer(
           Object,
           0x600ui64,
           (PACCESS_STATE)v14,
           0,
           (POBJECT_TYPE)PsProcessType,
           (_KPROCESSOR_MODE)GenericMapping,
           &Handle);
    v6 = v7;
    if( v7 >= 0 )
    {
      SepDeleteAccessState((_ACCESS_STATE *)v14);
      SeReleaseSubjectContext(&v14[1]);
      v6 = SeCreateAccessStateEx(
             0i64,
             (_KPROCESS *)Object,
             (_ACCESS_STATE *)v14,
             &AuxData,
             40,
             (_GENERIC_MAPPING *)((char *)PsProcessType + 76));
      if( v6 < 0 )
        goto LABEL_14;
      LOBYTE(GenericMapping) = 0;
      v7 = ObOpenObjectByPointer(
             a2,
             0x600ui64,
             (PACCESS_STATE)v14,
             0,
             (POBJECT_TYPE)PsProcessType,
             (_KPROCESSOR_MODE)GenericMapping,
             &v12);
      v6 = v7;
      if( v7 >= 0 )
      {
        _InterlockedOr((volatile signed __int32 *)Object + 543, 0x200000u);
        *((_QWORD *)Object + 316) = *((_QWORD *)a2 + 316);
        if( (*((_DWORD *)Object + 628) | *((_DWORD *)a2 + 628)) < 0 )
        {
          v9 = _InterlockedIncrement64(&PsNextSecurityDomain);
          v6 = -1073740699;
          *((_QWORD *)Object + 316) = v9;
          *((_QWORD *)Object + 317) = v9;
        }
        KeSynchronizeSecurityDomain((_EPROCESS *)Object);
        goto LABEL_13;
      }
      v12 = 0i64;
    }
    else
    {
      Handle = 0i64;
    }
    if( v7 == -1073741790 )
      v6 = -1073740699;
LABEL_13:
    SepDeleteAccessState((_ACCESS_STATE *)v14);
    SeReleaseSubjectContext(&v14[1]);
  }
LABEL_14:
  if( v12 )
    ObCloseHandle(v12, 0);
  if( Handle )
    ObCloseHandle(Handle, 0);
  return v6;
}

Referenced by:

NtSetInformationProcess