SymCryptParallelHashSetNextWork

CHAR __fastcall SymCryptParallelHashSetNextWork(INT64 *a1, UINT64 **a2){
  UINT64 *v2; 
  INT64 v4; 
  UINT64 *v6; 
  char v7; 
  __int64 v8; 
  UINT64 *v9; 
  UINT64 *v10; 
  __int64 v11; 
  UINT64 *v12; 
  UINT64 v13; 
  UINT64 *v14; 
  CHAR v16; 
  v2 = *a2;
  v4 = *a1;
  v16 = 0;
  while( 1 )
  {
    while( 1 )
    {
      v6 = a2[3];
      if( !*((_BYTE *)a2 + 8) )
        break;
      switch( *((_BYTE *)a2 + 8) )
      {
        case 1:
          v8 = *((unsigned __int8 *)a2 + 9);
          a2[4] = (UINT64 *)(v8 + v6[2]);
          v9 = (UINT64 *)(v6[3] - v8);
          a2[5] = v9;
          if( (unsigned __int64)v9 >= *(unsigned int *)(v4 + 40) )
          {
            *((_BYTE *)a2 + 8) = 2;
            return 1;
          }
          goto LABEL_11;
        case 2:
LABEL_11:
          v10 = a2[5];
          if( v10 )
          {
            memmove((UINT8 *)v2 + 32, (UINT8 *)a2[4], (UINT64)v10);
            *(_DWORD *)v2 = *((_DWORD *)a2 + 10);
          }
LABEL_8:
          a2[3] = (UINT64 *)v6[4];
          *((_BYTE *)a2 + 8) = 0;
          break;
        case 3:
          v7 = ((__int64(__fastcall *)(INT64 *, UINT64 *, UINT64 **, CHAR *))a1[3])(a1, v2, a2, &v16);
LABEL_25:
          if( v7 )
            return v16;
          break;
        case 4:
          ((void(__fastcall *)(INT64 *, UINT64 *, UINT64 *))a1[4])(a1, v2, a2[3]);
          goto LABEL_8;
      }
    }
    if( !v6 )
      return 0;
    v11 = *(unsigned int *)v2;
    if( *((_DWORD *)v6 + 2) != 1 )
    {
      v7 = ((__int64(__fastcall *)(INT64 *, UINT64 *, UINT64 **, CHAR *))a1[2])(a1, v2, a2, &v16);
      goto LABEL_25;
    }
    v2[2] += v6[3];
    if( v2[2] < v6[3] )
      ++v2[3];
    if( v11 )
    {
      v12 = v2 + 4;
      v13 = *(unsigned int *)(v4 + 40) - v11;
      if( v13 >= v6[3] )
        v13 = v6[3];
      memmove((UINT8 *)v12 + v11, (UINT8 *)v6[2], v13);
      *(_DWORD *)v2 += v13;
      if( *(_DWORD *)v2 == *(_DWORD *)(v4 + 40) )
      {
        a2[4] = v12;
        a2[5] = (UINT64 *)*(unsigned int *)(v4 + 40);
        if( v13 == v6[3] )
        {
          a2[3] = (UINT64 *)v6[4];
        }
        else
        {
          *((_BYTE *)a2 + 8) = 1;
          *((_BYTE *)a2 + 9) = v13;
        }
        *(_DWORD *)v2 = 0;
        return 1;
      }
      a2[3] = (UINT64 *)v6[4];
    }
    else
    {
      a2[4] = (UINT64 *)v6[2];
      v14 = (UINT64 *)v6[3];
      a2[5] = v14;
      *((_BYTE *)a2 + 8) = 2;
      if( (unsigned __int64)v14 >= *(unsigned int *)(v4 + 40) )
        return 1;
    }
  }
}

Referenced by:

SymCryptParallelHashProcess