RtlAddResourceAttributeAce
NTSTATUS __stdcall RtlAddResourceAttributeAce(
PACL Acl,
UINT64 AceRevision,
UINT64 AceFlags,
UINT64 AccessMask,
VOID *Sid,
_CLAIM_SECURITY_ATTRIBUTES_INFORMATION *AttributeInfo,
UINT64 *ReturnLength){
unsigned int v7;
char *v9;
int v10;
int v11;
int v12;
int AclRevision;
VOID *v14;
VOID *v15;
_CLAIM_SECURITY_ATTRIBUTE_RELATIVE_V1 *PoolWithQuotaTag;
char v17;
size_t v18;
UINT16 v19;
unsigned int v20;
int v21;
unsigned int v22;
PACL v23;
__int64 v24;
_WORD *v25;
int v26;
char v27;
UINT16 pusResult[2];
UINT64 Size;
VOID *FirstFree;
int v32;
unsigned __int16 v33;
char RelativeAttribute[256];
v7 = AceRevision;
HIDWORD(Size) = AceFlags;
FirstFree = 0i64;
v32 = 0;
v9 = 0i64;
v33 = 256;
v10 = AccessMask;
memset(RelativeAttribute, 0i64, sizeof(RelativeAttribute));
LODWORD(Size) = 256;
if( !ReturnLength )
return -1073741811;
*(_DWORD *)ReturnLength = 0;
if( !Acl )
return -1073741705;
if( !RtlValidSid(Sid) )
return -1073741704;
v12 = *(_DWORD *)((char *)Sid + 2) - v32;
if( !v12 )
v12 = *((unsigned __int16 *)Sid + 3) - v33;
if( v12 )
return -1073741811;
if( *((_BYTE *)Sid + 1) == 1 && !*((_DWORD *)Sid + 2) )
{
if( Acl->AclRevision > 4u || v7 > 4 )
return -1073741735;
AclRevision = Acl->AclRevision;
if( Acl->AclRevision <= (unsigned __int8)v7 )
AclRevision = (unsigned __int8)v7;
v32 = AclRevision;
if( (Size & 0xFFFFFFE000000000ui64) == 0
&& !v10
&& RtlpValidAttributeInfo(AttributeInfo)
&& AttributeInfo->AttributeCount == 1 )
{
v9 = RelativeAttribute;
v11 = RtlpConvertAbsoluteToRelativeSecurityAttribute(
AttributeInfo->Attribute.pAttributeV1,
(_CLAIM_SECURITY_ATTRIBUTE_RELATIVE_V1 *)RelativeAttribute,
&Size);
if( v11 == -1073741789 )
{
PoolWithQuotaTag = (_CLAIM_SECURITY_ATTRIBUTE_RELATIVE_V1 *)ExAllocatePoolWithQuotaTag(
(POOL_TYPE)520,
(unsigned int)Size,
0x62507452ui64);
v9 = (char *)PoolWithQuotaTag;
if( !PoolWithQuotaTag )
return -1073741801;
v11 = RtlpConvertAbsoluteToRelativeSecurityAttribute(
AttributeInfo->Attribute.pAttributeV1,
PoolWithQuotaTag,
&Size);
}
if( v11 >= 0 )
{
RtlValidAcl(Acl, v14, v15);
if( v17 && RtlFirstFreeAce(Acl, &FirstFree) )
{
v18 = Size;
v19 = 4 * (*((unsigned __int8 *)Sid + 1) + 4);
pusResult[0] = v19;
if( (unsigned int)Size > 0xFFFF || RtlUShortAdd(v19, Size, pusResult) < 0 )
{
v11 = -1073741675;
}
else
{
v21 = v20 + 8;
v22 = v20;
*(_DWORD *)ReturnLength = v20 + 8;
v23 = Acl + 1;
if( (unsigned __int16)v20 < Acl->AceCount )
{
do
{
++v22;
v21 = *(_DWORD *)ReturnLength + v23->AclSize;
*(_DWORD *)ReturnLength = v21;
v23 = (PACL)((char *)v23 + v23->AclSize);
}
while( v22 < Acl->AceCount );
}
v24 = pusResult[0];
v25 = FirstFree;
v26 = v21 + pusResult[0];
*(_DWORD *)ReturnLength = v26;
if( v25 && (char *)v25 + v24 <= (char *)Acl + Acl->AclSize )
{
v27 = BYTE4(Size);
v25[1] = v24;
*((_BYTE *)v25 + 1) = v27;
*(_BYTE *)v25 = 18;
*((_DWORD *)v25 + 1) = v20;
RtlCopySid(4 * (unsigned int)*((unsigned __int8 *)Sid + 1) + 8, v25 + 4, Sid);
memmove(&v25[2 * *((unsigned __int8 *)Sid + 1) + 8], v9, v18);
++Acl->AceCount;
Acl->AclRevision = v32;
}
else
{
v11 = -1073741671;
*(_DWORD *)ReturnLength = (v26 + 3) & 0xFFFFFFFC;
}
}
}
else
{
v11 = -1073741705;
}
}
goto LABEL_39;
}
return -1073741811;
}
v11 = -1073741811;
LABEL_39:
if( v9 && v9 != RelativeAttribute )
ExFreePoolWithTag(v9, 0);
return v11;
}Referenced by:
No references.