SymCryptParallelHashProcess
VOID __fastcall SymCryptParallelHashProcess(
INT64 a1,
INT64 a2,
UINT64 a3,
UINT64 a4,
INT64 a5,
INT64 a6,
INT64 a7,
UINT64 a8){
unsigned __int64 v12;
WCHAR *v13;
CHAR v14;
size_t v15;
UINT64 i;
__int64 v17;
_QWORD *v18;
int v19;
__int64 v20;
size_t v21;
char v22;
UINT64 *v23;
UINT64 ***v24;
UINT64 ***v25;
char v26;
unsigned __int64 v27;
WCHAR *v28;
unsigned __int64 v29;
unsigned __int64 v30;
unsigned __int64 v31;
unsigned __int64 j;
__int64 v33;
__int64 v34;
PVOID pbData;
SIZE_T cbData;
INT64 v38;
if( a5 )
{
v38 = *(_QWORD *)a1;
cbData = *(unsigned int *)(a1 + 8);
v12 = (a6 + 15) & 0xFFFFFFFFFFFFFFF0ui64;
v13 = (WCHAR *)(48 * a3 + v12);
pbData = (PVOID)(((unsigned __int64)&v13[4 * a3 + 15] + 1) & 0xFFFFFFFFFFFFFFE0ui64);
if( (unsigned __int64)pbData + cbData > a6 + a7 )
SymCryptFatal((_BYTE *)0x7073322E, cbData + (_BYTE)pbData);
memset((a6 + 15) & 0xFFFFFFFFFFFFFFF0ui64, 0i64);
v15 = 0i64;
for( i = a4 + 40 * a5; i > a4; v18[3] = i )
{
i -= 40i64;
v17 = *(_QWORD *)i;
if( *(_QWORD *)i >= a3 )
SymCryptFatal((_BYTE *)0x70733278, v14);
v14 = v38;
v18 = (_QWORD *)(v12 + 48 * v17);
if( !*v18 )
{
*v18 = a2 + v17 * *(unsigned int *)(v38 + 32);
*(_QWORD *)&v13[4 * v15++] = v18;
}
v19 = *(_DWORD *)(i + 8);
if( v19 == 1 )
{
v20 = *(_QWORD *)(i + 24);
}
else
{
if( v19 != 2 )
SymCryptFatal((_BYTE *)0x70733279, v38);
v20 = *(unsigned int *)(v38 + 40);
}
v18[2] += v20;
*(_QWORD *)(i + 32) = v18[3];
}
v21 = 0i64;
v22 = 1;
v23 = *(UINT64 **)(*(_QWORD *)v13 + 16i64);
if( v15 )
{
v24 = (UINT64 ***)&v13[4 * v15 - 4];
do
{
v25 = (UINT64 ***)&v13[4 * v21];
if( SymCryptParallelHashSetNextWork((INT64 *)a1, *v25) )
{
v26 = 0;
++v21;
if( (*v25)[2] == v23 )
v26 = v22;
v22 = v26;
}
else
{
--v15;
*v25 = *v24--;
}
}
while( v21 < v15 );
if( !v22 )
qsort(v13, v15, (const WCHAR *)8, compareRequestSize);
}
v27 = (unsigned int)a8;
if( v15 < (unsigned int)a8 )
v27 = v15;
v28 = &v13[4 * v27];
while( v15 )
{
v29 = 1i64;
v30 = *(_QWORD *)(*(_QWORD *)v13 + 40i64);
while( v29 < v27 )
{
v31 = v30;
v30 = *(_QWORD *)(*(_QWORD *)&v13[4 * v29] + 40i64);
if( v31 < v30 )
v30 = v31;
++v29;
}
(*(void(__fastcall **)(WCHAR *, unsigned __int64, _QWORD, PVOID, SIZE_T))(a1 + 40))(
v13,
v27,
(unsigned int)v30 & -*(_DWORD *)(v38 + 40),
pbData,
cbData);
for( j = 0i64; j < v27; ++j )
{
v33 = *(_QWORD *)&v13[4 * j];
if( *(_QWORD *)(v33 + 40) < (unsigned __int64)*(unsigned int *)(v38 + 40)
&& !SymCryptParallelHashSetNextWork((INT64 *)a1, (UINT64 **)v33) )
{
if( v15 <= v27 )
{
--v27;
*(_QWORD *)&v13[4 * j--] = *(_QWORD *)&v13[4 * v27];
}
else
{
v34 = *(_QWORD *)v28;
v28 += 4;
*(_QWORD *)&v13[4 * j] = v34;
}
--v15;
}
}
}
SymCryptWipe(pbData, cbData);
}
}Referenced by:
SymCryptParallelSha256Process