MiCompressRelocations
CHAR *__fastcall MiCompressRelocations(INT64 a1, INT64 a2){
__int64 v2;
char v3;
int v4;
char v5;
__int64 v7;
__int64 v8;
__int64 v9;
_WORD *v10;
__int16 v11;
unsigned int v12;
unsigned __int16 v13;
unsigned int v14;
__int16 v15;
unsigned __int16 v16;
__int16 v17;
__int64 v18;
unsigned int v19;
unsigned int v20;
__int64 v21;
CHAR *v22;
_QWORD *v23;
_QWORD *v24;
unsigned __int64 v25;
unsigned __int64 v26;
__int64 v27;
__int64 v28;
__int64 v29;
INT64 v30;
unsigned __int64 v31;
unsigned __int64 v32;
bool v34;
bool v35;
__int64 v36;
_WORD *v37;
__int16 v38;
__int16 v39;
unsigned int v40;
unsigned int v41;
__int16 v42;
unsigned __int16 v43;
INT64 v45;
CHAR *v46;
v2 = *(_QWORD *)(a1 + 32);
v3 = 0;
v4 = a2;
v5 = 0;
v7 = 0i64;
v8 = 0i64;
do
{
v9 = *(unsigned int *)(v2 + 4);
v10 = (_WORD *)(v2 + 8);
v8 += v9;
v4 -= v9;
v2 += v9;
v11 = 4;
v12 = (unsigned int)(v9 - 8) >> 1;
v13 = 0;
v14 = 0;
if( v12 )
{
do
{
v15 = *v10 >> 12;
if( v15 )
{
if( v5 != (_BYTE)v15 )
{
if( v3 )
return(CHAR *)a1;
v5 = v15;
v3 = 1;
}
v16 = *v10 & 0xFFF;
if( v16 <= v13 && v13 )
return(CHAR *)a1;
v17 = v16 - v13;
if( v17 == v11 )
{
v18 = v7 + 2;
v19 = v14 + 1;
if( v14 != 254 )
v18 = v7;
v7 = v18;
v20 = v14;
v14 = 0;
if( v20 != 254 )
v14 = v19;
}
else
{
if( v14 )
{
v34 = v14 < 4;
v35 = v14 == 4;
v14 = 0;
v7 += (!v34 && !v35) + 1i64;
}
v11 = v17;
if( (unsigned __int16)v17 >= 0xEBu )
v7 += 2i64;
else
++v7;
}
--v12;
v13 = *v10 & 0xFFF;
}
else
{
--v12;
}
++v10;
}
while( v12 );
if( v14 )
{
if( v14 <= 4 )
++v7;
else
v7 += 2i64;
}
}
v7 += (((_BYTE)v7 + 2) & 1) + 2i64;
}
while( v4 );
if( !v3 )
return(CHAR *)a1;
LODWORD(v21) = MiAllocatePool((struct _SLIST_ENTRY *)0x100);
v46 = (CHAR *)v21;
v22 = (CHAR *)v21;
if( !v21 )
return(CHAR *)a1;
v23 = (_QWORD *)a1;
v24 = (_QWORD *)(v21 + 112);
v25 = *(_QWORD *)(a1 + 32) - *(_QWORD *)a1;
*(_OWORD *)v21 = *(_OWORD *)a1;
v26 = v25 >> 3;
*(_OWORD *)(v21 + 16) = *(_OWORD *)(a1 + 16);
*(_OWORD *)(v21 + 32) = *(_OWORD *)(a1 + 32);
*(_OWORD *)(v21 + 48) = *(_OWORD *)(a1 + 48);
*(_OWORD *)(v21 + 64) = *(_OWORD *)(a1 + 64);
*(_OWORD *)(v21 + 80) = *(_OWORD *)(a1 + 80);
*(_OWORD *)(v21 + 96) = *(_OWORD *)(a1 + 96);
*(_BYTE *)(v21 + 68) = v5;
*(_QWORD *)v21 = v21 + 112;
v27 = v21 + 112 + 8i64 * *(_QWORD *)(a1 + 56);
*(_QWORD *)(v21 + 32) = v27;
v28 = *(_QWORD *)(a1 + 32);
if( (_DWORD)v26 )
{
v29 = (unsigned int)v26;
v30 = a1 - v21;
v31 = 0i64;
v45 = a1 - v21;
do
{
if( v31 < v23[7] )
{
v32 = *(_QWORD *)((char *)v24 + v30);
if( v32 > 1 )
{
*v24 = v27;
if( (*((_BYTE *)v24 + v30) & 1) != 0 )
*v24 = v27 | 1;
v36 = *(unsigned int *)(v28 + 4);
v37 = (_WORD *)(v28 + 8);
v28 += v36;
v38 = 0;
v39 = 4;
v40 = 0;
v41 = (unsigned int)(v36 - 8) >> 1;
if( v41 )
{
do
{
if( *v37 >= 0x1000u )
{
v42 = *v37 & 0xFFF;
v43 = v42 - v38;
if( v42 - v38 == v39 )
{
if( ++v40 == 255 )
{
*(_WORD *)v27 = -17;
v40 = 0;
v27 += 2i64;
}
}
else
{
if( v40 )
{
if( v40 > 4 )
{
*(_BYTE *)v27 = -17;
*(_BYTE *)(v27 + 1) = v40;
v27 += 2i64;
}
else
{
*(_BYTE *)v27++ = -17 - v40;
}
v40 = 0;
}
v39 = v42 - v38;
if( v43 >= 0xEBu )
{
*(_BYTE *)v27 = v43 | 0xF0;
*(_BYTE *)(v27 + 1) = v43 >> 4;
v27 += 2i64;
}
else
{
*(_BYTE *)v27++ = v43;
}
}
v38 = v42;
}
++v37;
--v41;
}
while( v41 );
v30 = v45;
if( v40 )
{
if( v40 <= 4 )
{
*(_BYTE *)v27++ = -17 - v40;
}
else
{
*(_BYTE *)v27 = -17;
*(_BYTE *)(v27 + 1) = v40;
v27 += 2i64;
}
}
}
v23 = (_QWORD *)a1;
*(_WORD *)v27 = 240;
v27 += 2i64;
if( (v27 & 1) != 0 )
++v27;
}
else
{
*v24 = v32;
}
}
++v31;
++v24;
--v29;
}
while( v29 );
v22 = v46;
}
ExFreePoolWithTag(v23, 0);
return v22;
}Referenced by:
MiRelocateImage