SepValidOwnerSubjectContext

UINT8 __stdcall SepValidOwnerSubjectContext(_SECURITY_SUBJECT_CONTEXT *SubjectContext, VOID *Owner, UINT8 ServerObject){
  bool v3; 
  void *PrimaryToken; 
  _ETHREAD *CurrentThread; 
  unsigned int v8; 
  unsigned int v9; 
  __int64 v10; 
  _KPROCESSOR_MODE v11; 

  v3 = 0;
  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;
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquireResourceSharedLite(*((_QWORD *)PrimaryToken + 6), 1);
  v9 = *((_DWORD *)PrimaryToken + 31);
  if( v9 )
  {
    v10 = *((_QWORD *)PrimaryToken + 19);
    while( !RtlEqualSid(Owner, *(PVOID *)(v10 + 16i64 * v8)) )
    {
      if( ++v8 >= v9 )
        goto LABEL_10;
    }
    v3 = SepIdAssignableAsOwner((_TOKEN *)PrimaryToken, v8) != 0;
  }
LABEL_10:
  ExReleaseResourceLite(*((PERESOURCE *)PrimaryToken + 6));
  KeLeaveCriticalRegion();
  if( !v3 )
  {
    LOBYTE(v11) = 1;
    return SeSinglePrivilegeCheckEx(SeRestorePrivilege, SubjectContext, v11);
  }
  return v3;
}

Referenced by:

RtlpNewSecurityObject
RtlpSetSecurityObject