LocalConvertAclToString

NTSTATUS __stdcall LocalConvertAclToString(
        _ACL *Acl,
        UINT8 AclPresent,
        UINT8 ConvertAsDacl,
        WCHAR **AclString,
        UINT64 *AclStringSize,
        VOID *RootDomainSid,
        VOID *DomainSid,
        UINT8 DefaultToDomain){
  _ACL *v9; 
  unsigned int v10; 
  UINT64 v11; 
  UINT64 v12; 
  unsigned int v13; 
  UINT8 v14; 
  UINT64 v15; 
  UINT8 v16; 
  UINT64 v17; 
  UINT64 v18; 
  UINT64 v19; 
  _GUID *v20; 
  _ACL *v21; 
  _STRSD_KEY_LOOKUP *v22; 
  __int64 v23; 
  __int64 v24; 
  unsigned int v25; 
  int v26; 
  unsigned __int8 AclRevision; 
  unsigned int v28; 
  unsigned __int8 *v29; 
  NTSTATUS AceCondition; 
  UINT64 v31; 
  int v32; 
  _STRSD_KEY_LOOKUP *v33; 
  UINT8 v34; 
  unsigned int v35; 
  int v36; 
  UINT64 v37; 
  _STRSD_KEY_LOOKUP *v38; 
  __int64 v39; 
  __int64 v40; 
  _STRSD_KEY_LOOKUP *v41; 
  __int64 v42; 
  __int64 v43; 
  _STRSD_SID_LOOKUP *v44; 
  wchar_t **v45; 
  wchar_t *v46; 
  __int64 v47; 
  __int64 v48; 
  NTSTATUS v49; 
  unsigned __int64 v50; 
  WCHAR **v51; 
  WCHAR *v52; 
  unsigned __int64 v53; 
  _ACE_HEADER *v54; 
  unsigned int v55; 
  wchar_t *v56; 
  UINT64 v57; 
  _STRSD_KEY_LOOKUP *v58; 
  _STRSD_KEY_LOOKUP *v59; 
  __int64 v60; 
  _ACE_HEADER *v61; 
  unsigned int v62; 
  wchar_t *v63; 
  UINT64 v64; 
  UINT64 v65; 
  __int64 v66; 
  _ACE_HEADER *v67; 
  UINT64 v68; 
  wchar_t *v69; 
  _GUID *v70; 
  UCHAR AceType; 
  WCHAR **tSidLookupDomOrRootDomRelativeTable; 
  int v73; 
  __int64 v74; 
  UINT64 v75; 
  wchar_t *v76; 
  UINT64 v77; 
  wchar_t *v78; 
  _QWORD *v79; 
  __int64 v80; 
  UINT64 v81; 
  wchar_t *v82; 
  wchar_t *v83; 
  __int64 v84; 
  wchar_t *v85; 
  wchar_t *v86; 
  unsigned __int64 v87; 
  _ACE_HEADER *v88; 
  unsigned int v89; 
  _STRSD_KEY_LOOKUP *v90; 
  _STRSD_KEY_LOOKUP *v91; 
  __int64 v92; 
  UINT64 v93; 
  _STRSD_KEY_LOOKUP *v94; 
  _STRSD_KEY_LOOKUP *v95; 
  unsigned int v96; 
  _BYTE *v97; 
  void *v99; 
  UINT64 v100; 
  wchar_t *v101; 
  __int64 v102; 
  bool v103; 
  WCHAR *v104; 
  NTSTATUS v105; 
  PVOID v106; 
  unsigned int v107; 
  unsigned int v108; 
  int v109; 
  __int64 v110; 
  unsigned __int8 *p_AceCount; 
  wchar_t *v112; 
  int v113; 
  unsigned int v114; 
  __int64 v115; 
  _ACE_HEADER *v116; 
  unsigned int v117; 
  unsigned int v118; 
  UINT64 v119; 
  _STRSD_KEY_LOOKUP *v120; 
  _STRSD_KEY_LOOKUP *v121; 
  __int64 v122; 
  WCHAR *v123; 
  __int64 v124; 
  NTSTATUS v125; 
  WCHAR *v126; 
  __int64 v127; 
  VOID **AclSize; 
  unsigned int Val; 
  UINT64 LookupFlags; 
  PVOID P; 
  UINT64 ConditionSize; 
  WCHAR *ConditionStr; 
  VOID *Sid; 
  _ACE_HEADER *AceHeader; 
  _GUID *v136; 
  PVOID v137; 
  WCHAR *ConvertedGuidString; 
  UINT64 v139; 
  PVOID v140; 
  _GUID *v141; 
  int DefaultToDomaina; 
  UINT8 v145; 

  DefaultToDomaina = 0;
  v9 = Acl;
  LODWORD(v139) = 0;
  v10 = 0;
  ConvertedGuidString = 0i64;
  Val = 0;
  Sid = 0i64;
  v136 = 0i64;
  ConditionStr = 0i64;
  if( !AclString || !AclStringSize )
    return 87;
  if( !AclPresent )
  {
    *AclString = 0i64;
    *(_DWORD *)AclStringSize = 0;
    return 0;
  }
  if( !Acl )
  {
    *AclString = 0i64;
    *(_DWORD *)AclStringSize = 36;
    v104 = (WCHAR *)SddlpAlloc(0x24ui64, AclPresent, ConvertAsDacl);
    *AclString = v104;
    if( !v104 )
    {
      v105 = 8;
LABEL_130:
      *(_DWORD *)AclStringSize = 0;
      return v105;
    }
    wcscpy(v104, L"NO_ACCESS_CONTROL");
    return 0;
  }
  if( !Acl->AceCount )
  {
    *AclString = 0i64;
    v105 = 0;
    goto LABEL_130;
  }
  LOBYTE(v11) = -ConvertAsDacl;
  v12 = 8i64 * Acl->AceCount;
  v13 = 2 - ((_BYTE)v11 != 0);
  HIDWORD(LookupFlags) = v13;
  P = SddlpAlloc(v12, AclPresent, v11);
  if( !P )
    return 8;
  v140 = SddlpAlloc(v9->AceCount, v14, v15);
  if( !v140 )
  {
    v106 = P;
LABEL_132:
    ExFreePoolWithTag(v106, 0);
    return 8;
  }
  v137 = SddlpAlloc(4i64 * v9->AceCount, v16, v17);
  if( !v137 )
  {
    ExFreePoolWithTag(P, 0);
    v106 = v140;
    goto LABEL_132;
  }
  v20 = 0i64;
  AceHeader = (_ACE_HEADER *)&v9[1];
  v21 = v9 + 1;
  if( !v9->AceCount )
    goto LABEL_152;
  while( 1 )
  {
    v10 += 2;
    DefaultToDomaina = v10;
    v22 = LookupAceTypeInTable(0i64, v21->AclRevision, v13);
    if( !v22 )
    {
LABEL_119:
      AceCondition = 1336;
      goto LABEL_53;
    }
    v23 = *(_QWORD *)v22;
    v24 = -1i64;
    do
      ++v24;
    while( *(_WORD *)(v23 + 2 * v24) );
    v25 = 0;
    v26 = v10 + 2 + 2 * v24;
    do
    {
      v18 = (unsigned int)(1 << v25);
      if( ((unsigned __int8)v18 & v21->Sbz1) != 0 )
      {
        v41 = LookupAceFlagsInTable(0i64, v18, v13);
        if( v41 )
        {
          v42 = *(_QWORD *)v41;
          v43 = -1i64;
          do
            ++v43;
          while( *(_WORD *)(v42 + 2 * v43) );
          v26 += 2 * v43;
        }
      }
      ++v25;
    }
    while( v25 < 8 );
    AclRevision = v21->AclRevision;
    v10 = v26 + 2;
    DefaultToDomaina = v10;
    LODWORD(LookupFlags) = v10;
    if( AclRevision > 0xBu )
    {
      if( AclRevision != 13 )
      {
        if( AclRevision <= 0x10u )
          goto LABEL_119;
        v103 = AclRevision <= 0x15u;
LABEL_118:
        if( !v103 )
          goto LABEL_119;
      }
LABEL_19:
      v28 = *(_DWORD *)&v21->AceCount;
      v29 = (unsigned __int8 *)&v21[1];
      Sid = &v21[1];
      Val = v28;
      goto LABEL_20;
    }
    if( AclRevision != 11 )
    {
      if( AclRevision <= 3u )
        goto LABEL_19;
      if( AclRevision <= 4u )
        goto LABEL_119;
      if( AclRevision > 8u )
      {
        v103 = AclRevision <= 0xAu;
        goto LABEL_118;
      }
    }
    v107 = *(_DWORD *)&v21->AceCount;
    v108 = *(_DWORD *)&v21[1].AclRevision & 1;
    Val = v107;
    v109 = *(_DWORD *)&v21[1].AclRevision & 2;
    v110 = 2i64 * v108;
    v29 = (unsigned __int8 *)&v21[v110] + (v109 != 0 ? 28i64 : 12i64);
    Sid = v29;
    if( (-(__int64)(v108 != 0) & (unsigned __int64)&v21[1].AceCount) != 0 )
    {
      v10 += 72;
      LODWORD(LookupFlags) = v10;
    }
    if( v109 )
      p_AceCount = (unsigned __int8 *)&v21[v110 + 1].AceCount;
    else
      p_AceCount = 0i64;
    if( p_AceCount )
      LODWORD(LookupFlags) = v10 + 72;
    v28 = v107;
LABEL_20:
    if( ConditionStr )
    {
      ExFreePoolWithTag(ConditionStr, 0);
      ConditionStr = 0i64;
    }
    LODWORD(ConditionSize) = 0;
    AceCondition = LocalGetAceCondition(
                     (_ACE_HEADER *)v21,
                     v29,
                     &ConditionStr,
                     &ConditionSize,
                     &LookupFlags,
                     RootDomainSid,
                     DomainSid,
                     0i64,
                     v145);
    if( AceCondition )
    {
      v10 = LookupFlags;
      DefaultToDomaina = LookupFlags;
      goto LABEL_150;
    }
    v31 = HIDWORD(LookupFlags);
    v32 = 0;
    *((_DWORD *)v137 + (unsigned int)v20) = 0;
    if( v21->AclRevision == 17 )
      v31 = 4i64;
    v33 = LookupAccessMaskInTable(0i64, v28, v31);
    if( !v33 )
    {
      v35 = Val;
      v36 = 0;
      while( 1 )
      {
        if( (v35 & (1 << v36)) != 0 )
        {
          v37 = HIDWORD(LookupFlags);
          if( v21->AclRevision == 17 )
            v37 = 4i64;
          v38 = LookupAccessMaskInTable(0i64, v35 & (1 << v36), v37);
          if( !v38 )
          {
            v32 = 20;
            *((_DWORD *)v137 + (unsigned int)v20) = 2;
            goto LABEL_41;
          }
          v39 = *(_QWORD *)v38;
          v40 = -1i64;
          do
            ++v40;
          while( *(_WORD *)(v39 + 2 * v40) );
          v32 += 2 * v40;
          v35 = Val;
        }
        if( (unsigned int)++v36 >= 0x20 )
          goto LABEL_41;
      }
    }
    v48 = -1i64;
    *((_DWORD *)v137 + (unsigned int)v20) = 1;
    do
      ++v48;
    while( *(_WORD *)(*(_QWORD *)v33 + 2 * v48) );
    v32 = 2 * v48;
LABEL_41:
    v10 = v32 + LookupFlags + 6;
    DefaultToDomaina = v10;
    v44 = LookupSidInTable(0i64, Sid, RootDomainSid, v34, AclSize, v145);
    LOBYTE(v18) = 0;
    v45 = (wchar_t **)((char *)P + 8 * (unsigned int)v20);
    if( !v44 )
      break;
    v46 = (wchar_t *)v44 + 1;
    *v45 = (wchar_t *)v44 + 1;
LABEL_43:
    v47 = -1i64;
    do
      ++v47;
    while( v46[v47] );
    v9 = Acl;
    v10 += 2 * v47 + 4;
    v21 = (_ACL *)((char *)v21 + v21->AclSize);
    DefaultToDomaina = v10;
    LODWORD(v20) = (_DWORD)v20 + 1;
    if( (unsigned int)v20 >= Acl->AceCount )
      goto LABEL_53;
    v13 = HIDWORD(LookupFlags);
  }
  if( v136 )
  {
    v112 = (wchar_t *)SddlpAlloc(6ui64, 0, v19);
    *v45 = v112;
    if( !v112 )
    {
      AceCondition = 8;
      goto LABEL_150;
    }
    wcscpy_s(v112, 3ui64, (PWCHAR)L"SA");
    LOBYTE(v18) = 0;
    goto LABEL_52;
  }
  v49 = LocalConvertSidToStringSidW(Sid, (WCHAR **)P + (unsigned int)v20);
  LOBYTE(v18) = 0;
  if( v49 >= 0 )
  {
LABEL_52:
    *((_BYTE *)v140 + (unsigned int)v20) = 1;
    v46 = *v45;
    goto LABEL_43;
  }
  AceCondition = RtlNtStatusToDosError((unsigned int)v49);
LABEL_150:
  v9 = Acl;
LABEL_53:
  v20 = 0i64;
  if( !v10 )
LABEL_152:
    AceCondition = 1336;
  if( AceCondition )
    goto LABEL_188;
  if( (v10 & 1) != 0 )
    DefaultToDomaina = ++v10;
  v50 = v10;
  v51 = AclString;
  v52 = (WCHAR *)SddlpAlloc(v10, v18, v19);
  *AclString = v52;
  if( !v52 )
  {
    v10 = DefaultToDomaina;
    AceCondition = 8;
    goto LABEL_189;
  }
  v53 = v50 >> 1;
  LODWORD(LookupFlags) = 0;
  if( !v9->AceCount )
    goto LABEL_187;
  v54 = AceHeader;
  while( 2 )
  {
    if( !v53 )
      goto LABEL_186;
    v55 = HIDWORD(LookupFlags);
    *v52 = 40;
    v56 = v52 + 1;
    v57 = v53 - 1;
    v58 = LookupAceTypeInTable(0i64, v54->AceType, v55);
    v59 = v58;
    if( v58 )
    {
      wcscpy_s(v56, v57, *(PWCHAR *)v58);
      v60 = (unsigned int)v59[2];
      v57 -= v60;
      v56 += v60;
    }
    if( !v57 )
      goto LABEL_186;
    v61 = AceHeader;
    *v56 = 59;
    v62 = (unsigned int)v20;
    v63 = v56 + 1;
    v64 = v57 - 1;
    do
    {
      v65 = (unsigned int)(1 << v62);
      if( ((unsigned __int8)v65 & v61->AceFlags) != 0 )
      {
        v90 = LookupAceFlagsInTable(0i64, v65, v55);
        v91 = v90;
        if( v90 )
        {
          wcscpy_s(v63, v64, *(PWCHAR *)v90);
          v92 = (unsigned int)v91[2];
          v64 -= v92;
          v63 += v92;
        }
        v55 = HIDWORD(LookupFlags);
      }
      ++v62;
    }
    while( v62 < 8 );
    v66 = (unsigned int)LookupFlags;
    if( !v64 )
    {
LABEL_186:
      AceCondition = 1336;
      goto LABEL_187;
    }
    v67 = AceHeader;
    *v63 = 59;
    v68 = v64 - 1;
    v69 = v63 + 1;
    v141 = v20;
    v70 = v20;
    v136 = v20;
    AceType = v67->AceType;
    if( v67->AceType > 0xBu )
    {
      if( AceType == 13 || AceType > 0x10u && AceType <= 0x15u )
        goto LABEL_71;
    }
    else
    {
      if( v67->AceType == 11 )
        goto LABEL_154;
      if( AceType <= 3u )
        goto LABEL_71;
      if( AceType > 4u )
      {
        if( AceType > 8u )
        {
          if( AceType > 0xAu )
            goto LABEL_72;
LABEL_71:
          Val = (unsigned int)v67[1];
          Sid = &v67[2];
          goto LABEL_72;
        }
LABEL_154:
        v113 = *(_DWORD *)&v67[2] & 2;
        v114 = *(_DWORD *)&v67[2] & 1;
        v115 = 4i64 * v114;
        Val = (unsigned int)v67[1];
        Sid = &v67[v115].AceType + (v113 != 0 ? 28i64 : 12i64);
        if( v113 )
          v20 = (_GUID *)&v67[v115 + 3];
        else
          v20 = 0i64;
        v136 = v20;
        v70 = (_GUID *)((unsigned __int64)&v67[3] & -(__int64)(v114 != 0));
        v141 = v70;
      }
    }
LABEL_72:
    tSidLookupDomOrRootDomRelativeTable = (WCHAR **)ConditionStr;
    if( ConditionStr )
    {
      ExFreePoolWithTag(ConditionStr, 0);
      tSidLookupDomOrRootDomRelativeTable = 0i64;
      ConditionStr = 0i64;
    }
    LODWORD(ConditionSize) = (_DWORD)tSidLookupDomOrRootDomRelativeTable;
    LODWORD(ConditionSize) = LocalGetAceCondition(
                               v67,
                               Sid,
                               &ConditionStr,
                               &ConditionSize,
                               &v139,
                               RootDomainSid,
                               DomainSid,
                               tSidLookupDomOrRootDomRelativeTable,
                               v145);
    AceCondition = ConditionSize;
    if( (_DWORD)ConditionSize )
      goto LABEL_185;
    v73 = *((_DWORD *)v137 + v66);
    if( v73 == 2 )
    {
      wcscpy_s(v69, v68, (PWCHAR)L"0x");
      v69 += 2;
      v68 -= 2i64;
      ultow_s(Val, v69, v68, 16);
      v74 = -1i64;
      do
        ++v74;
      while( v69[v74] != (_WORD)tSidLookupDomOrRootDomRelativeTable );
LABEL_78:
      v69 += v74;
      v68 -= v74;
    }
    else if( v73 == 1 )
    {
      v93 = HIDWORD(LookupFlags);
      if( AceHeader->AceType == 17 )
        v93 = 4i64;
      v94 = LookupAccessMaskInTable(0i64, Val, v93);
      v95 = v94;
      if( v94 )
      {
        wcscpy_s(v69, v68, *(PWCHAR *)v94);
        v74 = (unsigned int)v95[2];
        goto LABEL_78;
      }
    }
    else
    {
      v116 = AceHeader;
      v117 = HIDWORD(LookupFlags);
      v118 = Val;
      do
      {
        if( (v118 & (1 << (char)tSidLookupDomOrRootDomRelativeTable)) != 0 )
        {
          v119 = v117;
          if( v116->AceType == 17 )
            v119 = 4i64;
          v120 = LookupAccessMaskInTable(0i64, v118 & (1 << (char)tSidLookupDomOrRootDomRelativeTable), v119);
          v121 = v120;
          if( v120 )
          {
            wcscpy_s(v69, v68, *(PWCHAR *)v120);
            v122 = (unsigned int)v121[2];
            v68 -= v122;
            v69 += v122;
          }
          v118 = Val;
        }
        LODWORD(tSidLookupDomOrRootDomRelativeTable) = (_DWORD)tSidLookupDomOrRootDomRelativeTable + 1;
      }
      while( (unsigned int)tSidLookupDomOrRootDomRelativeTable < 0x20 );
      AceCondition = ConditionSize;
      v70 = v141;
      v20 = v136;
    }
    if( !v68 )
      break;
    v75 = v68 - 1;
    *v69 = 59;
    v76 = v69 + 1;
    if( v70 )
    {
      if( !SddlpUuidToString(v70, &ConvertedGuidString) )
        goto LABEL_185;
      v123 = ConvertedGuidString;
      v124 = -1i64;
      do
        ++v124;
      while( ConvertedGuidString[v124] );
      wcscpy_s(v76, v75, ConvertedGuidString);
      v75 -= v124;
      v76 += v124;
      if( v123 )
        ExFreePoolWithTag(v123, 0);
    }
    if( v75 )
    {
      *v76 = 59;
      v77 = v75 - 1;
      v78 = v76 + 1;
      if( v20 )
      {
        v125 = SddlpUuidToString(v20, &ConvertedGuidString);
        v20 = 0i64;
        if( !v125 )
          goto LABEL_187;
        v126 = ConvertedGuidString;
        v127 = -1i64;
        do
          ++v127;
        while( ConvertedGuidString[v127] );
        wcscpy_s(v78, v77, ConvertedGuidString);
        v77 -= v127;
        v78 += v127;
        if( v126 )
          ExFreePoolWithTag(v126, 0);
      }
      v79 = P;
      if( !v77 )
      {
LABEL_183:
        AceCondition = 1336;
LABEL_98:
        v10 = DefaultToDomaina;
        v51 = AclString;
        goto LABEL_99;
      }
      v80 = (unsigned int)LookupFlags;
      v81 = v77 - 1;
      *v78 = 59;
      v82 = v78 + 1;
      v83 = (wchar_t *)v79[v80];
      wcscpy_s(v82, v81, v83);
      v84 = -1i64;
      do
        ++v84;
      while( v83[v84] != (_WORD)v20 );
      v85 = ConditionStr;
      v86 = &v82[v84];
      v87 = v81 - v84;
      if( ConditionStr )
      {
        if( !v87 )
          goto LABEL_183;
        v100 = v87 - 1;
        *v86 = 59;
        v101 = v86 + 1;
        wcscpy_s(v101, v100, v85);
        v102 = -1i64;
        do
          ++v102;
        while( v85[v102] != (_WORD)v20 );
        v86 = &v101[v102];
        v87 = v100 - v102;
      }
      if( v87 <= 1 )
        goto LABEL_183;
      v88 = AceHeader;
      *v86 = 41;
      v89 = v80 + 1;
      v52 = v86 + 1;
      LODWORD(LookupFlags) = v89;
      v53 = v87 - 1;
      *v52 = (unsigned __int16)v20;
      v54 = (_ACE_HEADER *)((char *)v88 + v88->AceSize);
      AceHeader = v54;
      if( v89 >= Acl->AceCount )
        goto LABEL_98;
      continue;
    }
    break;
  }
  AceCondition = 1336;
LABEL_185:
  v20 = 0i64;
LABEL_187:
  v10 = DefaultToDomaina;
LABEL_188:
  v51 = AclString;
LABEL_189:
  v79 = P;
LABEL_99:
  v96 = (unsigned int)v20;
  if( (unsigned __int16)v20 < Acl->AceCount )
  {
    v97 = v140;
    do
    {
      if( v97[v96] )
      {
        v99 = (void *)v79[v96];
        if( v99 )
          ExFreePoolWithTag(v99, 0);
      }
      ++v96;
    }
    while( v96 < Acl->AceCount );
    v20 = 0i64;
  }
  ExFreePoolWithTag(v79, 0);
  ExFreePoolWithTag(v140, 0);
  ExFreePoolWithTag(v137, 0);
  if( ConditionStr )
    ExFreePoolWithTag(ConditionStr, 0);
  if( AceCondition )
  {
    if( *v51 )
      ExFreePoolWithTag(*v51, 0);
    *v51 = (WCHAR *)v20;
    *(_DWORD *)AclStringSize = (_DWORD)v20;
  }
  else
  {
    *(_DWORD *)AclStringSize = v10;
  }
  return AceCondition;
}

Referenced by:

LocalConvertSDToStringSD_Rev1