RtlpCompressRvaList
INT64 __fastcall RtlpCompressRvaList(INT64 a1, _DWORD *a2, INT64 a3, INT64 a4, INT64 a5, INT64 a6, INT64 a7){
_DWORD *v7;
INT32 *v8;
unsigned int v9;
int v11;
_BYTE *v12;
unsigned int v13;
int v14;
int v15;
INT32 v16;
int v17;
unsigned int v18;
unsigned int v19;
unsigned int v20;
unsigned int v21;
unsigned int v22;
unsigned int v23;
unsigned int v24;
INT64 result;
INT64 v27;
INT32 v28;
int v29;
v29 = HIDWORD(a4);
v27 = a3;
v7 = (_DWORD *)a5;
v8 = &v28;
v9 = 0;
v28 = 0;
v11 = 0;
v12 = (_BYTE *)a5;
if( !a5 )
v8 = 0i64;
v13 = 0;
v14 = MiImageRvaRawEnumFirst(a2, v8);
v15 = v14;
if( !v14 )
{
v9 = -1073741811;
goto LABEL_35;
}
if( v7 )
{
v16 = v28;
v12 = v7 + 1;
*v7 = v14;
RtlpSetRvaListRvaStateBits(a1, 0i64, v16);
}
v13 = 4;
v17 = v15;
v11 = 1;
LABEL_7:
while( v15 != v17 )
{
do
{
LABEL_12:
v20 = 0;
v21 = v17 - v15;
while( 1 )
{
v22 = *((_DWORD *)RtlpRvaCompressionTableScales + v20);
if( v21 >= v22 )
break;
if( ++v20 >= 4 )
goto LABEL_7;
}
if( v22 != 1 )
v21 /= v22;
if( v21 >= 0x3F )
v21 = 63;
if( v12 )
*v12++ = v21 | ((_BYTE)v20 << 6);
++v13;
v15 += v21 * v22;
}
while( v15 != v17 );
if( v20 != 3 )
{
if( v12 )
*v12++ = -64;
++v13;
}
}
v18 = v17;
v19 = MiImageRvaRawEnumNext(a2, v8);
v17 = v19;
if( !v19 )
goto LABEL_34;
if( v19 > v18 )
{
if( v12 )
{
LODWORD(v27) = v28;
if( v28 )
{
v23 = *(_DWORD *)(a1 + 8);
if( v23 > 1 )
{
v24 = 0;
do
{
if( _bittest((const signed __int32 *)&v27, v24) )
_bittestandset64(*(signed __int64 **)(a1 + 40), v11 * v23 + (unsigned __int64)v24);
++v24;
}
while( v24 < *(_DWORD *)(a1 + 8) );
}
}
}
++v11;
goto LABEL_12;
}
v9 = -1073741701;
LABEL_34:
v7 = (_DWORD *)a5;
LABEL_35:
if( !v7 )
*(_QWORD *)a6 = v13;
result = v9;
if( a7 )
*(_DWORD *)a7 = v11;
return result;
}Referenced by:
RtlCreateRvaList