LZNT1CompressChunk
__int64 __fastcall LZNT1CompressChunk(
__int64 (__fastcall *a1)(char *, __int64),
char *a2,
unsigned __int64 a3,
_WORD *a4,
unsigned __int64 a5,
int *a6,
__int64 a7){
_WORD *v8;
__int64 *v9;
char v10;
__int64(__fastcall *v12)(char *, __int64);
__int64 v13;
unsigned __int64 v14;
char *v15;
unsigned int v16;
unsigned __int8 v17;
char *v18;
int v19;
char *v20;
int *v21;
_WORD *v22;
int v23;
char v24;
__int64 v25;
int v26;
int v27;
int v29;
size_t v30;
unsigned __int64 v31;
__int64 *v32;
char v34;
char *v35;
v8 = a4;
v9 = &LZNT1Formats;
v10 = 0;
v32 = &LZNT1Formats;
v34 = 0;
v12 = a1;
if( (unsigned __int64)(a2 + 4096) < a3 )
a3 = (unsigned __int64)(a2 + 4096);
v13 = a7;
v14 = a5;
v15 = a2;
if( (unsigned __int64)v8 + 4095 < a5 )
v14 = (unsigned __int64)v8 + 4095;
*(_QWORD *)a7 = a2;
v16 = 0;
v31 = v14;
*(_QWORD *)(a7 + 8) = a3;
v17 = 0;
*(_DWORD *)(a7 + 16) = 4098;
v18 = (char *)v8 + 3;
LOBYTE(v19) = 0;
v20 = (char *)(v8 + 1);
if( (unsigned __int64)a2 >= a3 )
{
LABEL_17:
if( (unsigned __int64)v20 >= v14 )
LODWORD(v18) = (_DWORD)v18 - 1;
else
*v20 = v17;
v27 = (_DWORD)v18 - (_DWORD)v8;
*a6 = v27;
*v8 = (v27 - 3) & 0xFFF | 0xB000;
if( !v34 )
return 279;
return v16;
}
v35 = (char *)(v8 + 1);
v21 = &dword_1409B3DBC;
v22 = v8 + 2;
while( 1 )
{
if( &a2[*v21] < v15 )
{
do
{
v29 = *((_DWORD *)v9 + 7);
v9 = (__int64 *)((char *)v9 + 20);
*(_DWORD *)(v13 + 16) = v29;
v21 = (int *)v9 + 3;
}
while( &a2[*((unsigned int *)v9 + 3)] < v15 );
v32 = v9;
}
if( (unsigned __int64)(v15 + 3) > a3 )
goto LABEL_11;
v23 = v12(v15, v13);
v14 = v31;
if( v23 )
break;
v10 = v34;
v9 = v32;
LABEL_11:
if( (unsigned __int64)v18 >= v14 )
goto LABEL_28;
v24 = *v15;
v25 = 1i64;
*v18 = *v15;
v10 |= v24;
++v18;
++v15;
v34 = v10;
v26 = v17 & ~(1 << v19);
LABEL_13:
v22 = (_WORD *)((char *)v22 + v25);
v17 = v26;
v19 = ((_BYTE)v19 + 1) & 7;
if( !v19 )
{
v20 = v35;
if( (unsigned __int64)v15 >= a3 )
goto LABEL_16;
v35 = v18;
v17 = 0;
++v18;
*v20 = v26;
v22 = (_WORD *)((char *)v22 + 1);
}
v13 = a7;
v12 = a1;
if( (unsigned __int64)v15 >= a3 )
goto LABEL_15;
}
if( (unsigned __int64)v22 < v31 )
{
v9 = v32;
v10 = v34;
*(_WORD *)v18 = (v23 - 3) | (((_WORD)v15 - *(_WORD *)(a7 + 24) - 1) << *((_BYTE *)v32 + 16));
v15 += v23;
v14 = v31;
v18 += 2;
v25 = 2i64;
v26 = v17 | (1 << v19);
goto LABEL_13;
}
LABEL_28:
if( (unsigned __int64)v15 >= a3 )
{
LABEL_15:
v20 = v35;
LABEL_16:
v8 = a4;
v16 = 0;
goto LABEL_17;
}
v30 = a3 - (_DWORD)a2;
if( (unsigned __int64)a4 + v30 + 2 > a5 )
return 3221225507i64;
memmove(a4 + 1, a2, v30);
*a6 = v30 + 2;
*a4 = (v30 - 1) & 0xFFF | 0x3000;
return 0i64;
}Referenced by:
RtlCompressBufferLZNT1