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.