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