RtlDecompressBufferXpressHuffProgress

__int64 __fastcall RtlDecompressBufferXpressHuffProgress(
        _DWORD *a1,
        unsigned int a2,
        unsigned __int8 *a3,
        int a4,
        _DWORD *a5,
        __int64 a6,
        __int64 a7,
        __int64 a8){
  unsigned int v8; 
  unsigned __int8 *v9; 
  char *v10; 
  char *v12; 
  __m128i *v13; 
  unsigned __int8 *v14; 
  char *v15; 
  __int64 v16; 
  char *v17; 
  unsigned __int16 *v18; 
  int v19; 
  int v20; 
  unsigned int v21; 
  UINT64 v22; 
  UINT64 XpressCallback; 
  __int16 v24; 
  int v25; 
  __int64 v26; 
  __int16 v27; 
  int v28; 
  int v29; 
  unsigned __int64 v30; 
  unsigned __int64 v31; 
  unsigned __int64 v32; 
  unsigned __int64 v33; 
  unsigned __int64 v34; 
  int v35; 
  char *v36; 
  unsigned __int64 v37; 
  char v38; 
  __int64 v39; 
  _DWORD *v40; 
  char *v41; 
  unsigned __int64 v42; 
  __int16 v43; 
  int v44; 
  __int64 v45; 
  int v46; 
  int v47; 
  unsigned __int64 v48; 
  unsigned __int64 v49; 
  unsigned __int64 v50; 
  int v51; 
  char *v52; 
  unsigned __int64 v53; 
  __m128i *v54; 
  char *v55; 
  INT64 v56[2]; 
  unsigned int v57; 
  int v58; 
  unsigned __int64 v60; 
  unsigned int v61; 
  v8 = 4096;
  v61 = 4096;
  v9 = a3;
  v58 = 0;
  LODWORD(v10) = (_DWORD)a1;
  if( !a6 )
    return 3221225704i64;
  v12 = (char *)a1;
  v13 = (__m128i *)((a6 + 7) & 0xFFFFFFFFFFFFFFF8ui64);
  v14 = &a3[a4];
  v15 = (char *)a1 + a2;
  v54 = v13;
  v60 = (unsigned __int64)v15;
  if( !a7 || a2 < 0x1000 )
  {
    v8 = a2;
    v61 = a2;
  }
  v56[0] = a7;
  v56[1] = a8;
  v57 = v8;
LABEL_7:
  if( v14 - v9 < 260 )
  {
    if( v12 != v15 )
      return 3221226050i64;
    goto LABEL_106;
  }
  if( (unsigned int)XpressBuildHuffmanDecodingTable(v13, (INT64)v9) )
    return 3221226050i64;
  v15 = (char *)v60;
  v16 = 16i64;
  v17 = (char *)v60;
  v18 = (unsigned __int16 *)(v9 + 256);
  v19 = v18[1];
  v20 = *v18;
  v9 = (unsigned __int8 *)(v18 + 2);
  v21 = v19 + (v20 << 16);
  if( (unsigned __int64)(v12 + 0x10000) <= v60 )
    v17 = v12 + 0x10000;
  v55 = v17;
  v22 = (UINT64)(v17 - 188);
  if( v12 >= v17 - 188 )
    goto LABEL_66;
  XpressCallback = (UINT64)&v12[v8];
  if( v22 < XpressCallback )
    XpressCallback = (UINT64)(v17 - 188);
  while( 1 )
  {
    v24 = v13[66].m128i_i16[(unsigned __int64)v21 >> 22];
    if( v24 > 0 )
    {
      v26 = v24 & 0xF;
      v21 <<= v26;
      v16 -= v26;
    }
    else
    {
      v21 <<= 10;
      v16 -= 10i64;
      do
      {
        --v16;
        v25 = (unsigned __int64)v21 >> 31;
        v21 *= 2;
        v24 = v13[194].m128i_i16[(__int16)(v25 - v24)];
      }
      while( v24 <= 0 );
    }
    v27 = (v24 >> 4) - 256;
    if( v16 < 0 )
      break;
LABEL_27:
    if( v27 >= 0 )
    {
      v15 = (char *)v60;
      if( !v27 && v9 >= v14 && v12 == (char *)v60 )
      {
        LODWORD(v10) = (_DWORD)a1;
        goto LABEL_106;
      }
      v29 = v27 / 16;
      v30 = v27 % 16;
      if( v30 == 15 )
      {
        if( v9 >= v14 )
          return 3221226050i64;
        v31 = *v9++;
        if( v31 == 255 )
        {
          if( v9 + 1 >= v14 )
            return 3221226050i64;
          v32 = *(unsigned __int16 *)v9;
          v9 += 2;
          if( !v32 )
          {
            if( v9 + 3 >= v14 )
              return 3221226050i64;
            v32 = *(unsigned int *)v9;
            v9 += 4;
          }
          if( v32 < 0xF || &v12[v32 + 3] < v12 )
            return 3221226050i64;
          v31 = v32 - 15;
        }
        v30 = v31 + 15;
      }
      v33 = v30 + 3;
      v34 = (1i64 << v29) + ((unsigned __int64)v21 >> (31 - (unsigned __int8)v29) >> 1);
      v21 <<= v29;
      v16 -= v29;
      if( v16 < 0 )
      {
        if( (unsigned __int64)v12 >= v22 )
        {
          v10 = (char *)a1;
          goto LABEL_97;
        }
        if( v9 + 1 >= v14 )
          return 3221226050i64;
        v35 = *(unsigned __int16 *)v9;
        v9 += 2;
        v21 += v35 << -(char)v16;
        v16 += 16i64;
      }
      v36 = &v12[-v34];
      if( &v12[-v34] < (char *)a1 )
        return 3221226050i64;
      if( v34 < 4 )
      {
        *v12 = *v36;
        v37 = v34 - 1;
        if( v37 )
        {
          v12[1] = v36[1];
          if( v37 != 1 )
          {
            v38 = v36[2];
            goto LABEL_54;
          }
          v12 += 2;
          v39 = -2i64;
        }
        else
        {
          v12[1] = *v36;
          v38 = *v36;
LABEL_54:
          v12[2] = v38;
          v39 = -3i64;
          v12 += 3;
        }
        v33 += v39;
        if( !v33 )
          goto LABEL_15;
      }
      *(_DWORD *)v12 = *(_DWORD *)v36;
      *((_DWORD *)v12 + 1) = *((_DWORD *)v36 + 1);
      if( v33 >= 9 )
      {
        v12 += 8;
        v40 = v36 + 8;
        for( v33 -= 8i64; ; v33 -= 16i64 )
        {
          if( (unsigned __int64)v12 >= XpressCallback )
          {
            if( (unsigned __int64)v12 >= v22 )
            {
              v15 = (char *)v60;
              v41 = &v12[v33];
              if( (unsigned __int64)&v12[v33] <= v60 )
              {
                v42 = v33;
                v13 = v54;
                qmemcpy(v12, v40, v42);
                v17 = v55;
                v12 = v41;
LABEL_66:
                v10 = (char *)a1;
                goto LABEL_67;
              }
              return 3221226050i64;
            }
            XpressCallback = RtlpMakeXpressCallback((INT64)v56, v22, (INT64)v12);
          }
          *(_DWORD *)v12 = *v40;
          *((_DWORD *)v12 + 1) = v40[1];
          *((_DWORD *)v12 + 2) = v40[2];
          *((_DWORD *)v12 + 3) = v40[3];
          if( v33 < 0x11 )
            break;
          v12 += 16;
          v40 += 4;
        }
      }
      v12 += v33;
LABEL_15:
      v13 = v54;
    }
    else
    {
      *v12++ = v27;
    }
  }
  if( (unsigned __int64)v12 < XpressCallback )
  {
LABEL_25:
    if( v9 + 1 >= v14 )
      return 3221226050i64;
    v28 = *(unsigned __int16 *)v9;
    v9 += 2;
    v21 += v28 << -(char)v16;
    v16 += 16i64;
    goto LABEL_27;
  }
  if( (unsigned __int64)v12 < v22 )
  {
    XpressCallback = RtlpMakeXpressCallback((INT64)v56, v22, (INT64)v12);
    goto LABEL_25;
  }
  v15 = (char *)v60;
  v10 = (char *)a1;
LABEL_76:
  if( v9 + 1 >= v14 )
    return 3221226050i64;
  v46 = *(unsigned __int16 *)v9;
  v9 += 2;
  v17 = v55;
  v21 += v46 << -(char)v16;
  v16 += 16i64;
  while( v27 < 0 )
  {
    *v12++ = v27;
LABEL_67:
    if( v12 >= v17 )
    {
      v8 = v61;
      goto LABEL_7;
    }
    v43 = v13[66].m128i_i16[(unsigned __int64)v21 >> 22];
    if( v43 > 0 )
    {
      v45 = v43 & 0xF;
      v21 <<= v45;
      v16 -= v45;
      v17 = v55;
    }
    else
    {
      v21 <<= 10;
      v16 -= 10i64;
      do
      {
        --v16;
        v44 = (unsigned __int64)v21 >> 31;
        v21 *= 2;
        v43 = v13[194].m128i_i16[(__int16)(v44 - v43)];
      }
      while( v43 <= 0 );
    }
    v27 = (v43 >> 4) - 256;
    if( v16 < 0 )
      goto LABEL_76;
  }
  if( !v27 && v9 >= v14 && v12 == v15 )
  {
LABEL_106:
    *a5 = (_DWORD)v12 - (_DWORD)v10;
    return 0i64;
  }
  v47 = v27 / 16;
  v48 = v27 % 16;
  if( v48 != 15 )
    goto LABEL_94;
  if( v9 >= v14 )
    return 3221226050i64;
  v49 = *v9++;
  if( v49 != 255 )
  {
LABEL_93:
    v48 = v49 + 15;
LABEL_94:
    v33 = v48 + 3;
    v34 = (1i64 << v47) + ((unsigned __int64)v21 >> (31 - (unsigned __int8)v47) >> 1);
    v21 <<= v47;
    v16 -= v47;
    if( v16 < 0 )
    {
LABEL_97:
      if( v9 + 1 >= v14 )
        return 3221226050i64;
      v51 = *(unsigned __int16 *)v9;
      v9 += 2;
      v21 += v51 << -(char)v16;
      v16 += 16i64;
    }
    if( &v12[-v34] < v10 )
      return 3221226050i64;
    v52 = &v12[v33];
    if( &v12[v33] > v15 )
      return 3221226050i64;
    v53 = v33;
    v13 = v54;
    qmemcpy(v12, &v12[-v34], v53);
    v17 = v55;
    v12 = v52;
    goto LABEL_67;
  }
  if( v9 + 1 >= v14 )
    return 3221226050i64;
  v50 = *(unsigned __int16 *)v9;
  v9 += 2;
  if( !v50 )
  {
    if( v9 + 3 >= v14 )
      return 3221226050i64;
    v50 = *(unsigned int *)v9;
    v9 += 4;
  }
  if( v50 >= 0xF && &v12[v50 + 3] >= v12 )
  {
    v49 = v50 - 15;
    goto LABEL_93;
  }
  return 3221226050i64;
}

Referenced by:

RtlDecompressBufferProgress