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