LocalGetAceCondition

NTSTATUS __stdcall LocalGetAceCondition(
        _ACE_HEADER *AceHeader,
        VOID *Sid,
        WCHAR **ConditionStr,
        UINT64 *ConditionSize,
        UINT64 *AclSize,
        VOID *RootDomainSid,
        VOID *DomainSid,
        WCHAR **tSidLookupDomOrRootDomRelativeTable,
        UINT8 DefaultToDomain){
  unsigned int AceType; 
  NTSTATUS v14; 
  int v15; 
  unsigned int v17; 
  _CLAIM_SECURITY_ATTRIBUTE_RELATIVE_V1 *v18; 
  VOID *v19; 
  NTSTATUS StringForRelativeAttribute; 
  __int64 v21; 
  _ACE_HEADER v22; 
  WCHAR **v23; 

  AceType = AceHeader->AceType;
  *ConditionStr = 0i64;
  *(_DWORD *)ConditionSize = 0;
  v14 = 0;
  if( (unsigned __int8)AceType > 0x12u || (v15 = 271872, !_bittest(&v15, AceType)) )
  {
    if( (_BYTE)AceType == 11 )
      goto LABEL_15;
    if( (_BYTE)AceType != 21 )
      return v14;
  }
  if( (_BYTE)AceType != 11 )
  {
    v17 = AceHeader->AceSize - RtlLengthSid((INT64)Sid) - 8;
    goto LABEL_8;
  }
LABEL_15:
  v22 = AceHeader[2];
  v17 = AceHeader->AceSize - 16 * (v22.AceType & 1) - 8 * (v22.AceType & 2) - RtlLengthSid((INT64)Sid) - 12;
LABEL_8:
  *(_DWORD *)ConditionSize = v17;
  if( v17 )
  {
    v18 = (_CLAIM_SECURITY_ATTRIBUTE_RELATIVE_V1 *)((char *)Sid + (unsigned int)RtlLengthSid((INT64)Sid));
    if( (_BYTE)AceType == 18 )
    {
      LOBYTE(v23) = DefaultToDomain;
      StringForRelativeAttribute = LocalGetStringForRelativeAttribute(
                                     v18,
                                     v17,
                                     RootDomainSid,
                                     DomainSid,
                                     tSidLookupDomOrRootDomRelativeTable,
                                     v23,
                                     ConditionStr);
    }
    else
    {
      StringForRelativeAttribute = LocalpGetStringForCondition(
                                     (UINT8 *)v18,
                                     v17,
                                     ConditionStr,
                                     v19,
                                     RootDomainSid,
                                     (_STRSD_SID_LOOKUP *)DomainSid,
                                     (UINT8)tSidLookupDomOrRootDomRelativeTable);
    }
    v14 = StringForRelativeAttribute;
    if( !StringForRelativeAttribute )
    {
      v21 = -1i64;
      do
        ++v21;
      while( (*ConditionStr)[v21] );
      *(_DWORD *)AclSize += 2 * v21 + 2;
    }
  }
  return v14;
}

Referenced by:

LocalConvertAclToString