ObpVerifyCreatorAccessCheck

INT64 __fastcall ObpVerifyCreatorAccessCheck(_DWORD *a1){
  _ETHREAD *CurrentThread; 
  _DWORD *PrimaryToken; 
  UINT64 v4; 
  UINT *v5; 
  int v6; 
  int v7; 
  struct _SID_IDENTIFIER_AUTHORITY IdentifierAuthority; 
  PVOID TokenInformation; 
  struct _SECURITY_SUBJECT_CONTEXT SubjectContext; 
  PVOID P[2]; 
  __int64 v13; 
  char Sid[80]; 
  *(_DWORD *)IdentifierAuthority.Value = 0;
  *(_WORD *)&IdentifierAuthority.Value[4] = 4096;
  memset((INT64)Sid, 0i64);
  TokenInformation = 0i64;
  memset(&SubjectContext, 0, sizeof(SubjectContext));
  v13 = 0i64;
  *(_OWORD *)P = 0i64;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  SeCaptureSubjectContextEx(CurrentThread, *((_EPROCESS **)CurrentThread + 23), &SubjectContext);
  PrimaryToken = SubjectContext.PrimaryToken;
  if( SubjectContext.ClientToken )
    PrimaryToken = SubjectContext.ClientToken;
  if( PrimaryToken[48] == 2 && (int)PrimaryToken[49] < 2 )
    goto LABEL_14;
  SeQueryInformationToken(PrimaryToken, TokenIsAppContainer, &TokenInformation);
  if( !(_DWORD)TokenInformation
    || (LODWORD(v13) = SeQueryInformationToken(PrimaryToken, TokenAppContainerSid, P), (int)v13 >= 0) )
  {
    SeQueryInformationToken(PrimaryToken, TokenIntegrityLevel, (PVOID *)((char *)&TokenInformation + 4));
    LOBYTE(v4) = 1;
    RtlInitializeSid(Sid, &IdentifierAuthority, v4);
    v5 = RtlSubAuthoritySid(Sid, 0i64);
    *v5 = HIDWORD(TokenInformation);
    P[1] = Sid;
    SeLockSubjectContext(&SubjectContext);
    v6 = RtlEnumerateBoundaryDescriptorEntries(
           a1,
           (unsigned int(__fastcall *)(_DWORD *, __int64))ObpVerifyAccessToBoundaryEntry,
           (__int64)&SubjectContext);
    SeUnlockSubjectContext(&SubjectContext);
    v7 = v13;
    if( (int)v13 >= 0 )
    {
      if( v6 < 0 )
        v7 = v6;
      LODWORD(v13) = v7;
      if( v7 >= 0 && P[0] && (v13 & 0x100000000i64) == 0 )
LABEL_14:
        LODWORD(v13) = -1073741790;
    }
  }
  SeReleaseSubjectContext(&SubjectContext);
  if( P[0] )
    ExFreePoolWithTag(P[0], 0);
  return(unsigned int)v13;
}

Referenced by:

NtCreatePrivateNamespace
NtDeletePrivateNamespace