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