AuthzBasepConvertRelativeToAbsoluteTokenAttribute
INT64 __fastcall AuthzBasepConvertRelativeToAbsoluteTokenAttribute(UINT64 *a1, UINT64 a2, INT64 a3, UINT64 *a4){
unsigned int v4;
UINT64 v5;
int v9;
__int64 v10;
unsigned int v11;
unsigned int v12;
__int64 v13;
unsigned __int16 v14;
int v15;
unsigned int v16;
UINT64 *v17;
__int64 v18;
unsigned int v19;
int v20;
unsigned int v21;
__int64 v22;
unsigned int v23;
int v24;
unsigned int v25;
UINT64 *v26;
unsigned int v27;
unsigned int v28;
INT64 v29;
unsigned __int16 v30;
unsigned int v31;
unsigned __int64 v32;
unsigned int v33;
unsigned int v34;
UINT8 *v35;
char *v36;
unsigned int v37;
unsigned int v38;
__int64 v39;
unsigned int v40;
unsigned __int64 v41;
unsigned int v42;
unsigned int v43;
UINT8 *v44;
UINT64 v45;
unsigned int v46;
unsigned int v47;
__int64 v48;
unsigned int v49;
unsigned __int64 v50;
__int64 v51;
UINT64 i;
size_t pcbLength;
v4 = 0;
v5 = (unsigned int)a2;
pcbLength = 0i64;
if( !a1 || !a3 || !a4 )
return(unsigned int)-1073741811;
if( (unsigned int)a2 < 0x14 )
return(unsigned int)-1073741705;
if( !*((_DWORD *)a1 + 3) )
return(unsigned int)-1073741705;
v10 = *(unsigned int *)a1;
if( (unsigned int)a2 < (unsigned int)v10 || (unsigned int)(a2 - v10) < 4 )
return(unsigned int)-1073741705;
v9 = RtlStringCbLengthW((const WCHAR *)((char *)a1 + v10), (unsigned int)(a2 - v10), &pcbLength);
if( v9 < 0 )
return(unsigned int)v9;
v11 = pcbLength + 2;
if( (int)pcbLength + 2 < (unsigned int)pcbLength )
return(unsigned int)-1073741675;
if( (int)pcbLength + 5 < (unsigned int)(pcbLength + 2) )
return(unsigned int)-1073741675;
v12 = ((pcbLength + 5) & 0xFFFFFFFC) + 40;
if( v12 < 0x28 )
return(unsigned int)-1073741675;
v13 = *((unsigned int *)a1 + 3);
if( (unsigned __int64)(4 * v13) > 0xFFFFFFFF )
return(unsigned int)-1073741675;
if( (int)v5 - 16 < (unsigned int)(4 * v13) )
return(unsigned int)-1073741705;
v14 = *((_WORD *)a1 + 2);
if( v14 )
{
if( v14 > 2u )
{
if( v14 == 3 )
{
v20 = 16 * v13;
if( (unsigned __int64)(16 * v13) > 0xFFFFFFFF || v20 + v12 < v12 )
return(unsigned int)-1073741675;
v12 += v20;
v21 = 0;
if( (_DWORD)v13 )
{
while( 1 )
{
v22 = *((unsigned int *)a1 + v21 + 4);
if( (unsigned int)v5 < (unsigned int)v22 || (unsigned int)(v5 - v22) < 2 )
return(unsigned int)-1073741705;
v9 = RtlStringCbLengthW((const WCHAR *)((char *)a1 + v22), (unsigned int)(v5 - v22), &pcbLength);
if( v9 < 0 )
return(unsigned int)v9;
if( (int)pcbLength + 2 < (unsigned int)pcbLength
|| (int)pcbLength + 5 < (unsigned int)(pcbLength + 2)
|| (((_DWORD)pcbLength + 5) & 0xFFFFFFFC) + v23 < v23 )
{
return(unsigned int)-1073741675;
}
++v21;
v12 = ((pcbLength + 5) & 0xFFFFFFFC) + v23;
if( v21 >= *((_DWORD *)a1 + 3) )
goto LABEL_51;
}
}
goto LABEL_51;
}
if( v14 == 5 )
goto LABEL_21;
if( v14 != 6 )
{
if( v14 != 16 )
goto LABEL_51;
LABEL_21:
v15 = 16 * v13;
if( (unsigned __int64)(16 * v13) > 0xFFFFFFFF || v15 + v12 < v12 )
return(unsigned int)-1073741675;
v12 += v15;
v16 = 0;
if( (_DWORD)v13 )
{
v17 = a1 + 2;
while( 1 )
{
v18 = *(unsigned int *)v17;
if( (unsigned int)v5 < (unsigned int)v18 || (unsigned int)(v5 - v18) < 4 )
return(unsigned int)-1073741705;
v19 = *(_DWORD *)((char *)a1 + v18);
if( (int)v18 + 4 < (unsigned int)v18 )
return(unsigned int)-1073741675;
if( (int)v5 - ((int)v18 + 4) < v19 )
return(unsigned int)-1073741705;
if( v19 + 3 < v19 || ((v19 + 3) & 0xFFFFFFFC) + v12 < v12 )
return(unsigned int)-1073741675;
++v16;
v17 = (UINT64 *)((char *)v17 + 4);
v12 += (v19 + 3) & 0xFFFFFFFC;
if( v16 >= (unsigned int)v13 )
goto LABEL_51;
}
}
goto LABEL_51;
}
}
v24 = 8 * v13;
if( (unsigned __int64)(8 * v13) > 0xFFFFFFFF || v24 + v12 < v12 )
return(unsigned int)-1073741675;
v12 += v24;
v25 = 0;
if( (_DWORD)v13 )
{
v26 = a1 + 2;
while( (unsigned int)v5 >= *(_DWORD *)v26 && (unsigned int)(v5 - *(_DWORD *)v26) >= 8 )
{
++v25;
v26 = (UINT64 *)((char *)v26 + 4);
if( v25 >= (unsigned int)v13 )
goto LABEL_51;
}
return(unsigned int)-1073741705;
}
}
LABEL_51:
v27 = *(_DWORD *)a4;
*(_DWORD *)a4 = v12;
if( v27 < v12 )
return(unsigned int)-1073741789;
memset(a3, 0i64);
*(_WORD *)(a3 + 16) = *((_WORD *)a1 + 2);
*(_WORD *)(a3 + 18) = *((_WORD *)a1 + 3);
*(_DWORD *)(a3 + 20) = *((_DWORD *)a1 + 2);
*(_DWORD *)(a3 + 24) = *((_DWORD *)a1 + 3);
if( v11 >= 0xFFFFFFD8 || v11 + 43 < v11 + 40 )
return(unsigned int)-1073741675;
v28 = (v11 + 43) & 0xFFFFFFFC;
memmove((UINT8 *)(a3 + 40), (UINT8 *)a1 + *(unsigned int *)a1, v11);
*(_QWORD *)(a3 + 8) = a3 + 40;
*(_WORD *)(a3 + 2) = v11;
*(_WORD *)a3 = v11 - 2;
v29 = a3 + v28;
v30 = *(_WORD *)(a3 + 16);
if( !v30 )
return(unsigned int)-1073741705;
if( v30 > 2u )
{
if( v30 == 3 )
{
v40 = *(_DWORD *)(a3 + 24);
v41 = 16i64 * v40;
if( v41 > 0xFFFFFFFF )
return(unsigned int)-1073741675;
v42 = v41 + v28;
if( (unsigned int)v41 + v28 < v28 )
return(unsigned int)-1073741675;
v43 = 0;
v44 = (UINT8 *)(a3 + v42);
*(_QWORD *)(a3 + 32) = v29;
if( !v40 )
return 0;
v45 = v5;
for( i = v5; ; v45 = i )
{
v9 = RtlStringCbLengthW((const WCHAR *)((char *)a1 + *((unsigned int *)a1 + v43 + 4)), v45, &pcbLength);
if( v9 < 0 )
break;
v46 = pcbLength + 2;
if( (int)pcbLength + 2 < (unsigned int)pcbLength )
return(unsigned int)-1073741675;
v47 = v46 + v42;
if( v46 + v42 < v42 || v47 + 3 < v47 )
return(unsigned int)-1073741675;
v42 = (v47 + 3) & 0xFFFFFFFC;
memmove(v44, (UINT8 *)a1 + *((unsigned int *)a1 + v43 + 4), v46);
v48 = 2i64 * v43++;
*(_QWORD *)(*(_QWORD *)(a3 + 32) + 8 * v48 + 8) = v44;
v44 = (UINT8 *)(a3 + v42);
*(_WORD *)(*(_QWORD *)(a3 + 32) + 8 * v48) = v46 - 2;
*(_WORD *)(*(_QWORD *)(a3 + 32) + 8 * v48 + 2) = v46;
if( v43 >= *(_DWORD *)(a3 + 24) )
return 0;
}
return(unsigned int)v9;
}
if( v30 == 5 )
{
LABEL_61:
v31 = *(_DWORD *)(a3 + 24);
v32 = 16i64 * v31;
if( v32 <= 0xFFFFFFFF )
{
v33 = v32 + v28;
if( (unsigned int)v32 + v28 >= v28 )
{
v34 = 0;
v35 = (UINT8 *)(a3 + v33);
*(_QWORD *)(a3 + 32) = v29;
if( v31 )
{
do
{
v36 = (char *)a1 + 4 * v34;
v37 = *(_DWORD *)((char *)a1 + *((unsigned int *)v36 + 4));
v38 = v33 + v37;
if( v33 + v37 < v33 || v38 + 3 < v38 )
return(unsigned int)-1073741675;
v39 = 2i64 * v34;
v33 = (v38 + 3) & 0xFFFFFFFC;
*(_QWORD *)(*(_QWORD *)(a3 + 32) + 16i64 * v34) = 0i64;
if( v37 )
{
memmove(v35, (UINT8 *)a1 + *((unsigned int *)v36 + 4) + 4, v37);
*(_QWORD *)(*(_QWORD *)(a3 + 32) + 16i64 * v34) = v35;
}
++v34;
v35 = (UINT8 *)(a3 + v33);
*(_DWORD *)(*(_QWORD *)(a3 + 32) + 8 * v39 + 8) = v37;
}
while( v34 < *(_DWORD *)(a3 + 24) );
}
return 0;
}
}
return(unsigned int)-1073741675;
}
if( v30 != 6 )
{
if( v30 == 16 )
goto LABEL_61;
return(unsigned int)-1073741705;
}
}
v49 = *(_DWORD *)(a3 + 24);
v50 = 8i64 * v49;
if( v50 > 0xFFFFFFFF || v28 + (unsigned int)v50 < v28 )
return(unsigned int)-1073741675;
*(_QWORD *)(a3 + 32) = v29;
v9 = 0;
if( v49 )
{
do
{
v51 = v4++;
*(_QWORD *)(*(_QWORD *)(a3 + 32) + 8 * v51) = *(UINT64 *)((char *)a1 + *((unsigned int *)a1 + v51 + 4));
}
while( v4 < *(_DWORD *)(a3 + 24) );
}
return(unsigned int)v9;
}Referenced by:
AuthzBasepInitializeResourceClaimsFromSacl