RtlDecompressBufferXpressHuffProgress

NTSTATUS __stdcall RtlDecompressBufferXpressHuffProgress(
        UINT8 *UncompressedBuffer,
        UINT64 UncompressedBufferSize,
        UINT8 *CompressedBuffer,
        UINT64 CompressedBufferSize,
        UINT64 *FinalUncompressedSize,
        VOID *WorkspacePvoid,
        VOID *Callback,
        VOID *a8,
        VOID *CallbackContext,
        UINT64 ProgressBytes){
  unsigned int v10; 
  UINT8 *v11; 
  UINT8 *v12; 
  UINT8 *v14; 
  __m128i *v15; 
  UINT8 *v16; 
  UINT8 *v17; 
  __int64 v18; 
  UINT8 *v19; 
  unsigned __int16 *v20; 
  int v21; 
  int v22; 
  unsigned int v23; 
  unsigned __int64 v24; 
  unsigned __int64 XpressCallback; 
  __int16 v26; 
  int v27; 
  __int64 v28; 
  __int16 v29; 
  int v30; 
  int v31; 
  unsigned __int64 v32; 
  unsigned __int64 v33; 
  unsigned __int64 v34; 
  unsigned __int64 v35; 
  unsigned __int64 v36; 
  int v37; 
  UINT8 *v38; 
  unsigned __int64 v39; 
  UINT8 v40; 
  __int64 v41; 
  _DWORD *v42; 
  UINT8 *v43; 
  unsigned __int64 v44; 
  __int16 v45; 
  int v46; 
  __int64 v47; 
  int v48; 
  int v49; 
  unsigned __int64 v50; 
  unsigned __int64 v51; 
  unsigned __int64 v52; 
  int v53; 
  UINT8 *v54; 
  unsigned __int64 v55; 
  __m128i *v56; 
  UINT8 *v57; 
  __int64 v58[2]; 
  unsigned int v59; 
  int v60; 
  UINT8 *WorkspacePvoida; 
  int CallbackContexta; 

  v10 = 4096;
  CallbackContexta = 4096;
  v11 = CompressedBuffer;
  v60 = 0;
  LODWORD(v12) = (_DWORD)UncompressedBuffer;
  if( !WorkspacePvoid )
    return -1073741592;
  v14 = UncompressedBuffer;
  v15 = (__m128i *)(((unsigned __int64)WorkspacePvoid + 7) & 0xFFFFFFFFFFFFFFF8ui64);
  v16 = &CompressedBuffer[(unsigned int)CompressedBufferSize];
  v17 = &UncompressedBuffer[(unsigned int)UncompressedBufferSize];
  v56 = v15;
  WorkspacePvoida = v17;
  if( !Callback || (unsigned int)UncompressedBufferSize < 0x1000 )
  {
    v10 = UncompressedBufferSize;
    CallbackContexta = UncompressedBufferSize;
  }
  v58[0] = (__int64)Callback;
  v58[1] = (__int64)a8;
  v59 = v10;
LABEL_7:
  if( v16 - v11 < 260 )
  {
    if( v14 != v17 )
      return -1073741246;
    goto LABEL_106;
  }
  if( (unsigned int)XpressBuildHuffmanDecodingTable(v15, (__int64)v11) )
    return -1073741246;
  v17 = WorkspacePvoida;
  v18 = 16i64;
  v19 = WorkspacePvoida;
  v20 = (unsigned __int16 *)(v11 + 256);
  v21 = v20[1];
  v22 = *v20;
  v11 = (UINT8 *)(v20 + 2);
  v23 = v21 + (v22 << 16);
  if( v14 + 0x10000 <= WorkspacePvoida )
    v19 = v14 + 0x10000;
  v57 = v19;
  v24 = (unsigned __int64)(v19 - 188);
  if( v14 >= v19 - 188 )
    goto LABEL_66;
  XpressCallback = (unsigned __int64)&v14[v10];
  if( v24 < XpressCallback )
    XpressCallback = (unsigned __int64)(v19 - 188);
  while( 1 )
  {
    v26 = v15[66].m128i_i16[(unsigned __int64)v23 >> 22];
    if( v26 > 0 )
    {
      v28 = v26 & 0xF;
      v23 <<= v28;
      v18 -= v28;
    }
    else
    {
      v23 <<= 10;
      v18 -= 10i64;
      do
      {
        --v18;
        v27 = (unsigned __int64)v23 >> 31;
        v23 *= 2;
        v26 = v15[194].m128i_i16[(__int16)(v27 - v26)];
      }
      while( v26 <= 0 );
    }
    v29 = (v26 >> 4) - 256;
    if( v18 < 0 )
      break;
LABEL_27:
    if( v29 >= 0 )
    {
      v17 = WorkspacePvoida;
      if( !v29 && v11 >= v16 && v14 == WorkspacePvoida )
      {
        LODWORD(v12) = (_DWORD)UncompressedBuffer;
        goto LABEL_106;
      }
      v31 = v29 / 16;
      v32 = v29 % 16;
      if( v32 == 15 )
      {
        if( v11 >= v16 )
          return -1073741246;
        v33 = *v11++;
        if( v33 == 255 )
        {
          if( v11 + 1 >= v16 )
            return -1073741246;
          v34 = *(unsigned __int16 *)v11;
          v11 += 2;
          if( !v34 )
          {
            if( v11 + 3 >= v16 )
              return -1073741246;
            v34 = *(unsigned int *)v11;
            v11 += 4;
          }
          if( v34 < 0xF || &v14[v34 + 3] < v14 )
            return -1073741246;
          v33 = v34 - 15;
        }
        v32 = v33 + 15;
      }
      v35 = v32 + 3;
      v36 = (1i64 << v31) + ((unsigned __int64)v23 >> (31 - (unsigned __int8)v31) >> 1);
      v23 <<= v31;
      v18 -= v31;
      if( v18 < 0 )
      {
        if( (unsigned __int64)v14 >= v24 )
        {
          v12 = UncompressedBuffer;
          goto LABEL_97;
        }
        if( v11 + 1 >= v16 )
          return -1073741246;
        v37 = *(unsigned __int16 *)v11;
        v11 += 2;
        v23 += v37 << -(char)v18;
        v18 += 16i64;
      }
      v38 = &v14[-v36];
      if( &v14[-v36] < UncompressedBuffer )
        return -1073741246;
      if( v36 < 4 )
      {
        *v14 = *v38;
        v39 = v36 - 1;
        if( v39 )
        {
          v14[1] = v38[1];
          if( v39 != 1 )
          {
            v40 = v38[2];
            goto LABEL_54;
          }
          v14 += 2;
          v41 = -2i64;
        }
        else
        {
          v14[1] = *v38;
          v40 = *v38;
LABEL_54:
          v14[2] = v40;
          v41 = -3i64;
          v14 += 3;
        }
        v35 += v41;
        if( !v35 )
          goto LABEL_15;
      }
      *(_DWORD *)v14 = *(_DWORD *)v38;
      *((_DWORD *)v14 + 1) = *((_DWORD *)v38 + 1);
      if( v35 >= 9 )
      {
        v14 += 8;
        v42 = v38 + 8;
        for( v35 -= 8i64; ; v35 -= 16i64 )
        {
          if( (unsigned __int64)v14 >= XpressCallback )
          {
            if( (unsigned __int64)v14 >= v24 )
            {
              v17 = WorkspacePvoida;
              v43 = &v14[v35];
              if( &v14[v35] <= WorkspacePvoida )
              {
                v44 = v35;
                v15 = v56;
                qmemcpy(v14, v42, v44);
                v19 = v57;
                v14 = v43;
LABEL_66:
                v12 = UncompressedBuffer;
                goto LABEL_67;
              }
              return -1073741246;
            }
            XpressCallback = RtlpMakeXpressCallback((__int64)v58, v24, (__int64)v14);
          }
          *(_DWORD *)v14 = *v42;
          *((_DWORD *)v14 + 1) = v42[1];
          *((_DWORD *)v14 + 2) = v42[2];
          *((_DWORD *)v14 + 3) = v42[3];
          if( v35 < 0x11 )
            break;
          v14 += 16;
          v42 += 4;
        }
      }
      v14 += v35;
LABEL_15:
      v15 = v56;
    }
    else
    {
      *v14++ = v29;
    }
  }
  if( (unsigned __int64)v14 < XpressCallback )
  {
LABEL_25:
    if( v11 + 1 >= v16 )
      return -1073741246;
    v30 = *(unsigned __int16 *)v11;
    v11 += 2;
    v23 += v30 << -(char)v18;
    v18 += 16i64;
    goto LABEL_27;
  }
  if( (unsigned __int64)v14 < v24 )
  {
    XpressCallback = RtlpMakeXpressCallback((__int64)v58, v24, (__int64)v14);
    goto LABEL_25;
  }
  v17 = WorkspacePvoida;
  v12 = UncompressedBuffer;
LABEL_76:
  if( v11 + 1 >= v16 )
    return -1073741246;
  v48 = *(unsigned __int16 *)v11;
  v11 += 2;
  v19 = v57;
  v23 += v48 << -(char)v18;
  v18 += 16i64;
  while( v29 < 0 )
  {
    *v14++ = v29;
LABEL_67:
    if( v14 >= v19 )
    {
      v10 = CallbackContexta;
      goto LABEL_7;
    }
    v45 = v15[66].m128i_i16[(unsigned __int64)v23 >> 22];
    if( v45 > 0 )
    {
      v47 = v45 & 0xF;
      v23 <<= v47;
      v18 -= v47;
      v19 = v57;
    }
    else
    {
      v23 <<= 10;
      v18 -= 10i64;
      do
      {
        --v18;
        v46 = (unsigned __int64)v23 >> 31;
        v23 *= 2;
        v45 = v15[194].m128i_i16[(__int16)(v46 - v45)];
      }
      while( v45 <= 0 );
    }
    v29 = (v45 >> 4) - 256;
    if( v18 < 0 )
      goto LABEL_76;
  }
  if( !v29 && v11 >= v16 && v14 == v17 )
  {
LABEL_106:
    *(_DWORD *)FinalUncompressedSize = (_DWORD)v14 - (_DWORD)v12;
    return 0;
  }
  v49 = v29 / 16;
  v50 = v29 % 16;
  if( v50 != 15 )
    goto LABEL_94;
  if( v11 >= v16 )
    return -1073741246;
  v51 = *v11++;
  if( v51 != 255 )
  {
LABEL_93:
    v50 = v51 + 15;
LABEL_94:
    v35 = v50 + 3;
    v36 = (1i64 << v49) + ((unsigned __int64)v23 >> (31 - (unsigned __int8)v49) >> 1);
    v23 <<= v49;
    v18 -= v49;
    if( v18 < 0 )
    {
LABEL_97:
      if( v11 + 1 >= v16 )
        return -1073741246;
      v53 = *(unsigned __int16 *)v11;
      v11 += 2;
      v23 += v53 << -(char)v18;
      v18 += 16i64;
    }
    if( &v14[-v36] < v12 )
      return -1073741246;
    v54 = &v14[v35];
    if( &v14[v35] > v17 )
      return -1073741246;
    v55 = v35;
    v15 = v56;
    qmemcpy(v14, &v14[-v36], v55);
    v19 = v57;
    v14 = v54;
    goto LABEL_67;
  }
  if( v11 + 1 >= v16 )
    return -1073741246;
  v52 = *(unsigned __int16 *)v11;
  v11 += 2;
  if( !v52 )
  {
    if( v11 + 3 >= v16 )
      return -1073741246;
    v52 = *(unsigned int *)v11;
    v11 += 4;
  }
  if( v52 >= 0xF && &v14[v52 + 3] >= v14 )
  {
    v51 = v52 - 15;
    goto LABEL_93;
  }
  return -1073741246;
}

Referenced by:

RtlDecompressBufferProgress