RtlpGenerateInheritedAce

INT64 __stdcall RtlpGenerateInheritedAce(
        _ACE_HEADER *OldAce,
        UINT8 IsDirectoryObject,
        UINT8 AutoInherit,
        PVOID ClientOwnerSid,
        PVOID ClientGroupSid,
        PVOID ServerOwnerSid,
        PVOID ServerGroupSid,
        _GENERIC_MAPPING *GenericMapping,
        _GUID **pNewObjectType,
        UINT64 GuidCount,
        UINT64 *NewAceLength,
        _ACL *NewAcl,
        UINT64 *NewAceExtraLength,
        UINT8 *ObjectAceInherited){
  UINT8 *v14; 
  unsigned int v15; 
  UINT8 v16; 
  unsigned int v18; 
  unsigned int v19; 
  unsigned int v20; 
  UINT8 v21; 
  _ACL *v22; 
  unsigned int v23; 
  _ACL *v24; 
  BYTE v25; 
  BYTE AceFlags; 
  unsigned int AceSize; 
  __int64 v29; 
  unsigned __int8 v30; 
  UINT64 v31; 
  UINT8 EffectiveAceMapped; 
  unsigned int v33; 
  UINT8 *dst; 
  _ACL *v35; 
  UINT8 AclOverflowed; 
  UINT8 v37; 
  VOID *ClientOwnerSida; 
  ClientOwnerSida = ClientOwnerSid;
  v37 = AutoInherit;
  v14 = ObjectAceInherited;
  v15 = 0;
  v16 = 0;
  v35 = 0i64;
  v33 = 0;
  EffectiveAceMapped = 0;
  *ObjectAceInherited = 0;
  v18 = 0;
  AclOverflowed = 0;
  v19 = 0;
  v20 = 0;
  v21 = 0;
  if( IsDirectoryObject )
  {
    AceFlags = OldAce->AceFlags;
    if( (AceFlags & 4) == 0 && ((AceFlags & 1) != 0 || (AceFlags & 2) != 0) )
      v21 = 1;
  }
  v22 = NewAcl;
  v23 = 0;
  dst = 0i64;
  v24 = NewAcl + 1;
  if( NewAcl->AceCount )
  {
    while( v24 < (_ACL *)((char *)NewAcl + NewAcl->AclSize) )
    {
      ++v23;
      v24 = (_ACL *)((char *)v24 + v24->AclSize);
      if( v23 >= NewAcl->AceCount )
      {
        v14 = ObjectAceInherited;
        goto LABEL_7;
      }
    }
    return 3221225597i64;
  }
LABEL_7:
  if( v24 > (_ACL *)((char *)NewAcl + NewAcl->AclSize) )
    return 3221225597i64;
  dst = (UINT8 *)v24;
  if( !v24 )
    return 3221225597i64;
  v25 = OldAce->AceFlags;
  if( IsDirectoryObject )
  {
    if( (v25 & 2) == 0 )
      goto LABEL_11;
  }
  else if( (v25 & 1) == 0 )
  {
    goto LABEL_11;
  }
  LODWORD(v31) = GuidCount;
  v35 = v24;
  if( !RtlpCopyEffectiveAce(
          OldAce,
          v37,
          v21,
          ClientOwnerSida,
          ClientGroupSid,
          ServerOwnerSid,
          ServerGroupSid,
          GenericMapping,
          pNewObjectType,
          v31,
          (VOID **)&dst,
          (UINT64 *)&v33,
          NewAcl,
          v14,
          &EffectiveAceMapped,
          &AclOverflowed) )
    return 3221225597i64;
  v20 = v33;
  if( !AclOverflowed && v33 )
  {
    if( RtlpIsDuplicateAce((INT64)v22, (UINT8 *)v24) )
    {
      v19 = v33;
      v20 = 0;
      --v22->AceCount;
      v18 = 0;
      v16 = EffectiveAceMapped;
      v33 = 0;
      dst = (UINT8 *)v24;
      goto LABEL_11;
    }
    v20 = v33;
  }
  v16 = EffectiveAceMapped;
  v18 = v20;
LABEL_11:
  if( v21 )
  {
    if( v20 && !v16 )
    {
      if( !AclOverflowed )
      {
        v29 = (__int64)v35;
        v30 = v35->Sbz1 | OldAce->AceFlags & 3;
        v35->Sbz1 = v30;
        if( v37 )
          *(_BYTE *)(v29 + 1) = v30 | 0x10;
      }
      goto LABEL_12;
    }
    if( OldAce->AceType > 8u || *(_DWORD *)&OldAce[1] )
    {
      v18 += OldAce->AceSize;
      if( v18 <= 0xFFFF )
      {
        if( OldAce->AceSize > (__int64)v22 + v22->AclSize - (_QWORD)dst )
        {
          AclOverflowed = 1;
        }
        else if( !AclOverflowed )
        {
          memmove(dst, &OldAce->AceType, OldAce->AceSize);
          dst[1] |= 8u;
          ++v22->AceCount;
          if( v37 )
          {
            dst[1] |= 0x10u;
            if( RtlpIsDuplicateAce((INT64)v22, dst) )
            {
              --v22->AceCount;
              AceSize = OldAce->AceSize;
              v18 -= AceSize;
              if( v19 > AceSize )
                AceSize = v19;
              v19 = AceSize;
            }
          }
        }
        goto LABEL_12;
      }
      return 3221225597i64;
    }
  }
LABEL_12:
  *(_DWORD *)NewAceLength = v18;
  *(_DWORD *)NewAceExtraLength = v19;
  if( AclOverflowed )
    return(unsigned int)-1073741789;
  return v15;
}

Referenced by:

RtlpGenerateInheritAcl