RtlCapabilityCheck

NTSTATUS __stdcall RtlCapabilityCheck(VOID *Token, _UNICODE_STRING *CapabilityName, UINT8 *HasCapability){
  char v4; 
  char v5; 
  char v6; 
  int v9; 
  INT64 v10; 
  _DWORD *v11; 
  NTSTATUS v12; 
  _DWORD *v13; 
  NTSTATUS v14; 
  _DWORD *v15; 
  NTSTATUS v16; 
  _DWORD *v17; 
  NTSTATUS v18; 
  NTSTATUS v19; 
  INT64 Length; 
  UINT64 Lengtha; 
  UINT64 *ResultLength; 
  INT64 a7; 
  INT64 a8; 
  _DWORD *v26; 
  UINT64 v27; 
  VOID *KeyHandle; 
  UINT64 PerformanceCounter; 
  _UNICODE_STRING DestinationString; 
  _OBJECT_ATTRIBUTES ObjectAttributes; 
  __int128 KeyValueInformation; 
  char Sid[16]; 
  char CapabilityGroupSid[48]; 
  char CapabilitySid[48]; 

  WORD2(a8) = 1280;
  LODWORD(v27) = 0;
  KeyHandle = 0i64;
  LODWORD(a8) = 0;
  DestinationString = 0i64;
  v4 = 0;
  memset(&ObjectAttributes, 0, sizeof(ObjectAttributes));
  LOWORD(a7) = 0;
  v5 = 0;
  v6 = 0;
  *(_DWORD *)((char *)&a7 + 2) = 0;
  KeyValueInformation = 0i64;
  PerformanceCounter = KeQueryPerformanceCounter(0i64);
  if( !CapabilityName || !HasCapability )
  {
    v9 = -1073741811;
    goto LABEL_27;
  }
  *HasCapability = 0;
  v9 = RtlDeriveCapabilitySidsFromName(CapabilityName, CapabilityGroupSid, CapabilitySid);
  if( v9 < 0 )
    goto LABEL_27;
  if( !RtlIsMultiSessionSku()
    || (RtlInitUnicodeString(
          &DestinationString,
          L"\\Registry\\Machine\\Software\\Microsoft\\SecurityManager\\AdminCapabilities"),
        ObjectAttributes.RootDirectory = 0i64,
        ObjectAttributes.ObjectName = &DestinationString,
        ObjectAttributes.Length = 48,
        ObjectAttributes.Attributes = 576,
        *(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64,
        ZwOpenKey(&KeyHandle, 0x80000000ui64, &ObjectAttributes, v10, Length, (INT64)ResultLength, a7, a8) < 0)
    || (LODWORD(Lengtha) = 16,
        ZwQueryValueKey(KeyHandle, CapabilityName, KeyValuePartialInformation, &KeyValueInformation, Lengtha, &v27) < 0) )
  {
    v9 = RtlCheckTokenMembershipEx(Token, CapabilityGroupSid, 2ui64, (UINT8 *)&a7 + 3);
    if( v9 < 0 )
      goto LABEL_27;
    if( !BYTE3(a7) )
    {
      RtlInitializeSid(Sid, (_SID_IDENTIFIER_AUTHORITY *)&a8, 1u);
      LODWORD(v15) = RtlSubAuthoritySid((INT64)Sid, 0i64);
      v26 = v15;
      *v15 = 18;
      v16 = RtlCheckTokenMembership(Token, Sid, (UINT8 *)&a7 + 1);
      v5 = BYTE1(a7);
      v9 = v16;
      if( v16 < 0 )
        goto LABEL_27;
      if( !BYTE1(a7) )
      {
        RtlInitializeSid(Sid, (_SID_IDENTIFIER_AUTHORITY *)&a8, 2u);
        *v26 = 32;
        LODWORD(v17) = RtlSubAuthoritySid((INT64)Sid, 1ui64);
        *v17 = 544;
        v18 = RtlCheckTokenMembership(Token, Sid, (UINT8 *)&a7);
        v4 = a7;
        v9 = v18;
        if( v18 < 0 )
          goto LABEL_27;
        if( !(_BYTE)a7 )
        {
          RtlInitializeSid(Sid, (_SID_IDENTIFIER_AUTHORITY *)&a8, 1u);
          *v26 = 4;
          v19 = RtlCheckTokenMembershipEx(Token, Sid, 2ui64, (UINT8 *)&a7 + 2);
          v6 = BYTE2(a7);
          v9 = v19;
          if( v19 < 0 )
            goto LABEL_27;
          if( !BYTE2(a7) )
            goto LABEL_22;
        }
      }
    }
LABEL_20:
    v9 = RtlCheckTokenCapability(Token, CapabilitySid, (UINT8 *)&a7 + 4);
    if( v9 < 0 )
      goto LABEL_27;
    *HasCapability = BYTE4(a7);
    goto LABEL_22;
  }
  BYTE5(a7) = 1;
  RtlInitializeSid(Sid, (_SID_IDENTIFIER_AUTHORITY *)&a8, 1u);
  LODWORD(v11) = RtlSubAuthoritySid((INT64)Sid, 0i64);
  v26 = v11;
  *v11 = 18;
  v12 = RtlCheckTokenMembership(Token, Sid, (UINT8 *)&a7 + 1);
  v5 = BYTE1(a7);
  v9 = v12;
  if( v12 < 0 )
    goto LABEL_27;
  if( BYTE1(a7) )
    goto LABEL_20;
  RtlInitializeSid(Sid, (_SID_IDENTIFIER_AUTHORITY *)&a8, 2u);
  *v26 = 32;
  LODWORD(v13) = RtlSubAuthoritySid((INT64)Sid, 1ui64);
  *v13 = 544;
  v14 = RtlCheckTokenMembership(Token, Sid, (UINT8 *)&a7);
  v4 = a7;
  v9 = v14;
  if( v14 < 0 )
    goto LABEL_27;
  if( (_BYTE)a7 )
    goto LABEL_20;
LABEL_22:
  if( *HasCapability && !v4 && !v5 )
    v9 = RtlpCapabilityCheckSystemCapability((_HANDLE)Token, CapabilityName);
LABEL_27:
  if( KeyHandle )
    ZwClose((_HANDLE)KeyHandle);
  v26 = (_DWORD *)KeQueryPerformanceCounter(0i64);
  if( !v5 && !PsIsCurrentThreadInServerSilo() )
    RtlpLogCapabilityCheckLatency(&PerformanceCounter, &v26, v4, v6, SBYTE5(a7), *HasCapability);
  return v9;
}

Referenced by:

ExpCapabilityCheck
NtSetSystemTime
PopCapabilityCheck
RtlCapabilityCheckForSingleSessionSku