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.