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