SepValidOwnerSubjectContext

UINT8 __stdcall SepValidOwnerSubjectContext(SECURITY_SUBJECT_CONTEXT *SubjectContext, PVOID Owner, UINT8 ServerObject){
  UINT8 v3; 
  PVOID v4; 
  void *PrimaryToken; 
  _ETHREAD *CurrentThread; 
  unsigned int v8; 
  unsigned int v9; 
  __int64 v10; 
  v3 = 0;
  v4 = Owner;
  if( !Owner )
    return 0;
  if( ServerObject || (PrimaryToken = SubjectContext->ClientToken) == 0i64 )
    PrimaryToken = SubjectContext->PrimaryToken;
  if( *((_DWORD *)PrimaryToken + 48) == 2 && *((int *)PrimaryToken + 49) < 2 )
    return 0;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v8 = 0;
  --*((_WORD *)CurrentThread + 242);
  LOBYTE(Owner) = 1;
  ExAcquireResourceSharedLite(*((PERESOURCE *)PrimaryToken + 6), (BOOL)Owner);
  v9 = *((_DWORD *)PrimaryToken + 31);
  if( v9 )
  {
    v10 = *((_QWORD *)PrimaryToken + 19);
    while( !RtlEqualSid(v4, *(PVOID *)(v10 + 16i64 * v8)) )
    {
      if( ++v8 >= v9 )
        goto LABEL_10;
    }
    v3 = SepIdAssignableAsOwner((INT64)PrimaryToken, v8);
  }
LABEL_10:
  ExReleaseResourceLite(*((PERESOURCE *)PrimaryToken + 6));
  KeLeaveCriticalRegion();
  if( !v3 )
    return SeSinglePrivilegeCheckEx(*(_QWORD *)&SeRestorePrivilege, SubjectContext, 1);
  return v3;
}

Referenced by:

RtlpNewSecurityObject
RtlpSetSecurityObject