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