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