RtlDecompressBufferXpressHuff

NTSTATUS __stdcall RtlDecompressBufferXpressHuff(
        UINT8 *UncompressedBuffer,
        UINT64 UncompressedBufferSize,
        UINT8 *CompressedBuffer,
        UINT64 CompressedBufferSize,
        UINT64 UncompressedChunkSize,
        UINT64 *FinalUncompressedSize,
        VOID *WorkspacePvoid){
  UINT8 *v7; 
  __m128i *v9; 
  UINT8 *v10; 
  UINT8 *v11; 
  UINT8 *v12; 
  __int64 v13; 
  unsigned __int16 *v14; 
  UINT8 *v15; 
  int v16; 
  int v17; 
  unsigned int v18; 
  unsigned __int64 v19; 
  __int16 v20; 
  __int64 v21; 
  __int16 v22; 
  int v23; 
  int v24; 
  unsigned __int64 v25; 
  unsigned __int64 v26; 
  unsigned __int64 v27; 
  UINT8 *v28; 
  int v29; 
  UINT8 *v30; 
  int v31; 
  unsigned __int64 v32; 
  unsigned __int64 v33; 
  UINT8 v34; 
  __int64 v35; 
  int v37; 
  int v38; 
  unsigned __int64 v39; 
  __int16 v40; 
  __int64 v41; 
  int v42; 
  int v43; 
  unsigned __int64 v44; 
  unsigned __int64 v45; 
  unsigned __int64 v46; 
  UINT8 *WorkspacePvoida; 

  v7 = CompressedBuffer;
  if( !WorkspacePvoid )
    return -1073741592;
  v9 = (__m128i *)(((unsigned __int64)WorkspacePvoid + 7) & 0xFFFFFFFFFFFFFFF8ui64);
  v10 = UncompressedBuffer;
  v11 = &CompressedBuffer[(unsigned int)CompressedBufferSize];
  v12 = &UncompressedBuffer[(unsigned int)UncompressedBufferSize];
  WorkspacePvoida = v12;
LABEL_3:
  if( v11 - v7 < 260 )
  {
    if( v10 != v12 )
      return -1073741246;
    goto LABEL_42;
  }
  if( (unsigned int)XpressBuildHuffmanDecodingTable(v9, (__int64)v7) )
    return -1073741246;
  v13 = 16i64;
  v14 = (unsigned __int16 *)(v7 + 256);
  v15 = v12;
  v16 = v14[1];
  v17 = *v14;
  v7 = (UINT8 *)(v14 + 2);
  v18 = v16 + (v17 << 16);
  if( v10 + 0x10000 <= v12 )
    v15 = v10 + 0x10000;
  v19 = (unsigned __int64)(v15 - 188);
  if( v10 < v15 - 188 )
  {
    while( 1 )
    {
      while( 1 )
      {
        while( 1 )
        {
          v20 = v9[66].m128i_i16[(unsigned __int64)v18 >> 22];
          if( v20 <= 0 )
          {
            v18 <<= 10;
            v13 -= 10i64;
            do
            {
              --v13;
              v31 = (unsigned __int64)v18 >> 31;
              v18 *= 2;
              v20 = v9[194].m128i_i16[(__int16)(v31 - v20)];
            }
            while( v20 <= 0 );
          }
          else
          {
            v21 = v20 & 0xF;
            v18 <<= v21;
            v13 -= v21;
          }
          v22 = (v20 >> 4) - 256;
          if( v13 < 0 )
          {
            if( (unsigned __int64)v10 >= v19 )
              goto LABEL_45;
            if( v7 + 1 >= v11 )
              return -1073741246;
            v23 = *(unsigned __int16 *)v7;
            v7 += 2;
            v18 += v23 << -(char)v13;
            v13 += 16i64;
          }
          if( v22 >= 0 )
            break;
          *v10++ = v22;
        }
        if( !v22 && v7 >= v11 && v10 == WorkspacePvoida )
          goto LABEL_42;
        v24 = v22 / 16;
        v25 = v22 % 16;
        if( v25 == 15 )
        {
          if( v7 >= v11 )
            return -1073741246;
          v32 = *v7++;
          if( v32 == 255 )
          {
            if( v7 + 1 >= v11 )
              return -1073741246;
            v45 = *(unsigned __int16 *)v7;
            v7 += 2;
            if( !v45 )
            {
              if( v7 + 3 >= v11 )
                return -1073741246;
              v45 = *(unsigned int *)v7;
              v7 += 4;
            }
            if( v45 < 0xF || &v10[v45 + 3] < v10 )
              return -1073741246;
            v32 = v45 - 15;
          }
          v25 = v32 + 15;
        }
        v26 = v25 + 3;
        v27 = (1i64 << v24) + ((unsigned __int64)v18 >> (31 - (unsigned __int8)v24) >> 1);
        v18 <<= v24;
        v13 -= v24;
        if( v13 < 0 )
        {
          if( (unsigned __int64)v10 >= v19 )
            goto LABEL_59;
          if( v7 + 1 >= v11 )
            return -1073741246;
          v29 = *(unsigned __int16 *)v7;
          v7 += 2;
          v18 += v29 << -(char)v13;
          v13 += 16i64;
        }
        v28 = &v10[-v27];
        if( &v10[-v27] < UncompressedBuffer )
          return -1073741246;
        if( v27 < 4 )
          break;
LABEL_21:
        *(_DWORD *)v10 = *(_DWORD *)v28;
        *((_DWORD *)v10 + 1) = *((_DWORD *)v28 + 1);
        if( v26 >= 9 )
        {
          v10 += 8;
          v30 = v28 + 8;
          v26 -= 8i64;
          while( (unsigned __int64)v10 < v19 )
          {
            *(_DWORD *)v10 = *(_DWORD *)v30;
            *((_DWORD *)v10 + 1) = *((_DWORD *)v30 + 1);
            *((_DWORD *)v10 + 2) = *((_DWORD *)v30 + 2);
            *((_DWORD *)v10 + 3) = *((_DWORD *)v30 + 3);
            if( v26 < 0x11 )
              goto LABEL_22;
            v10 += 16;
            v30 += 16;
            v26 -= 16i64;
          }
LABEL_51:
          if( &v10[v26] <= WorkspacePvoida )
          {
            qmemcpy(v10, v30, v26);
            v10 += v26;
            goto LABEL_53;
          }
          return -1073741246;
        }
LABEL_22:
        v10 += v26;
      }
      *v10 = *v28;
      v33 = v27 - 1;
      if( v33 )
      {
        v10[1] = v28[1];
        if( v33 == 1 )
        {
          v10 += 2;
          v35 = -2i64;
          goto LABEL_39;
        }
        v34 = v28[2];
      }
      else
      {
        v10[1] = *v28;
        v34 = *v28;
      }
      v10[2] = v34;
      v35 = -3i64;
      v10 += 3;
LABEL_39:
      v26 += v35;
      if( v26 )
        goto LABEL_21;
    }
  }
  while( 1 )
  {
LABEL_53:
    if( v10 >= v15 )
    {
      v12 = WorkspacePvoida;
      goto LABEL_3;
    }
    v40 = v9[66].m128i_i16[(unsigned __int64)v18 >> 22];
    if( v40 <= 0 )
    {
      v18 <<= 10;
      v13 -= 10i64;
      do
      {
        --v13;
        v43 = (unsigned __int64)v18 >> 31;
        v18 *= 2;
        v40 = v9[194].m128i_i16[(__int16)(v43 - v40)];
      }
      while( v40 <= 0 );
    }
    else
    {
      v41 = v40 & 0xF;
      v18 <<= v41;
      v13 -= v41;
    }
    v22 = (v40 >> 4) - 256;
    if( v13 < 0 )
    {
LABEL_45:
      if( v7 + 1 < v11 )
      {
        v37 = *(unsigned __int16 *)v7;
        v7 += 2;
        v18 += v37 << -(char)v13;
        v13 += 16i64;
        goto LABEL_57;
      }
      return -1073741246;
    }
LABEL_57:
    if( v22 >= 0 )
      break;
    *v10++ = v22;
  }
  if( !v22 && v7 >= v11 && v10 == WorkspacePvoida )
  {
LABEL_42:
    *(_DWORD *)FinalUncompressedSize = (_DWORD)v10 - (_DWORD)UncompressedBuffer;
    return 0;
  }
  v38 = v22 / 16;
  v39 = v22 % 16;
  if( v39 != 15 )
    goto LABEL_49;
  if( v7 >= v11 )
    return -1073741246;
  v44 = *v7++;
  if( v44 == 255 )
  {
    if( v7 + 1 >= v11 )
      return -1073741246;
    v46 = *(unsigned __int16 *)v7;
    v7 += 2;
    if( !v46 )
    {
      if( v7 + 3 >= v11 )
        return -1073741246;
      v46 = *(unsigned int *)v7;
      v7 += 4;
    }
    if( v46 >= 0xF && &v10[v46 + 3] >= v10 )
    {
      v44 = v46 - 15;
      goto LABEL_67;
    }
  }
  else
  {
LABEL_67:
    v39 = v44 + 15;
LABEL_49:
    v26 = v39 + 3;
    v27 = (1i64 << v38) + ((unsigned __int64)v18 >> (31 - (unsigned __int8)v38) >> 1);
    v18 <<= v38;
    v13 -= v38;
    if( v13 < 0 )
    {
LABEL_59:
      if( v7 + 1 >= v11 )
        return -1073741246;
      v42 = *(unsigned __int16 *)v7;
      v7 += 2;
      v18 += v42 << -(char)v13;
      v13 += 16i64;
    }
    v30 = &v10[-v27];
    if( &v10[-v27] >= UncompressedBuffer )
      goto LABEL_51;
  }
  return -1073741246;
}

Referenced by:

No references.