sub_1403EA328
unsigned __int64 __fastcall sub_1403EA328(__int64 a1, int *a2, __int64 a3){
unsigned __int64 result;
__int64 v6;
int v7;
unsigned __int64 v8;
unsigned __int64 j;
_QWORD *v10;
__int64 v11;
_QWORD *v12;
char *v13;
int v14;
__int64 v15;
unsigned int v16;
unsigned __int64 i;
__int64 v18;
unsigned __int64 v19;
_QWORD *v20;
__int64 v21;
__int64 v22;
int v23;
unsigned int v24;
unsigned __int64 v25;
__int64 v26;
unsigned int v27;
int v28;
unsigned __int64 v29;
__int64 v30;
__int64 v31;
__int64 CurrentIrql;
unsigned __int64 v33;
unsigned __int64 v34;
int v35;
__int64 v36;
__int64 v37;
unsigned int v38;
unsigned __int64 *v39;
char *v40;
__int64 v41;
__int64 v42;
__int64 v43;
int v44;
__int64 v45;
unsigned __int64 v46;
unsigned __int64 v47;
unsigned __int64 v48;
__int64 v49;
char v50[72];
unsigned __int64 v51;
unsigned __int8 v52;
unsigned __int8 v53;
__int64 v54;
__int64 v55;
result = (unsigned int)a2[10];
LOBYTE(a3) = 4;
if( (result & 2) == 0 )
{
LABEL_14:
result = (unsigned int)a2[10];
if( (result & 4) != 0 )
return result;
v10 = (_QWORD *)*((_QWORD *)a2 + 1);
v11 = (unsigned int)a2[4];
v12 = v10;
*(_DWORD *)(a1 + 2088) += v11;
v13 = (char *)v10;
v14 = *(_DWORD *)(a1 + 2068);
v15 = *(_QWORD *)(a1 + 2072);
if( v10 < (_QWORD *)((char *)v10 + v11) )
{
do
{
_mm_prefetchnta(v13);
v13 += 64;
}
while( v13 < (char *)v10 + v11 );
}
v16 = (unsigned int)v11 >> 7;
for( i = *(_QWORD *)(a1 + 2072); v16; --v16 )
{
v18 = 8i64;
do
{
v19 = *v12 ^ i;
v20 = v12 + 1;
v21 = *v20 ^ __ROL8__(v19, v14);
v12 = v20 + 1;
i = __ROL8__(v21, v14);
--v18;
}
while( v18 );
v22 = __ROL8__(v15 ^ ((char *)v12 - (char *)v10), 17);
LOBYTE(v22) = v14 ^ (((v22 ^ v15 ^ (unsigned __int64)((char *)v12 - (char *)v10))
* (unsigned __int128)0x7010008004002001ui64) >> 64) ^ v22 ^ v15 ^ ((_BYTE)v12 - (_BYTE)v10);
LOBYTE(v14) = 1;
v23 = v22 & 0x3F;
if( v23 )
LOBYTE(v14) = v23;
}
v24 = v11 & 0x7F;
if( v24 >= 8 )
{
v25 = (unsigned __int64)v24 >> 3;
do
{
i = __ROL8__(*v12++ ^ i, v14);
v24 -= 8;
--v25;
}
while( v25 );
}
for( ; v24; --v24 )
{
v26 = *(unsigned __int8 *)v12;
v12 = (_QWORD *)((char *)v12 + 1);
i = __ROL8__(v26 ^ i, v14);
}
for( result = i; ; LODWORD(i) = result ^ i )
{
result >>= 31;
if( !result )
break;
}
v27 = i & 0x7FFFFFFF;
v28 = 0;
v29 = 0xB3B74BDEE4453415ui64;
if( v27 != a2[5] )
{
if( !*a2 && a2[6] )
v28 = 1;
v30 = (unsigned int)a2[4];
v31 = *((_QWORD *)a2 + 1);
if( a2[4] && (*(_DWORD *)(a1 + 2452) & 0x40) != 0 )
{
CurrentIrql = KeGetCurrentIrql();
v53 = CurrentIrql;
__writecr8(2ui64);
v33 = (unsigned __int8)CurrentIrql;
v34 = v31 & 0xFFFFFFFFFFFFF000ui64;
v55 = (v31 + v30 - 1) | 0xFFF;
v51 = (v31 & 0xFFFFFFFFFFFFF000ui64) - 1;
while( 1 )
{
while( 1 )
{
v35 = (*(__int64(__fastcall **)(unsigned __int64, _QWORD, __int64, unsigned __int64))(a1 + 1128))(
v34,
0i64,
CurrentIrql,
v29);
if( v35 == -1073741267 )
break;
if( v35 < 0 )
{
LABEL_45:
__writecr8(v33);
goto LABEL_46;
}
LABEL_43:
v34 += 4096i64;
result = v51 + 4096;
v51 = result;
if( result == v55 )
{
__writecr8(v33);
goto LABEL_50;
}
}
if( v28 )
goto LABEL_45;
if( v53 > 1u )
goto LABEL_43;
__writecr8(v33);
KeGetCurrentIrql();
__writecr8(2ui64);
}
}
LABEL_46:
result = *(unsigned int *)(a1 + 2296);
if( !(_DWORD)result )
{
*(_QWORD *)(*(_QWORD *)(a1 + 1424) + 24i64) = v27 ^ (unsigned __int64)(unsigned int)a2[5];
result = *(unsigned int *)(a1 + 2296);
}
v36 = *((_QWORD *)a2 + 1);
if( !(_DWORD)result )
{
*(_QWORD *)(a1 + 2304) = a1 - 0x5C5FC0A76E374B18i64;
*(_QWORD *)(a1 + 2312) = (char *)a2 - 0x4C48B4211BBACBEBi64;
*(_QWORD *)(a1 + 2320) = *a2;
*(_QWORD *)(a1 + 2328) = v36;
*(_DWORD *)(a1 + 2296) = 1;
result = __b8(a1, 0i64);
}
}
LABEL_50:
v37 = (unsigned int)a2[4];
if( !(_DWORD)v37 )
return result;
sub_1403E92DC(a1, *((_QWORD *)a2 + 1), v37, (__int64)v50);
v38 = 16;
v39 = (unsigned __int64 *)(a2 + 6);
v40 = v50;
do
{
v41 = *(_QWORD *)v40;
v40 += 8;
result = *v39++;
if( v41 != result )
goto LABEL_58;
v38 -= 8;
}
while( v38 >= 8 );
if( v38 )
{
while( 1 )
{
v42 = (unsigned __int8)*v40++;
result = *(unsigned __int8 *)v39;
v39 = (unsigned __int64 *)((char *)v39 + 1);
if( v42 != result )
break;
if( !--v38 )
goto LABEL_70;
}
LABEL_58:
v43 = *((_QWORD *)a2 + 1);
v44 = a2[10] & 1;
result = *(unsigned int *)(a1 + 2452);
if( (result & 0x40) != 0 )
{
v45 = KeGetCurrentIrql();
v52 = v45;
__writecr8(2ui64);
v46 = (unsigned __int8)v45;
v47 = v43 & 0xFFFFFFFFFFFFF000ui64;
v54 = (v37 + v43 - 1) | 0xFFF;
v48 = (v43 & 0xFFFFFFFFFFFFF000ui64) - 1;
while( 1 )
{
while( 1 )
{
result = (*(__int64(__fastcall **)(unsigned __int64, _QWORD, __int64, unsigned __int64 *))(a1 + 1128))(
v47,
0i64,
v45,
v39);
if( (_DWORD)result == -1073741267 )
break;
if( (result & 0x80000000) != 0i64 )
{
LABEL_67:
__writecr8(v46);
goto LABEL_68;
}
LABEL_65:
result = 4096i64;
v47 += 4096i64;
v48 += 4096i64;
if( v48 == v54 )
{
__writecr8(v46);
goto LABEL_70;
}
}
if( v44 )
goto LABEL_67;
if( v52 > 1u )
goto LABEL_65;
__writecr8(v46);
KeGetCurrentIrql();
__writecr8(2ui64);
}
}
LABEL_68:
v49 = *((_QWORD *)a2 + 1);
if( !*(_DWORD *)(a1 + 2296) )
{
*(_QWORD *)(a1 + 2304) = a1 - 0x5C5FC0A76E374B18i64;
*(_QWORD *)(a1 + 2312) = (char *)a2 - 0x4C48B4211BBACBEBi64;
*(_QWORD *)(a1 + 2320) = *a2;
*(_QWORD *)(a1 + 2328) = v49;
*(_DWORD *)(a1 + 2296) = 1;
result = __b8(a1, 0i64);
}
}
LABEL_70:
*(_DWORD *)(a1 + 2088) += 16 * v37;
return result;
}
if( !*(_QWORD *)(a1 + 2432) )
goto LABEL_13;
v6 = *(unsigned int *)(a1 + 2452);
v7 = *(_DWORD *)(a1 + 2452);
if( !*(_DWORD *)(a1 + 2084) )
{
v7 = v6 ^ ((unsigned __int8)v6 ^ (unsigned __int8)(8 * v7)) & 0x20;
*(_DWORD *)(a1 + 2452) = v7;
goto LABEL_6;
}
result = (unsigned int)v6 ^ ((unsigned int)v6 >> 3);
if( (((unsigned __int8)v6 ^ (unsigned __int8)((unsigned int)v6 >> 3)) & 4) != 0 )
{
LABEL_13:
*(_DWORD *)(a1 + 2084) = 0;
return result;
}
LABEL_6:
if( (v7 & 4) == 0 )
goto LABEL_14;
v8 = *((_QWORD *)a2 + 1) & 0xFFFFFFFFFFFFF000ui64;
for( j = ((a2[2] & 0xFFF) + (unsigned __int64)(unsigned int)a2[4] + 4095) >> 12; j; v8 += 4096i64 )
{
--j;
result = (*(__int64(__fastcall **)(unsigned __int64, __int64, __int64))(a1 + 688))(v8, v6, a3);
if( (_BYTE)result )
{
if( !*(_DWORD *)(a1 + 2296) )
{
*(_QWORD *)(a1 + 2304) = a1 - 0x5C5FC0A76E374B18i64;
*(_QWORD *)(a1 + 2312) = (char *)a2 - 0x4C48B4211BBACBEBi64;
*(_QWORD *)(a1 + 2320) = *a2;
*(_QWORD *)(a1 + 2328) = v8;
*(_DWORD *)(a1 + 2296) = 1;
result = __b8(a1, 0i64);
}
}
*(_DWORD *)(a1 + 2088) += 256;
}
return result;
}Referenced by:
sub_1403DCCA0