SepCheckCapabilities

NTSTATUS __stdcall SepCheckCapabilities(
        VOID *Token,
        UINT64 CapabilityCount,
        _SID_AND_ATTRIBUTES *Capabilities,
        UINT8 *Match,
        UINT8 *Matcha){
  unsigned int v5; 
  char v7; 
  int InformationToken; 
  UINT8 v10; 
  PVOID *v11; 
  char IsLpacCapabilitySid; 
  unsigned int v14; 
  void *Sid; 
  UINT8 v16; 
  _DWORD *v17; 
  INT64 v18; 
  _BYTE *v19; 
  const VOID *v20; 
  const VOID *v21; 
  const VOID *v22; 
  VOID *TokenInformation; 
  unsigned int i; 
  PVOID *v25; 
  PVOID P; 
  PVOID v27; 
  void *j; 
  unsigned int v29; 
  char v30; 

  v29 = CapabilityCount;
  v5 = 0;
  P = 0i64;
  v7 = 1;
  v27 = 0i64;
  v30 = 1;
  TokenInformation = 0i64;
  *Matcha = 0;
  InformationToken = SeQueryInformationToken(Token, TokenIsAppContainer, &TokenInformation);
  if( InformationToken >= 0 )
  {
    if( (_DWORD)TokenInformation )
    {
      InformationToken = SeQueryInformationToken(Token, TokenCapabilities, &P);
      if( InformationToken >= 0 )
      {
        InformationToken = SeQueryInformationToken(
                             Token,
                             MaxTokenInfoClass|TokenGroups,
                             (VOID **)((char *)&TokenInformation + 4));
        if( InformationToken >= 0 )
        {
          v10 = 1;
          v11 = (PVOID *)P;
          v25 = (PVOID *)P;
          for( i = 0; i < v29; ++i )
          {
            v10 = 0;
            if( HIDWORD(TokenInformation)
              || (IsLpacCapabilitySid = SepIsLpacCapabilitySid(Capabilities->Sid), v11 = v25, !IsLpacCapabilitySid) )
            {
              v14 = *(_DWORD *)P;
              if( *(_DWORD *)P )
              {
                Sid = Capabilities->Sid;
                for( j = Capabilities->Sid; ; Sid = j )
                {
                  v16 = RtlEqualSid(v11[2 * v5 + 1], Sid);
                  v11 = v25;
                  if( v16 && LODWORD(v25[2 * v5 + 2]) == Capabilities->Attributes )
                  {
                    v7 = v30;
                    v10 = 1;
                    v5 = 0;
                    goto LABEL_9;
                  }
                  if( ++v5 >= v14 )
                    break;
                }
                v7 = v30;
              }
              if( *((_BYTE *)Capabilities->Sid + 1) != 9 )
                break;
              LODWORD(v17) = RtlSubAuthoritySid((INT64)Capabilities->Sid, 0i64);
              if( *v17 != 3 )
                break;
              v5 = 0;
              if( !v27 )
              {
                InformationToken = SeQueryInformationToken(Token, TokenAppContainerSid, &v27);
                if( InformationToken < 0 )
                  goto LABEL_11;
              }
              v18 = *(_QWORD *)v27;
              LODWORD(v19) = RtlSubAuthorityCountSid(*(_QWORD *)v27);
              if( *v19 < 8u
                || (LODWORD(v20) = RtlSubAuthoritySid(v18, 1ui64),
                    v21 = v20,
                    LODWORD(v22) = RtlSubAuthoritySid((INT64)Capabilities->Sid, 1ui64),
                    RtlCompareMemory(v22, v21, 28) != (_SIZE_T *)28) )
              {
                v7 = 0;
                v30 = 0;
              }
              v10 = v7;
              if( !v7 )
                break;
              v11 = v25;
            }
            else
            {
              v10 = 1;
            }
LABEL_9:
            ++Capabilities;
          }
          *Matcha = v10;
        }
      }
    }
    else
    {
      *Matcha = 1;
    }
  }
LABEL_11:
  if( P )
    ExFreePoolWithTag(P, 0);
  if( v27 )
    ExFreePoolWithTag(v27, 0);
  return InformationToken;
}

Referenced by:

NtCreateLowBoxToken
SepIsImpersonationAllowedDueToCapability