LZNT1DecompressChunk

NTSTATUS __stdcall LZNT1DecompressChunk(
        _BYTE *UncompressedBuffer,
        _BYTE *EndOfUncompressedBufferPlus1,
        _BYTE *CompressedBuffer,
        INT64 EndOfCompressedBufferPlus1,
        INT32 *FinalUncompressedChunkSize){
  _BYTE *v5; 
  unsigned __int64 v8; 
  _BYTE *v9; 
  _BYTE *v10; 
  __int64 v11; 
  char v12; 
  _BYTE *v13; 
  unsigned __int16 v14; 
  unsigned int v15; 
  int v16; 
  int v17; 
  _BYTE *v18; 
  unsigned __int64 v19; 
  _BYTE *v20; 
  unsigned __int16 v21; 
  unsigned int v22; 
  int v23; 
  int v24; 
  _BYTE *v25; 
  unsigned __int64 v26; 
  _BYTE *v27; 
  unsigned __int16 v28; 
  unsigned int v29; 
  int v30; 
  int v31; 
  _BYTE *v32; 
  unsigned __int64 v33; 
  _BYTE *v34; 
  unsigned __int16 v35; 
  unsigned int v36; 
  int v37; 
  int v38; 
  _BYTE *v39; 
  unsigned __int64 v40; 
  _BYTE *v41; 
  unsigned __int16 v42; 
  unsigned int v43; 
  int v44; 
  int v45; 
  _BYTE *v46; 
  unsigned __int64 v47; 
  _BYTE *v48; 
  unsigned __int16 v49; 
  unsigned int v50; 
  int v51; 
  int v52; 
  _BYTE *v53; 
  unsigned __int64 v54; 
  _BYTE *v55; 
  unsigned __int16 v56; 
  unsigned int v57; 
  int v58; 
  int v59; 
  _BYTE *v60; 
  unsigned __int64 v61; 
  _BYTE *v62; 
  unsigned __int16 v63; 
  unsigned int v64; 
  int v65; 
  int v66; 
  _BYTE *v67; 
  unsigned __int64 v68; 
  _BYTE *v69; 
  _BYTE *v70; 
  unsigned __int16 v71; 
  unsigned int v72; 
  int v73; 
  int v74; 
  _BYTE *v75; 
  unsigned __int64 v76; 
  _BYTE *v77; 
  unsigned __int16 v78; 
  unsigned int v79; 
  int v80; 
  int v81; 
  _BYTE *v82; 
  unsigned __int64 v83; 
  _BYTE *v84; 
  unsigned __int16 v85; 
  unsigned int v86; 
  int v87; 
  int v88; 
  _BYTE *v89; 
  unsigned __int64 v90; 
  _BYTE *v91; 
  unsigned __int16 v92; 
  unsigned int v93; 
  int v94; 
  int v95; 
  _BYTE *v96; 
  unsigned __int64 v97; 
  _BYTE *v98; 
  unsigned __int16 v99; 
  unsigned int v100; 
  int v101; 
  int v102; 
  _BYTE *v103; 
  unsigned __int64 v104; 
  _BYTE *v105; 
  unsigned __int16 v106; 
  unsigned int v107; 
  int v108; 
  int v109; 
  _BYTE *v110; 
  unsigned __int64 v111; 
  _BYTE *v112; 
  unsigned __int16 v113; 
  unsigned int v114; 
  int v115; 
  int v116; 
  _BYTE *v117; 
  unsigned __int64 v118; 
  _BYTE *v119; 
  unsigned __int16 v120; 
  unsigned int v121; 
  int v122; 
  int v123; 
  _BYTE *v124; 
  unsigned __int64 v125; 

  v5 = UncompressedBuffer;
  v8 = EndOfCompressedBufferPlus1 - 17;
  v9 = EndOfUncompressedBufferPlus1 - 8;
  v10 = UncompressedBuffer;
  v11 = 13i64;
  while( 1 )
  {
    while( 1 )
    {
      while( 1 )
      {
        while( 1 )
        {
          while( 1 )
          {
            while( 1 )
            {
              while( 1 )
              {
                while( 1 )
                {
                  while( 1 )
                  {
                    if( (unsigned __int64)CompressedBuffer >= v8 || v5 >= v9 )
                    {
                      v69 = (_BYTE *)(v8 + 17);
                      goto LABEL_89;
                    }
                    v12 = *CompressedBuffer;
                    if( (*CompressedBuffer & 1) != 0 )
                      break;
                    *v5 = CompressedBuffer[1];
                    if( (v12 & 2) != 0 )
                      goto LABEL_25;
                    v5[1] = CompressedBuffer[2];
                    if( (v12 & 4) != 0 )
                      goto LABEL_37;
                    v5[2] = CompressedBuffer[3];
                    if( (v12 & 8) != 0 )
                      goto LABEL_48;
                    v5[3] = CompressedBuffer[4];
                    if( (v12 & 0x10) != 0 )
                      goto LABEL_58;
                    v5[4] = CompressedBuffer[5];
                    if( (v12 & 0x20) != 0 )
                      goto LABEL_67;
                    v5[5] = CompressedBuffer[6];
                    if( (v12 & 0x40) != 0 )
                      goto LABEL_75;
                    v5[6] = CompressedBuffer[7];
                    if( v12 < 0 )
                      goto LABEL_82;
                    v5[7] = CompressedBuffer[8];
                    CompressedBuffer += 9;
                    v5 += 8;
                  }
                  while( v5 > v10 )
                  {
                    v11 = (unsigned int)(v11 - 1);
                    v10 = &UncompressedBuffer[*((unsigned int *)qword_14000EB00 + v11)];
                  }
                  v13 = CompressedBuffer + 1;
                  v14 = *(_WORD *)(CompressedBuffer + 1);
                  v15 = v14;
                  v17 = dword_14000EB44[v11] & v14;
                  v11 = (unsigned int)v11;
                  v16 = v17;
                  v18 = &v5[-(v15 >> v11) - 1];
                  if( v18 < UncompressedBuffer )
                    return -1073741246;
                  v19 = (unsigned int)(v16 + 3);
                  if( &v5[v19] >= v9 )
                  {
                    v69 = (_BYTE *)(v8 + 17);
                    CompressedBuffer = v13 - 1;
                    goto LABEL_92;
                  }
                  qmemcpy(v5, v18, v19);
                  CompressedBuffer = v13;
                  v5 = &v5[v19 - 1];
                  if( (v12 & 2) != 0 )
                    break;
                  v5[1] = v13[2];
                  if( (v12 & 4) != 0 )
                    goto LABEL_37;
                  v5[2] = v13[3];
                  if( (v12 & 8) != 0 )
                    goto LABEL_48;
                  v5[3] = v13[4];
                  if( (v12 & 0x10) != 0 )
                    goto LABEL_58;
                  v5[4] = v13[5];
                  if( (v12 & 0x20) != 0 )
                    goto LABEL_67;
                  v5[5] = v13[6];
                  if( (v12 & 0x40) != 0 )
                    goto LABEL_75;
                  v5[6] = v13[7];
                  if( v12 < 0 )
                    goto LABEL_82;
                  v5[7] = v13[8];
                  CompressedBuffer = v13 + 9;
                  v5 += 8;
                }
LABEL_25:
                ++v5;
                while( v5 > v10 )
                {
                  v11 = (unsigned int)(v11 - 1);
                  v10 = &UncompressedBuffer[*((unsigned int *)qword_14000EB00 + v11)];
                }
                v20 = CompressedBuffer + 1;
                v21 = *((_WORD *)CompressedBuffer + 1);
                v22 = v21;
                v24 = dword_14000EB44[v11] & v21;
                v11 = (unsigned int)v11;
                v23 = v24;
                v25 = &v5[-(v22 >> v11) - 1];
                if( v25 < UncompressedBuffer )
                  return -1073741246;
                v26 = (unsigned int)(v23 + 3);
                if( &v5[v26] >= v9 )
                {
                  v69 = (_BYTE *)(v8 + 17);
                  CompressedBuffer = v20 - 1;
                  goto LABEL_105;
                }
                qmemcpy(v5, v25, v26);
                CompressedBuffer = v20;
                v5 = &v5[v26 - 2];
                if( (v12 & 4) != 0 )
                  break;
                v5[2] = v20[3];
                if( (v12 & 8) != 0 )
                  goto LABEL_48;
                v5[3] = v20[4];
                if( (v12 & 0x10) != 0 )
                  goto LABEL_58;
                v5[4] = v20[5];
                if( (v12 & 0x20) != 0 )
                  goto LABEL_67;
                v5[5] = v20[6];
                if( (v12 & 0x40) != 0 )
                  goto LABEL_75;
                v5[6] = v20[7];
                if( v12 < 0 )
                  goto LABEL_82;
                v5[7] = v20[8];
                CompressedBuffer = v20 + 9;
                v5 += 8;
              }
LABEL_37:
              v5 += 2;
              while( v5 > v10 )
              {
                v11 = (unsigned int)(v11 - 1);
                v10 = &UncompressedBuffer[*((unsigned int *)qword_14000EB00 + v11)];
              }
              v27 = CompressedBuffer + 1;
              v28 = *(_WORD *)(CompressedBuffer + 3);
              v29 = v28;
              v31 = dword_14000EB44[v11] & v28;
              v11 = (unsigned int)v11;
              v30 = v31;
              v32 = &v5[-(v29 >> v11) - 1];
              if( v32 < UncompressedBuffer )
                return -1073741246;
              v33 = (unsigned int)(v30 + 3);
              if( &v5[v33] >= v9 )
              {
                v69 = (_BYTE *)(v8 + 17);
                CompressedBuffer = v27 - 1;
                goto LABEL_118;
              }
              qmemcpy(v5, v32, v33);
              CompressedBuffer = v27;
              v5 = &v5[v33 - 3];
              if( (v12 & 8) != 0 )
                break;
              v5[3] = v27[4];
              if( (v12 & 0x10) != 0 )
                goto LABEL_58;
              v5[4] = v27[5];
              if( (v12 & 0x20) != 0 )
                goto LABEL_67;
              v5[5] = v27[6];
              if( (v12 & 0x40) != 0 )
                goto LABEL_75;
              v5[6] = v27[7];
              if( v12 < 0 )
                goto LABEL_82;
              v5[7] = v27[8];
              CompressedBuffer = v27 + 9;
              v5 += 8;
            }
LABEL_48:
            v5 += 3;
            while( v5 > v10 )
            {
              v11 = (unsigned int)(v11 - 1);
              v10 = &UncompressedBuffer[*((unsigned int *)qword_14000EB00 + v11)];
            }
            v34 = CompressedBuffer + 1;
            v35 = *((_WORD *)CompressedBuffer + 2);
            v36 = v35;
            v38 = dword_14000EB44[v11] & v35;
            v11 = (unsigned int)v11;
            v37 = v38;
            v39 = &v5[-(v36 >> v11) - 1];
            if( v39 < UncompressedBuffer )
              return -1073741246;
            v40 = (unsigned int)(v37 + 3);
            if( &v5[v40] >= v9 )
            {
              v69 = (_BYTE *)(v8 + 17);
              CompressedBuffer = v34 - 1;
              goto LABEL_131;
            }
            qmemcpy(v5, v39, v40);
            CompressedBuffer = v34;
            v5 = &v5[v40 - 4];
            if( (v12 & 0x10) != 0 )
              break;
            v5[4] = v34[5];
            if( (v12 & 0x20) != 0 )
              goto LABEL_67;
            v5[5] = v34[6];
            if( (v12 & 0x40) != 0 )
              goto LABEL_75;
            v5[6] = v34[7];
            if( v12 < 0 )
              goto LABEL_82;
            v5[7] = v34[8];
            CompressedBuffer = v34 + 9;
            v5 += 8;
          }
LABEL_58:
          v5 += 4;
          while( v5 > v10 )
          {
            v11 = (unsigned int)(v11 - 1);
            v10 = &UncompressedBuffer[*((unsigned int *)qword_14000EB00 + v11)];
          }
          v41 = CompressedBuffer + 1;
          v42 = *(_WORD *)(CompressedBuffer + 5);
          v43 = v42;
          v45 = dword_14000EB44[v11] & v42;
          v11 = (unsigned int)v11;
          v44 = v45;
          v46 = &v5[-(v43 >> v11) - 1];
          if( v46 < UncompressedBuffer )
            return -1073741246;
          v47 = (unsigned int)(v44 + 3);
          if( &v5[v47] >= v9 )
          {
            v69 = (_BYTE *)(v8 + 17);
            CompressedBuffer = v41 - 1;
            goto LABEL_144;
          }
          qmemcpy(v5, v46, v47);
          CompressedBuffer = v41;
          v5 = &v5[v47 - 5];
          if( (v12 & 0x20) != 0 )
            break;
          v5[5] = v41[6];
          if( (v12 & 0x40) != 0 )
            goto LABEL_75;
          v5[6] = v41[7];
          if( v12 < 0 )
            goto LABEL_82;
          v5[7] = v41[8];
          CompressedBuffer = v41 + 9;
          v5 += 8;
        }
LABEL_67:
        v5 += 5;
        while( v5 > v10 )
        {
          v11 = (unsigned int)(v11 - 1);
          v10 = &UncompressedBuffer[*((unsigned int *)qword_14000EB00 + v11)];
        }
        v48 = CompressedBuffer + 1;
        v49 = *((_WORD *)CompressedBuffer + 3);
        v50 = v49;
        v52 = dword_14000EB44[v11] & v49;
        v11 = (unsigned int)v11;
        v51 = v52;
        v53 = &v5[-(v50 >> v11) - 1];
        if( v53 < UncompressedBuffer )
          return -1073741246;
        v54 = (unsigned int)(v51 + 3);
        if( &v5[v54] >= v9 )
        {
          v69 = (_BYTE *)(v8 + 17);
          CompressedBuffer = v48 - 1;
          goto LABEL_157;
        }
        qmemcpy(v5, v53, v54);
        CompressedBuffer = v48;
        v5 = &v5[v54 - 6];
        if( (v12 & 0x40) != 0 )
          break;
        v5[6] = v48[7];
        if( v12 < 0 )
          goto LABEL_82;
        v5[7] = v48[8];
        CompressedBuffer = v48 + 9;
        v5 += 8;
      }
LABEL_75:
      v5 += 6;
      while( v5 > v10 )
      {
        v11 = (unsigned int)(v11 - 1);
        v10 = &UncompressedBuffer[*((unsigned int *)qword_14000EB00 + v11)];
      }
      v55 = CompressedBuffer + 1;
      v56 = *(_WORD *)(CompressedBuffer + 7);
      v57 = v56;
      v59 = dword_14000EB44[v11] & v56;
      v11 = (unsigned int)v11;
      v58 = v59;
      v60 = &v5[-(v57 >> v11) - 1];
      if( v60 < UncompressedBuffer )
        return -1073741246;
      v61 = (unsigned int)(v58 + 3);
      if( &v5[v61] >= v9 )
      {
        v69 = (_BYTE *)(v8 + 17);
        CompressedBuffer = v55 - 1;
        goto LABEL_170;
      }
      qmemcpy(v5, v60, v61);
      CompressedBuffer = v55;
      v5 = &v5[v61 - 7];
      if( v12 < 0 )
        break;
      v5[7] = v55[8];
      CompressedBuffer = v55 + 9;
      v5 += 8;
    }
LABEL_82:
    v5 += 7;
    while( v5 > v10 )
    {
      v11 = (unsigned int)(v11 - 1);
      v10 = &UncompressedBuffer[*((unsigned int *)qword_14000EB00 + v11)];
    }
    v62 = CompressedBuffer + 1;
    v63 = *((_WORD *)CompressedBuffer + 4);
    v64 = v63;
    v66 = dword_14000EB44[v11] & v63;
    v11 = (unsigned int)v11;
    v65 = v66;
    v67 = &v5[-(v64 >> v11) - 1];
    if( v67 < UncompressedBuffer )
      return -1073741246;
    v68 = (unsigned int)(v65 + 3);
    if( &v5[v68] >= v9 )
      break;
    qmemcpy(v5, v67, v68);
    v5 += v68;
    CompressedBuffer = v62 + 9;
  }
  v69 = (_BYTE *)(v8 + 17);
  CompressedBuffer = v62 - 1;
  while( CompressedBuffer + 8 != v69 )
  {
    if( CompressedBuffer + 8 > v69 )
      return -1073741246;
    if( v5 == EndOfUncompressedBufferPlus1 )
      break;
    if( v5 > EndOfUncompressedBufferPlus1 )
      return -1073741246;
    if( v12 < 0 )
    {
      if( CompressedBuffer + 10 > v69 )
        return -1073741246;
      while( v5 > v10 )
      {
        v11 = (unsigned int)(v11 - 1);
        v10 = &UncompressedBuffer[*((unsigned int *)qword_14000EB00 + v11)];
      }
      v119 = CompressedBuffer + 1;
      v120 = *((_WORD *)CompressedBuffer + 4);
      v121 = v120;
      v123 = dword_14000EB44[v11] & v120;
      v11 = (unsigned int)v11;
      v122 = v123;
      v124 = &v5[-(v121 >> v11) - 1];
      if( v124 < UncompressedBuffer )
        return -1073741246;
      v125 = (unsigned int)(v122 + 3);
      if( &v5[v125] > EndOfUncompressedBufferPlus1 )
        return -1073741246;
      qmemcpy(v5, v124, v125);
      v5 += v125;
      CompressedBuffer = v119;
    }
    else
    {
      *v5++ = CompressedBuffer[8];
    }
    CompressedBuffer += 9;
LABEL_89:
    if( CompressedBuffer == v69 )
      break;
    v12 = *CompressedBuffer;
LABEL_92:
    if( CompressedBuffer + 1 == v69 )
      break;
    if( CompressedBuffer + 1 > v69 )
      return -1073741246;
    if( v5 == EndOfUncompressedBufferPlus1 )
      break;
    if( v5 > EndOfUncompressedBufferPlus1 )
      return -1073741246;
    if( (v12 & 1) != 0 )
    {
      if( CompressedBuffer + 3 > v69 )
        return -1073741246;
      while( v5 > v10 )
      {
        v11 = (unsigned int)(v11 - 1);
        v10 = &UncompressedBuffer[*((unsigned int *)qword_14000EB00 + v11)];
      }
      v70 = CompressedBuffer + 1;
      v71 = *(_WORD *)(CompressedBuffer + 1);
      v72 = v71;
      v74 = dword_14000EB44[v11] & v71;
      v11 = (unsigned int)v11;
      v73 = v74;
      v75 = &v5[-(v72 >> v11) - 1];
      if( v75 < UncompressedBuffer )
        return -1073741246;
      v76 = (unsigned int)(v73 + 3);
      if( &v5[v76] > EndOfUncompressedBufferPlus1 )
        return -1073741246;
      qmemcpy(v5, v75, v76);
      v5 += v76;
      CompressedBuffer = v70;
    }
    else
    {
      *v5++ = CompressedBuffer[1];
    }
LABEL_105:
    if( CompressedBuffer + 2 == v69 )
      break;
    if( CompressedBuffer + 2 > v69 )
      return -1073741246;
    if( v5 == EndOfUncompressedBufferPlus1 )
      break;
    if( v5 > EndOfUncompressedBufferPlus1 )
      return -1073741246;
    if( (v12 & 2) != 0 )
    {
      if( CompressedBuffer + 4 > v69 )
        return -1073741246;
      while( v5 > v10 )
      {
        v11 = (unsigned int)(v11 - 1);
        v10 = &UncompressedBuffer[*((unsigned int *)qword_14000EB00 + v11)];
      }
      v77 = CompressedBuffer + 1;
      v78 = *((_WORD *)CompressedBuffer + 1);
      v79 = v78;
      v81 = dword_14000EB44[v11] & v78;
      v11 = (unsigned int)v11;
      v80 = v81;
      v82 = &v5[-(v79 >> v11) - 1];
      if( v82 < UncompressedBuffer )
        return -1073741246;
      v83 = (unsigned int)(v80 + 3);
      if( &v5[v83] > EndOfUncompressedBufferPlus1 )
        return -1073741246;
      qmemcpy(v5, v82, v83);
      v5 += v83;
      CompressedBuffer = v77;
    }
    else
    {
      *v5++ = CompressedBuffer[2];
    }
LABEL_118:
    if( CompressedBuffer + 3 == v69 )
      break;
    if( CompressedBuffer + 3 > v69 )
      return -1073741246;
    if( v5 == EndOfUncompressedBufferPlus1 )
      break;
    if( v5 > EndOfUncompressedBufferPlus1 )
      return -1073741246;
    if( (v12 & 4) != 0 )
    {
      if( CompressedBuffer + 5 > v69 )
        return -1073741246;
      while( v5 > v10 )
      {
        v11 = (unsigned int)(v11 - 1);
        v10 = &UncompressedBuffer[*((unsigned int *)qword_14000EB00 + v11)];
      }
      v84 = CompressedBuffer + 1;
      v85 = *(_WORD *)(CompressedBuffer + 3);
      v86 = v85;
      v88 = dword_14000EB44[v11] & v85;
      v11 = (unsigned int)v11;
      v87 = v88;
      v89 = &v5[-(v86 >> v11) - 1];
      if( v89 < UncompressedBuffer )
        return -1073741246;
      v90 = (unsigned int)(v87 + 3);
      if( &v5[v90] > EndOfUncompressedBufferPlus1 )
        return -1073741246;
      qmemcpy(v5, v89, v90);
      v5 += v90;
      CompressedBuffer = v84;
    }
    else
    {
      *v5++ = CompressedBuffer[3];
    }
LABEL_131:
    if( CompressedBuffer + 4 == v69 )
      break;
    if( CompressedBuffer + 4 > v69 )
      return -1073741246;
    if( v5 == EndOfUncompressedBufferPlus1 )
      break;
    if( v5 > EndOfUncompressedBufferPlus1 )
      return -1073741246;
    if( (v12 & 8) != 0 )
    {
      if( CompressedBuffer + 6 > v69 )
        return -1073741246;
      while( v5 > v10 )
      {
        v11 = (unsigned int)(v11 - 1);
        v10 = &UncompressedBuffer[*((unsigned int *)qword_14000EB00 + v11)];
      }
      v91 = CompressedBuffer + 1;
      v92 = *((_WORD *)CompressedBuffer + 2);
      v93 = v92;
      v95 = dword_14000EB44[v11] & v92;
      v11 = (unsigned int)v11;
      v94 = v95;
      v96 = &v5[-(v93 >> v11) - 1];
      if( v96 < UncompressedBuffer )
        return -1073741246;
      v97 = (unsigned int)(v94 + 3);
      if( &v5[v97] > EndOfUncompressedBufferPlus1 )
        return -1073741246;
      qmemcpy(v5, v96, v97);
      v5 += v97;
      CompressedBuffer = v91;
    }
    else
    {
      *v5++ = CompressedBuffer[4];
    }
LABEL_144:
    if( CompressedBuffer + 5 == v69 )
      break;
    if( CompressedBuffer + 5 > v69 )
      return -1073741246;
    if( v5 == EndOfUncompressedBufferPlus1 )
      break;
    if( v5 > EndOfUncompressedBufferPlus1 )
      return -1073741246;
    if( (v12 & 0x10) != 0 )
    {
      if( CompressedBuffer + 7 > v69 )
        return -1073741246;
      while( v5 > v10 )
      {
        v11 = (unsigned int)(v11 - 1);
        v10 = &UncompressedBuffer[*((unsigned int *)qword_14000EB00 + v11)];
      }
      v98 = CompressedBuffer + 1;
      v99 = *(_WORD *)(CompressedBuffer + 5);
      v100 = v99;
      v102 = dword_14000EB44[v11] & v99;
      v11 = (unsigned int)v11;
      v101 = v102;
      v103 = &v5[-(v100 >> v11) - 1];
      if( v103 < UncompressedBuffer )
        return -1073741246;
      v104 = (unsigned int)(v101 + 3);
      if( &v5[v104] > EndOfUncompressedBufferPlus1 )
        return -1073741246;
      qmemcpy(v5, v103, v104);
      v5 += v104;
      CompressedBuffer = v98;
    }
    else
    {
      *v5++ = CompressedBuffer[5];
    }
LABEL_157:
    if( CompressedBuffer + 6 == v69 )
      break;
    if( CompressedBuffer + 6 > v69 )
      return -1073741246;
    if( v5 == EndOfUncompressedBufferPlus1 )
      break;
    if( v5 > EndOfUncompressedBufferPlus1 )
      return -1073741246;
    if( (v12 & 0x20) != 0 )
    {
      if( CompressedBuffer + 8 > v69 )
        return -1073741246;
      while( v5 > v10 )
      {
        v11 = (unsigned int)(v11 - 1);
        v10 = &UncompressedBuffer[*((unsigned int *)qword_14000EB00 + v11)];
      }
      v105 = CompressedBuffer + 1;
      v106 = *((_WORD *)CompressedBuffer + 3);
      v107 = v106;
      v109 = dword_14000EB44[v11] & v106;
      v11 = (unsigned int)v11;
      v108 = v109;
      v110 = &v5[-(v107 >> v11) - 1];
      if( v110 < UncompressedBuffer )
        return -1073741246;
      v111 = (unsigned int)(v108 + 3);
      if( &v5[v111] > EndOfUncompressedBufferPlus1 )
        return -1073741246;
      qmemcpy(v5, v110, v111);
      v5 += v111;
      CompressedBuffer = v105;
    }
    else
    {
      *v5++ = CompressedBuffer[6];
    }
LABEL_170:
    if( CompressedBuffer + 7 == v69 )
      break;
    if( CompressedBuffer + 7 > v69 )
      return -1073741246;
    if( v5 == EndOfUncompressedBufferPlus1 )
      break;
    if( v5 > EndOfUncompressedBufferPlus1 )
      return -1073741246;
    if( (v12 & 0x40) != 0 )
    {
      if( CompressedBuffer + 9 > v69 )
        return -1073741246;
      while( v5 > v10 )
      {
        v11 = (unsigned int)(v11 - 1);
        v10 = &UncompressedBuffer[*((unsigned int *)qword_14000EB00 + v11)];
      }
      v112 = CompressedBuffer + 1;
      v113 = *(_WORD *)(CompressedBuffer + 7);
      v114 = v113;
      v116 = dword_14000EB44[v11] & v113;
      v11 = (unsigned int)v11;
      v115 = v116;
      v117 = &v5[-(v114 >> v11) - 1];
      if( v117 < UncompressedBuffer )
        return -1073741246;
      v118 = (unsigned int)(v115 + 3);
      if( &v5[v118] > EndOfUncompressedBufferPlus1 )
        return -1073741246;
      qmemcpy(v5, v117, v118);
      v5 += v118;
      CompressedBuffer = v112;
    }
    else
    {
      *v5++ = CompressedBuffer[7];
    }
  }
  *FinalUncompressedChunkSize = (_DWORD)v5 - (_DWORD)UncompressedBuffer;
  return 0;
}

Referenced by:

LZNT1DecompressChunkNewThread
LZNT1DecompressChunkWorkItem
RtlDecompressBufferLZNT1
RtlDecompressFragmentLZNT1