RtlDecompressBufferXpressLzProgress

__int64 __fastcall RtlDecompressBufferXpressLzProgress(
        _BYTE *a1,
        unsigned int a2,
        _BYTE *a3,
        unsigned int a4,
        _DWORD *a5,
        __int64 a6,
        __int64 a7){
  _BYTE *v7; 
  _BYTE *v8; 
  unsigned int v9; 
  _BYTE *v10; 
  _BYTE *v11; 
  _BYTE *v12; 
  unsigned __int64 v13; 
  UINT64 v14; 
  _BYTE *v15; 
  _BYTE *v16; 
  int v17; 
  _BYTE *v18; 
  UINT64 XpressCallback; 
  int v20; 
  bool v21; 
  unsigned __int64 v22; 
  char v23; 
  unsigned __int64 v24; 
  unsigned __int64 v25; 
  unsigned __int64 v26; 
  unsigned __int64 v27; 
  unsigned __int64 v28; 
  signed __int64 v29; 
  _BYTE *v30; 
  unsigned __int64 v31; 
  char v32; 
  __int64 v33; 
  _DWORD *v34; 
  UINT64 v35; 
  UINT64 v36; 
  unsigned __int64 v37; 
  char v38; 
  unsigned __int64 v39; 
  unsigned __int64 v40; 
  unsigned __int64 v41; 
  unsigned __int64 v42; 
  _BYTE *v43; 
  unsigned __int64 v44; 
  char v45; 
  __int64 v46; 
  UINT64 v47; 
  int v48; 
  unsigned __int64 v49; 
  __int16 v51; 
  unsigned __int64 v52; 
  char v53; 
  __int64 v54; 
  unsigned __int64 v55; 
  unsigned __int64 v56; 
  unsigned __int64 v57; 
  unsigned __int64 v58; 
  unsigned __int64 v59; 
  _BYTE *v60; 
  _BYTE *v61; 
  INT64 v62[2]; 
  unsigned int v63; 
  int v64; 
  v64 = 0;
  v7 = a3;
  v8 = a1;
  v9 = 4096;
  if( a4 < 5 )
    return 3221226050i64;
  v10 = a1;
  v11 = &a3[a4];
  v12 = &a1[a2];
  v60 = v12;
  v13 = (unsigned __int64)(v11 - 86);
  v14 = (UINT64)(v12 - 352);
  v61 = v12 - 352;
  if( !a6 || a2 < 0x1000 )
    v9 = a2;
  v15 = &a1[v9];
  v62[0] = a6;
  v62[1] = a7;
  v63 = v9;
  if( v14 < (unsigned __int64)v15 )
    v15 = v12 - 352;
  v16 = 0i64;
LABEL_8:
  v17 = *(_DWORD *)v7;
  v18 = v7;
  v7 += 4;
  if( (unsigned __int64)v7 < v13 )
  {
    if( v10 >= v15 )
    {
      if( (unsigned __int64)v10 >= v14 )
      {
LABEL_123:
        v49 = (unsigned __int64)v60;
        goto LABEL_124;
      }
      XpressCallback = RtlpMakeXpressCallback((INT64)v62, v14, (INT64)v10);
      v14 = (UINT64)v61;
      v15 = (_BYTE *)XpressCallback;
      v8 = a1;
    }
    v20 = 2 * v17 + 1;
    if( v17 >= 0 )
    {
      while( 1 )
      {
        if( v20 < 0 )
        {
          *v10++ = *v7++;
          goto LABEL_20;
        }
        v21 = (v20 & 0x40000000) != 0;
        v20 *= 2;
        if( v21 )
        {
          *(_WORD *)v10 = *(_WORD *)v7;
          v10 += 2;
          v7 += 2;
          goto LABEL_20;
        }
        v21 = (v20 & 0x40000000) != 0;
        v20 *= 2;
        *(_DWORD *)v10 = *(_DWORD *)v7;
        if( v21 )
        {
          v10 += 3;
          v7 += 3;
          goto LABEL_20;
        }
        v10 += 4;
        v7 += 4;
        v21 = (v20 & 0x40000000) != 0;
        v20 *= 2;
        if( v21 )
          goto LABEL_20;
LABEL_54:
        v20 *= 2;
      }
    }
    while( 1 )
    {
      v22 = *(unsigned __int16 *)v7;
      v7 += 2;
      v23 = v22;
      v24 = (v22 >> 3) + 1;
      v25 = v23 & 7;
      if( v25 == 7 )
      {
        if( v16 )
        {
          v26 = (unsigned __int64)(unsigned __int8)*v16 >> 4;
          v16 = 0i64;
        }
        else
        {
          v16 = v7++;
          v26 = *v16 & 0xF;
        }
        if( v26 == 15 )
        {
          if( (unsigned __int64)(v7 + 7) >= v13 )
            goto LABEL_67;
          v27 = (unsigned __int8)*v7++;
          if( v27 == 255 )
          {
            v28 = *(unsigned __int16 *)v7;
            v7 += 2;
            if( !v28 )
            {
              v28 = *(unsigned int *)v7;
              v7 += 4;
            }
            if( v28 < 0x16 || &v10[v28 + 3] < v10 )
              return 3221226050i64;
            v27 = v28 - 22;
          }
          v26 = v27 + 15;
        }
        v25 = v26 + 7;
      }
      v29 = v25 + 3;
      v30 = &v10[-v24];
      if( &v10[-v24] < v8 )
        return 3221226050i64;
      if( v24 >= 4 )
      {
LABEL_44:
        *(_DWORD *)v10 = *(_DWORD *)v30;
        *((_DWORD *)v10 + 1) = *((_DWORD *)v30 + 1);
        if( v29 >= 9 )
        {
          v10 += 8;
          v34 = v30 + 8;
          for( v29 -= 8i64; ; v29 -= 16i64 )
          {
            if( v10 >= v15 )
            {
              if( (unsigned __int64)v10 >= v14 )
                goto LABEL_113;
              v35 = RtlpMakeXpressCallback((INT64)v62, v14, (INT64)v10);
              v14 = (UINT64)v61;
              v15 = (_BYTE *)v35;
            }
            *(_DWORD *)v10 = *v34;
            *((_DWORD *)v10 + 1) = v34[1];
            *((_DWORD *)v10 + 2) = v34[2];
            *((_DWORD *)v10 + 3) = v34[3];
            if( v29 < 17 )
              break;
            v10 += 16;
            v34 += 4;
          }
          v8 = a1;
        }
        v10 += v29;
        goto LABEL_53;
      }
      *v10 = *v30;
      v31 = v24 - 1;
      if( v31 )
      {
        v10[1] = v30[1];
        if( v31 == 1 )
        {
          v10 += 2;
          v33 = -2i64;
          goto LABEL_43;
        }
        v32 = v30[2];
      }
      else
      {
        v10[1] = *v30;
        v32 = *v30;
      }
      v10[2] = v32;
      v33 = -3i64;
      v10 += 3;
LABEL_43:
      v29 += v33;
      if( v29 )
        goto LABEL_44;
LABEL_53:
      if( v20 >= 0 )
        goto LABEL_54;
LABEL_20:
      v20 *= 2;
      if( !v20 )
        goto LABEL_8;
    }
  }
  while( 1 )
  {
    v7 = v18 + 4;
    if( v10 >= v15 )
    {
      if( (unsigned __int64)v10 >= v14 )
        goto LABEL_123;
      v36 = RtlpMakeXpressCallback((INT64)v62, v14, (INT64)v10);
      v14 = (UINT64)v61;
      v15 = (_BYTE *)v36;
      v8 = a1;
    }
    v20 = 2 * v17 + 1;
    if( v17 < 0 )
      break;
    while( v20 >= 0 )
    {
      v21 = (v20 & 0x40000000) != 0;
      v20 *= 2;
      if( v21 )
      {
        if( v7 + 1 >= v11 )
          return 3221226050i64;
        *(_WORD *)v10 = *(_WORD *)v7;
        v10 += 2;
        v7 += 2;
        goto LABEL_110;
      }
      v21 = (v20 & 0x40000000) != 0;
      v20 *= 2;
      if( v21 )
      {
        if( v7 + 2 >= v11 )
          return 3221226050i64;
        *(_WORD *)v10 = *(_WORD *)v7;
        v10[2] = v7[2];
        v10 += 3;
        v7 += 3;
        goto LABEL_110;
      }
      v20 *= 2;
      if( v7 + 3 >= v11 )
        return 3221226050i64;
      v48 = *(_DWORD *)v7;
      v7 += 4;
      *(_DWORD *)v10 = v48;
      v10 += 4;
      if( v20 < 0 )
        goto LABEL_110;
LABEL_97:
      v20 *= 2;
    }
    if( v7 >= v11 )
      return 3221226050i64;
    *v10++ = *v7++;
LABEL_110:
    v18 = v7;
    v20 *= 2;
    if( v20 )
      break;
    if( v7 + 3 >= v11 )
      return 3221226050i64;
    v17 = *(_DWORD *)v7;
  }
  if( v7 == v11 )
  {
    v49 = (unsigned __int64)v60;
    while( 1 )
    {
LABEL_118:
      if( v20 >= 0 )
      {
        v20 *= 2;
        goto LABEL_125;
      }
LABEL_120:
      while( 1 )
      {
        v20 *= 2;
        if( v20 )
          break;
        if( v7 + 3 >= v11 )
          return 3221226050i64;
        v17 = *(_DWORD *)v7;
        v7 += 4;
LABEL_124:
        v20 = 2 * v17 + 1;
        if( v17 < 0 )
          break;
LABEL_125:
        while( v20 >= 0 )
        {
          v20 *= 2;
          if( v7 + 2 > v11 || (unsigned __int64)(v10 + 2) > v49 )
            return 3221226050i64;
          v51 = *(_WORD *)v7;
          v7 += 2;
          *(_WORD *)v10 = v51;
          v10 += 2;
          if( v20 < 0 )
            goto LABEL_120;
          v20 *= 2;
        }
        if( v7 >= v11 || (unsigned __int64)v10 >= v49 )
          return 3221226050i64;
        *v10++ = *v7++;
      }
      if( v7 == v11 )
        break;
      if( v7 + 1 >= v11 )
      {
        if( (unsigned __int64)v10 < v49 )
          return 3221226050i64;
        break;
      }
      v52 = *(unsigned __int16 *)v7;
      v7 += 2;
      v53 = v52;
      v54 = (v52 >> 3) + 1;
      v55 = v53 & 7;
      if( v55 == 7 )
      {
        if( v16 )
        {
          v56 = (unsigned __int64)(unsigned __int8)*v16 >> 4;
          v16 = 0i64;
        }
        else
        {
          if( v7 >= v11 )
            return 3221226050i64;
          v16 = v7++;
          v56 = *v16 & 0xF;
        }
        if( v56 == 15 )
        {
          if( v7 >= v11 )
            return 3221226050i64;
          v57 = (unsigned __int8)*v7++;
          if( v57 == 255 )
          {
            if( v7 + 1 >= v11 )
              return 3221226050i64;
            v58 = *(unsigned __int16 *)v7;
            v7 += 2;
            if( !v58 )
            {
              if( v7 + 3 >= v11 )
                return 3221226050i64;
              v58 = *(unsigned int *)v7;
              v7 += 4;
            }
            if( v58 < 0x16 || &v10[v58 + 3] < v10 )
              return 3221226050i64;
            v57 = v58 - 22;
          }
          v56 = v57 + 15;
        }
        v55 = v56 + 7;
      }
      v59 = v55 + 3;
      if( &v10[-v54] < v8 || (unsigned __int64)&v10[v59] > v49 )
        return 3221226050i64;
      qmemcpy(v10, &v10[-v54], v59);
      v10 += v59;
    }
    *a5 = (_DWORD)v10 - (_DWORD)v8;
    return 0i64;
  }
  if( v7 + 1 < v11 )
  {
    v37 = *(unsigned __int16 *)v7;
    v7 += 2;
    v38 = v37;
    v24 = (v37 >> 3) + 1;
    v39 = v38 & 7;
    if( v39 == 7 )
    {
      if( v16 )
      {
        v40 = (unsigned __int64)(unsigned __int8)*v16 >> 4;
        v16 = 0i64;
      }
      else
      {
        if( v7 >= v11 )
          return 3221226050i64;
        v16 = v7++;
        v40 = *v16 & 0xF;
      }
      if( v40 == 15 )
      {
LABEL_67:
        if( v7 >= v11 )
          return 3221226050i64;
        v41 = (unsigned __int8)*v7++;
        if( v41 == 255 )
        {
          if( v7 + 1 >= v11 )
            return 3221226050i64;
          v42 = *(unsigned __int16 *)v7;
          v7 += 2;
          if( !v42 )
          {
            if( v7 + 3 >= v11 )
              return 3221226050i64;
            v42 = *(unsigned int *)v7;
            v7 += 4;
          }
          if( v42 < 0x16 || &v10[v42 + 3] < v10 )
            return 3221226050i64;
          v41 = v42 - 22;
        }
        v40 = v41 + 15;
      }
      v39 = v40 + 7;
    }
    v29 = v39 + 3;
    v43 = &v10[-v24];
    if( &v10[-v24] < v8 )
      return 3221226050i64;
    if( v24 >= 4 )
    {
LABEL_87:
      *(_DWORD *)v10 = *(_DWORD *)v43;
      *((_DWORD *)v10 + 1) = *((_DWORD *)v43 + 1);
      if( v29 >= 9 )
      {
        v10 += 8;
        v34 = v43 + 8;
        for( v29 -= 8i64; ; v29 -= 16i64 )
        {
          if( v10 >= v15 )
          {
            if( (unsigned __int64)v10 >= v14 )
            {
LABEL_113:
              v49 = (unsigned __int64)v60;
              if( &v10[v29] <= v60 )
              {
                v8 = a1;
                qmemcpy(v10, v34, v29);
                v10 += v29;
                goto LABEL_118;
              }
              return 3221226050i64;
            }
            v47 = RtlpMakeXpressCallback((INT64)v62, v14, (INT64)v10);
            v14 = (UINT64)v61;
            v15 = (_BYTE *)v47;
          }
          *(_DWORD *)v10 = *v34;
          *((_DWORD *)v10 + 1) = v34[1];
          *((_DWORD *)v10 + 2) = v34[2];
          *((_DWORD *)v10 + 3) = v34[3];
          if( v29 < 17 )
            break;
          v10 += 16;
          v34 += 4;
        }
        v8 = a1;
      }
      v10 += v29;
LABEL_96:
      if( v20 < 0 )
        goto LABEL_110;
      goto LABEL_97;
    }
    *v10 = *v43;
    v44 = v24 - 1;
    if( v44 )
    {
      v10[1] = v43[1];
      if( v44 == 1 )
      {
        v10 += 2;
        v46 = -2i64;
        goto LABEL_86;
      }
      v45 = v43[2];
    }
    else
    {
      v10[1] = *v43;
      v45 = *v43;
    }
    v10[2] = v45;
    v46 = -3i64;
    v10 += 3;
LABEL_86:
    v29 += v46;
    if( !v29 )
      goto LABEL_96;
    goto LABEL_87;
  }
  v49 = (unsigned __int64)v60;
  if( v10 >= v60 )
    goto LABEL_118;
  return 3221226050i64;
}

Referenced by:

RtlDecompressBufferProgress