RtlAddResourceAttributeAce
INT64 __fastcall RtlAddResourceAttributeAce(
_ACL *Acl,
UINT64 AceRevision,
UINT64 AceFlags,
UINT64 AccessMask,
VOID *Sid,
_CLAIM_SECURITY_ATTRIBUTES_INFORMATION *AttributeInfo,
UINT64 *ReturnLength){
unsigned int v7;
int *v9;
int v10;
int v11;
int v12;
int AclRevision;
_CLAIM_SECURITY_ATTRIBUTE_RELATIVE_V1 *PoolWithQuotaTag;
UINT64 v15;
UINT16 v16;
unsigned int v17;
int v18;
unsigned int v19;
_ACL *v20;
__int64 v21;
PACE v22;
int v23;
BYTE v24;
USHORT pusResult[2];
UINT64 NumberOfBytes;
PACE Ace;
int v29;
unsigned __int16 v30;
int Src[64];
v7 = AceRevision;
HIDWORD(NumberOfBytes) = AceFlags;
Ace = 0i64;
v29 = 0;
v9 = 0i64;
v30 = 256;
v10 = AccessMask;
memset((INT64)Src, 0i64);
LODWORD(NumberOfBytes) = 256;
if( !ReturnLength )
return(unsigned int)-1073741811;
*(_DWORD *)ReturnLength = 0;
if( !Acl )
return(unsigned int)-1073741705;
if( !RtlValidSid(Sid) )
return(unsigned int)-1073741704;
v12 = *(_DWORD *)((char *)Sid + 2) - v29;
if( !v12 )
v12 = *((unsigned __int16 *)Sid + 3) - v30;
if( v12 )
return(unsigned int)-1073741811;
if( *((_BYTE *)Sid + 1) == 1 && !*((_DWORD *)Sid + 2) )
{
if( Acl->AclRevision > 4u || v7 > 4 )
return(unsigned int)-1073741735;
AclRevision = Acl->AclRevision;
if( Acl->AclRevision <= (unsigned __int8)v7 )
AclRevision = (unsigned __int8)v7;
v29 = AclRevision;
if( (NumberOfBytes & 0xFFFFFFE000000000ui64) == 0
&& !v10
&& RtlpValidAttributeInfo(AttributeInfo)
&& AttributeInfo->AttributeCount == 1 )
{
v9 = Src;
v11 = RtlpConvertAbsoluteToRelativeSecurityAttribute(
AttributeInfo->Attribute.pAttributeV1,
(_CLAIM_SECURITY_ATTRIBUTE_RELATIVE_V1 *)Src,
&NumberOfBytes);
if( v11 == -1073741789 )
{
PoolWithQuotaTag = (_CLAIM_SECURITY_ATTRIBUTE_RELATIVE_V1 *)ExAllocatePoolWithQuotaTag(
(POOL_TYPE)520,
(unsigned int)NumberOfBytes,
0x62507452ui64);
v9 = (int *)PoolWithQuotaTag;
if( !PoolWithQuotaTag )
return(unsigned int)-1073741801;
v11 = RtlpConvertAbsoluteToRelativeSecurityAttribute(
AttributeInfo->Attribute.pAttributeV1,
PoolWithQuotaTag,
&NumberOfBytes);
}
if( v11 >= 0 )
{
if( RtlValidAcl(Acl) && RtlFirstFreeAce(Acl, (VOID **)&Ace) )
{
v15 = (unsigned int)NumberOfBytes;
v16 = 4 * (*((unsigned __int8 *)Sid + 1) + 4);
pusResult[0] = v16;
if( (unsigned int)NumberOfBytes > 0xFFFF || RtlUShortAdd(v16, NumberOfBytes, pusResult) < 0 )
{
v11 = -1073741675;
}
else
{
v18 = v17 + 8;
v19 = v17;
*(_DWORD *)ReturnLength = v17 + 8;
v20 = Acl + 1;
if( (unsigned __int16)v17 < Acl->AceCount )
{
do
{
++v19;
v18 = *(_DWORD *)ReturnLength + v20->AclSize;
*(_DWORD *)ReturnLength = v18;
v20 = (_ACL *)((char *)v20 + v20->AclSize);
}
while( v19 < Acl->AceCount );
}
v21 = pusResult[0];
v22 = Ace;
v23 = v18 + pusResult[0];
*(_DWORD *)ReturnLength = v23;
if( v22 && (char *)v22 + v21 <= (char *)Acl + Acl->AclSize )
{
v24 = BYTE4(NumberOfBytes);
v22->Header.AceSize = v21;
v22->Header.AceFlags = v24;
v22->Header.AceType = 18;
v22->AccessMask = v17;
RtlCopySid(4 * *((unsigned __int8 *)Sid + 1) + 8, &v22[1], Sid);
memmove((UINT8 *)&v22[2] + 4 * *((unsigned __int8 *)Sid + 1), (UINT8 *)v9, v15);
++Acl->AceCount;
Acl->AclRevision = v29;
}
else
{
v11 = -1073741671;
*(_DWORD *)ReturnLength = (v23 + 3) & 0xFFFFFFFC;
}
}
}
else
{
v11 = -1073741705;
}
}
goto LABEL_39;
}
return(unsigned int)-1073741811;
}
v11 = -1073741811;
LABEL_39:
if( v9 && v9 != Src )
ExFreePoolWithTag(v9, 0);
return(unsigned int)v11;
}Referenced by:
No references.