/* DxeIplLzmaBitDecode @ 0xffc16c81 size=0xff */
char __fastcall DxeIplLzmaBitDecode(int i_1)
{
int i; // esi
unsigned __int16 n0x100; // cx
unsigned int v3; // eax
unsigned int v4; // edx
int v5; // ebx
unsigned __int16 n0x1F; // di
unsigned int n0x800000; // ecx
unsigned int n0x1F_1; // ebp
unsigned int j; // edx
unsigned int v10; // edi
int v11; // ecx
for ( i = i_1; ; i_1 = i ) /*0xffc16c8b*/
{
n0x100 = DxeIplLzmaRangeDecode(i_1); /*0xffc16c92*/
LOBYTE(v3) = 0; /*0xffc16c95*/
if ( *(_WORD *)(i + 40) ) /*0xffc16c97*/
break; /*0xffc16c97*/
LOBYTE(v3) = 0; /*0xffc16ca1*/
if ( n0x100 >= 0x100u ) /*0xffc16cac*/
{
v5 = (unsigned __int16)(n0x100 - 253); /*0xffc16cce*/
n0x1F = *(_WORD *)(i + 2 * HIBYTE(*(_DWORD *)(i + 20)) + 12852); /*0xffc16cd7*/
if ( n0x1F >= 0x1Fu ) /*0xffc16ce2*/
{
n0x800000 = 0x800000; /*0xffc16ce4*/
do /*0xffc16d05*/
{
if ( (n0x800000 & *(_DWORD *)(i + 20)) != 0 ) /*0xffc16cef*/
n0x1F = *(_WORD *)(i + 2 * n0x1F + 2080); /*0xffc16cf1*/
else
n0x1F = *(_WORD *)(i + 2 * n0x1F + 42); /*0xffc16cfb*/
n0x800000 >>= 1; /*0xffc16d00*/
}
while ( n0x1F >= 0x1Fu ); /*0xffc16d05*/
}
n0x1F_1 = n0x1F; /*0xffc16d07*/
DxeIplDecompressLzma(i, *(unsigned __int8 *)(i + n0x1F + 4628)); /*0xffc16d14*/
LOBYTE(v3) = 1; /*0xffc16d1b*/
if ( n0x1F > 1u ) /*0xffc16d1f*/
{
v3 = DxeIplGetDecompressAlgo(i, n0x1F - 1); /*0xffc16d26*/
n0x1F_1 = v3 + (1 << (n0x1F - 1)); /*0xffc16d35*/
}
for ( j = *(_DWORD *)(i + 8) - n0x1F_1 - 1; ; ++j ) /*0xffc16d41*/
{
v5 += 0xFFFF; /*0xffc16d5e*/
if ( (v5 & 0x8000u) != 0 ) /*0xffc16d63*/
break; /*0xffc16d63*/
v10 = *(_DWORD *)(i + 8); /*0xffc16d44*/
if ( v10 >= *(_DWORD *)(i + 36) ) /*0xffc16d4a*/
return v3; /*0xffc16d4a*/
if ( j >= *(_DWORD *)(i + 36) ) /*0xffc16d4f*/
{
*(_WORD *)(i + 40) = -1; /*0xffc16d74*/
return v3; /*0xffc16d74*/
}
v11 = *(_DWORD *)(i + 4); /*0xffc16d51*/
LOBYTE(v3) = *(_BYTE *)(v11 + j); /*0xffc16d54*/
*(_BYTE *)(v11 + v10) = v3; /*0xffc16d57*/
++*(_DWORD *)(i + 8); /*0xffc16d5a*/
}
v3 = *(_DWORD *)(i + 8); /*0xffc16d65*/
if ( v3 >= *(_DWORD *)(i + 36) ) /*0xffc16d6b*/
return v3; /*0xffc16d6b*/
}
else
{
v4 = *(_DWORD *)(i + 8); /*0xffc16cae*/
if ( v4 >= *(_DWORD *)(i + 36) ) /*0xffc16cb4*/
return v3; /*0xffc16cb4*/
*(_BYTE *)(v4 + *(_DWORD *)(i + 4)) = n0x100; /*0xffc16cbd*/
++*(_DWORD *)(i + 8); /*0xffc16cc0*/
}
}
return v3; /*0xffc16d78*/
}