Загрузка данных
/* CImp::expand_lz(unsigned char*, int, int, int) */
void __thiscall CImp::expand_lz(CImp *this,uchar *param_1,int param_2,int param_3,int param_4)
{
byte bVar1;
byte bVar2;
byte bVar3;
undefined1 uVar4;
char cVar5;
uint uVar6;
uchar *puVar7;
uint uVar8;
char cVar9;
int iVar10;
uchar *puVar11;
char cVar12;
uint uVar13;
uint uVar14;
undefined1 *puVar15;
char *pcVar16;
int *piVar17;
uint *puVar18;
uchar *puVar19;
uchar *puVar20;
int iVar21;
int iVar22;
CImp *pCVar23;
uchar *puVar24;
char cVar25;
int iVar26;
int iVar27;
uint local_e64;
uint local_e3c;
uint local_e38;
int aiStack_e2c [512];
uint auStack_62c [288];
uint local_1ac [14];
byte abStack_172 [20];
byte abStack_15e [20];
byte abStack_14a [46];
int local_11c [34];
byte abStack_92 [6];
undefined4 local_8c;
undefined1 local_68 [20];
char local_54 [20];
undefined4 local_40;
int local_2c [2];
local_2c[0] = __stack_chk_guard;
if (param_4 != 0) {
*(undefined4 *)(this + 0x742c) = 0;
}
uVar6 = getbits(this,2);
uVar6 = uVar6 & 3;
*(uint *)(this + 0x7858) = *(uint *)(this + 0x7858) >> 2;
*(int *)(this + 0x7428) = *(int *)(this + 0x7428) + -2;
if (uVar6 == 0) {
iVar22 = -3;
}
else {
local_e64 = getbits(this,6);
if (2 < uVar6) {
iVar26 = 0x174;
}
else {
iVar26 = 0x158;
}
local_e64 = local_e64 & 0x3f;
*(uint *)(this + 0x7858) = *(uint *)(this + 0x7858) >> 6;
if (local_e64 == 0) {
iVar22 = 0x158;
}
else {
iVar22 = iVar26 * local_e64;
}
*(int *)(this + 0x7428) = *(int *)(this + 0x7428) + -6;
puVar7 = (uchar *)__allocCustomHeap(iVar22);
if (puVar7 == (uchar *)0x0) {
iVar22 = -10;
}
else {
iVar22 = load_hcodes(this,puVar7,iVar26,local_e64,param_3 + param_2);
if (iVar22 < 0) {
__freeCustomHeap(puVar7);
}
else {
piVar17 = (int *)(local_54 + 0x14);
cVar9 = '\v';
cVar12 = '\x02';
do {
cVar25 = cVar12 + cVar9 + cVar12;
cVar5 = cVar25 + cVar12;
*(char *)piVar17 = cVar9;
*(char *)((int)piVar17 + 1) = cVar12 + cVar9;
*(char *)((int)piVar17 + 2) = cVar25;
*(char *)((int)piVar17 + 3) = cVar5;
piVar17 = piVar17 + 1;
cVar9 = cVar5 + cVar12;
cVar12 = cVar12 << 1;
} while (piVar17 != local_2c);
puVar15 = local_68;
iVar22 = 1;
do {
uVar4 = (undefined1)iVar22;
iVar22 = iVar22 + 1;
puVar15[3] = uVar4;
*puVar15 = uVar4;
puVar15[1] = uVar4;
puVar15[2] = uVar4;
puVar15 = puVar15 + 4;
} while (iVar22 != 6);
pcVar16 = local_54;
cVar12 = '\x01';
do {
pcVar16[3] = cVar12;
*pcVar16 = cVar12;
pcVar16[1] = cVar12;
pcVar16[2] = cVar12;
pcVar16 = pcVar16 + 4;
cVar12 = cVar12 * '\x02' + '\x01';
} while (pcVar16 != local_54 + 0x14);
piVar17 = local_11c;
iVar10 = 5;
iVar22 = 2;
do {
*piVar17 = iVar10;
piVar17[1] = iVar10 + iVar22;
piVar17 = piVar17 + 2;
iVar10 = iVar10 + iVar22 + iVar22;
iVar22 = iVar22 << 1;
} while (piVar17 != &local_8c);
puVar15 = (undefined1 *)((int)&local_8c + 1);
iVar22 = 1;
do {
uVar4 = (undefined1)iVar22;
iVar22 = iVar22 + 1;
puVar15[-1] = uVar4;
*puVar15 = uVar4;
puVar15 = puVar15 + 2;
} while (iVar22 != 0x13);
uVar13 = 1;
puVar18 = local_1ac + 1;
do {
*puVar18 = uVar13;
puVar18[-1] = uVar13;
puVar18 = puVar18 + 2;
uVar13 = uVar13 * 2 + 1;
} while (puVar18 != (uint *)(local_11c + 1));
puVar11 = param_1 + param_2;
puVar19 = puVar11 + param_3;
if (puVar11 < puVar19) {
if (local_e64 == 0) {
local_e64 = 1;
}
local_e38 = 0;
iVar10 = (int)puVar7 + -iVar26;
local_e3c = 0;
iVar22 = 0x100;
do {
uVar14 = local_e38;
uVar13 = local_e3c;
puVar24 = puVar11;
if (iVar22 == 0x100) {
if (local_e64 == 0) break;
puVar20 = (uchar *)(iVar10 + iVar26);
make_codes(this,auStack_62c,puVar20,0x120);
make_decode_tables(this,aiStack_e2c,(int *)this,auStack_62c,puVar20,9,0x120);
puVar20 = puVar20 + 0x120;
local_e64 = local_e64 - 1;
iVar22 = 0;
pCVar23 = this + 0x52f0;
do {
make_codes(this,auStack_62c,puVar20,*(int *)pCVar23);
make_decode_tables(this,(int *)(this + iVar22 * 0x200 + 0xcf0),
(int *)(this + iVar22 * 0x150 + 0x900),auStack_62c,puVar20,7,
*(int *)pCVar23);
iVar22 = iVar22 + 1;
puVar20 = puVar20 + *(int *)pCVar23;
pCVar23 = pCVar23 + 4;
} while (iVar22 < (int)uVar6);
iVar10 = (int)puVar20 + -iVar26;
}
uVar8 = getbits(this,9);
iVar22 = aiStack_e2c[uVar8 & 0x1ff];
if (iVar22 < 0) {
if (iVar22 == -0x120) {
LAB_0003d0f4:
uVar13 = (int)puVar11 - (int)param_1;
}
else {
uVar8 = getbits(this,0x10);
iVar22 = -iVar22;
uVar8 = uVar8 >> 9;
do {
iVar22 = *(int *)(this + ((uVar8 & 1) + iVar22 * 2) * 4);
uVar8 = uVar8 >> 1;
} while (0 < iVar22);
if (iVar22 != -0x120) {
iVar22 = -iVar22;
goto LAB_0003cd34;
}
LAB_0003d10c:
uVar13 = (int)puVar11 - (int)param_1;
}
goto LAB_0003ce18;
}
LAB_0003cd34:
*(uint *)(this + 0x7428) = *(int *)(this + 0x7428) - (uint)*(byte *)(iVar10 + iVar22);
*(uint *)(this + 0x7858) = *(uint *)(this + 0x7858) >> *(sbyte *)(iVar10 + iVar22);
if (iVar22 < 0x100) {
*puVar11 = (uchar)iVar22;
puVar24 = puVar11 + 1;
}
else if (iVar22 != 0x100) {
if (iVar22 < 0x10a) {
iVar21 = iVar22 + -0xff;
}
else if (iVar22 < 0x11e) {
uVar8 = getbits(this,5);
bVar3 = abStack_172[iVar22];
bVar1 = abStack_15e[iVar22];
bVar2 = abStack_14a[iVar22];
*(uint *)(this + 0x7858) = *(uint *)(this + 0x7858) >> (uint)bVar3;
*(uint *)(this + 0x7428) = *(int *)(this + 0x7428) - (uint)bVar3;
iVar21 = (uVar8 & bVar1) + (uint)bVar2;
}
else {
if (iVar22 != 0x11e) {
uVar13 = getbits(this,3);
iVar21 = *(int *)(this + 0x742c);
iVar27 = *(int *)(this + 0x7428);
*(uint *)(this + 0x7858) = *(uint *)(this + 0x7858) >> 3;
*(uint *)(this + (iVar21 + 0x1e18) * 4) =
(int)puVar11 - (int)param_1 | (uVar13 & 7) << 0x18;
*(int *)(this + 0x742c) = iVar21 + 1;
*(int *)(this + 0x7428) = iVar27 + -3;
goto LAB_0003cdf8;
}
uVar8 = getbits(this,0xf);
*(uint *)(this + 0x7858) = *(uint *)(this + 0x7858) >> 0xf;
*(int *)(this + 0x7428) = *(int *)(this + 0x7428) + -0xf;
iVar21 = (uVar8 & 0x7fff) + 0x103;
}
if (iVar21 == 3) {
uVar8 = (uint)(2 < uVar6);
}
else {
uVar8 = 0;
}
iVar27 = (uint)(iVar21 == 2) + uVar8 * 2;
uVar8 = getbits(this,7);
iVar22 = *(int *)(this + ((uVar8 & 0x7f) + iVar27 * 0x80 + 0x33c) * 4);
if (iVar22 < 0) {
if (iVar22 == -0x120) goto LAB_0003d0f4;
uVar8 = getbits(this,0x10);
uVar8 = uVar8 >> 7;
iVar22 = -iVar22;
do {
iVar22 = *(int *)(this + ((uVar8 & 1) + (iVar27 * 0x2a + iVar22) * 2 + 0x240) * 4)
;
uVar8 = uVar8 >> 1;
} while (0 < iVar22);
if (iVar22 == -0x120) goto LAB_0003d10c;
iVar22 = -iVar22;
}
iVar27 = *(int *)(this + (iVar27 + 0x1480) * 4 + 0xfc);
*(uint *)(this + 0x7428) =
*(int *)(this + 0x7428) - (uint)*(byte *)(iVar10 + iVar22 + iVar27);
*(uint *)(this + 0x7858) =
*(uint *)(this + 0x7858) >> *(sbyte *)(iVar10 + iVar22 + iVar27);
uVar8 = local_e3c;
if (iVar22 != 0) {
if (iVar22 == 1) {
local_e3c = local_e38;
local_e38 = uVar13;
uVar8 = uVar14;
}
else if (iVar22 < 6) {
uVar8 = iVar22 - 1;
}
else {
uVar13 = getbits(this,0x12);
bVar3 = abStack_92[iVar22];
uVar14 = local_1ac[iVar22 + -6];
iVar27 = local_11c[iVar22 + -6];
*(uint *)(this + 0x7858) = *(uint *)(this + 0x7858) >> (uint)bVar3;
uVar8 = (uVar13 & uVar14) + iVar27;
local_e38 = local_e3c;
*(uint *)(this + 0x7428) = *(int *)(this + 0x7428) - (uint)bVar3;
local_e3c = uVar8;
}
}
uVar13 = (int)puVar11 - (int)param_1;
if ((uVar8 <= uVar13) && (iVar21 != 0)) {
if (puVar19 <= puVar11) goto LAB_0003ce18;
iVar27 = 0;
puVar20 = puVar11;
while( true ) {
puVar24 = puVar20 + 1;
*puVar20 = puVar11[iVar27 - uVar8];
if (iVar27 == iVar21 + -1) break;
iVar27 = iVar27 + 1;
puVar20 = puVar24;
if (puVar24 == puVar19) {
uVar13 = (int)puVar24 - (int)param_1;
goto LAB_0003ce18;
}
}
}
}
LAB_0003cdf8:
puVar11 = puVar24;
} while (puVar24 < puVar19);
uVar13 = (int)puVar24 - (int)param_1;
}
else {
uVar13 = (int)puVar11 - (int)param_1;
}
LAB_0003ce18:
__freeCustomHeap(puVar7);
if (param_4 != 0) {
reverse_mm(this,param_1,param_3 + param_2);
}
iVar22 = uVar13 - param_2;
}
}
}
if (local_2c[0] == __stack_chk_guard) {
return;
}
/* WARNING: Subroutine does not return */
__stack_chk_fail(iVar22);
}