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