SymCryptParallelHashProcess
VOID __stdcall SymCryptParallelHashProcess(
INT64 a1,
INT64 a2,
UINT64 a3,
UINT64 a4,
INT64 a5,
INT64 a6,
INT64 a7,
UINT64 a8){
unsigned __int64 v12;
UINT64 v13;
UINT64 v14;
UINT64 i;
__int64 v16;
_QWORD *v17;
int v18;
__int64 v19;
UINT64 v20;
char v21;
UINT64 *v22;
UINT64 ***v23;
UINT64 ***v24;
char v25;
unsigned __int64 v26;
__int64 *v27;
unsigned __int64 v28;
unsigned __int64 v29;
unsigned __int64 v30;
unsigned __int64 j;
__int64 v32;
__int64 v33;
INT64 *v34;
UINT64 v35;
VOID *pbData;
__int64 cbData;
INT64 v39;
if( a5 )
{
v39 = *(_QWORD *)a1;
cbData = *(unsigned int *)(a1 + 8);
v12 = (a6 + 15) & 0xFFFFFFFFFFFFFFF0ui64;
v13 = 48 * a3 + v12;
pbData = (VOID *)((v13 + 8 * a3 + 31) & 0xFFFFFFFFFFFFFFE0ui64);
if( (unsigned __int64)pbData + cbData > a6 + a7 )
SymCryptFatal(0x7073322Eu);
memset((VOID *)((a6 + 15) & 0xFFFFFFFFFFFFFFF0ui64), 0i64, 48 * a3);
v14 = 0i64;
for( i = a4 + 40 * a5; i > a4; v17[3] = i )
{
i -= 40i64;
v16 = *(_QWORD *)i;
if( *(_QWORD *)i >= a3 )
SymCryptFatal(0x70733278u);
v17 = (_QWORD *)(v12 + 48 * v16);
if( !*v17 )
{
*v17 = a2 + v16 * *(unsigned int *)(v39 + 32);
*(_QWORD *)(v13 + 8 * v14++) = v17;
}
v18 = *(_DWORD *)(i + 8);
if( v18 == 1 )
{
v19 = *(_QWORD *)(i + 24);
}
else
{
if( v18 != 2 )
SymCryptFatal(0x70733279u);
v19 = *(unsigned int *)(v39 + 40);
}
v17[2] += v19;
*(_QWORD *)(i + 32) = v17[3];
}
v20 = 0i64;
v21 = 1;
v22 = *(UINT64 **)(*(_QWORD *)v13 + 16i64);
if( v14 )
{
v23 = (UINT64 ***)(v13 - 8 + 8 * v14);
do
{
v24 = (UINT64 ***)(v13 + 8 * v20);
if( SymCryptParallelHashSetNextWork((INT64 *)a1, *v24) )
{
v25 = 0;
++v20;
if( (*v24)[2] == v22 )
v25 = v21;
v21 = v25;
}
else
{
--v14;
*v24 = *v23--;
}
}
while( v20 < v14 );
if( !v21 )
qsort(v13, v14, 8ui64, (INT64)compareRequestSize, v34, v35, (UINT64)pbData);
}
v26 = (unsigned int)a8;
if( v14 < (unsigned int)a8 )
v26 = v14;
v27 = (__int64 *)(v13 + 8 * v26);
while( v14 )
{
v28 = 1i64;
v29 = *(_QWORD *)(*(_QWORD *)v13 + 40i64);
while( v28 < v26 )
{
v30 = v29;
v29 = *(_QWORD *)(*(_QWORD *)(v13 + 8 * v28) + 40i64);
if( v30 < v29 )
v29 = v30;
++v28;
}
(*(void(__fastcall **)(UINT64, unsigned __int64, _QWORD, VOID *, __int64))(a1 + 40))(
v13,
v26,
(unsigned int)v29 & -*(_DWORD *)(v39 + 40),
pbData,
cbData);
for( j = 0i64; j < v26; ++j )
{
v32 = *(_QWORD *)(v13 + 8 * j);
if( *(_QWORD *)(v32 + 40) < (unsigned __int64)*(unsigned int *)(v39 + 40)
&& !SymCryptParallelHashSetNextWork((INT64 *)a1, (UINT64 **)v32) )
{
if( v14 <= v26 )
{
--v26;
*(_QWORD *)(v13 + 8 * j--) = *(_QWORD *)(v13 + 8 * v26);
}
else
{
v33 = *v27++;
*(_QWORD *)(v13 + 8 * j) = v33;
}
--v14;
}
}
}
SymCryptWipe(pbData, cbData);
}
}Referenced by:
SymCryptParallelSha256Process