RtlCreateRvaList

INT64 __fastcall RtlCreateRvaList(_DWORD *a1, INT64 a2, INT64 a3, INT64 a4, UINT8 *Src, UINT64 Size, INT64 a7){
  __int64 v7; 
  INT64 *v9; 
  int v10; 
  INT64 v11; 
  unsigned __int64 v12; 
  INT64 v13; 
  unsigned __int64 v14; 
  INT64 *PoolWithTag; 
  char *v16; 
  INT64 v17; 
  INT64 v18; 
  UINT8 *v19; 
  UINT8 *v20; 
  INT64 a6; 
  unsigned int v23; 
  int v24; 
  v24 = HIDWORD(a3);
  v7 = (unsigned int)a4;
  v23 = 0;
  a6 = 0i64;
  v9 = 0i64;
  v10 = RtlpCompressRvaList(0i64, a1, a3, a4, 0i64, (INT64)&a6, (INT64)&v23);
  if( v10 >= 0 )
  {
    v11 = v23;
    if( (unsigned int)v7 <= 1 )
      v12 = 0i64;
    else
      v12 = (((unsigned __int64)((unsigned int)v7 * v23) + 63) >> 3) & 0x1FFFFFFFFFFFFFF8i64;
    v13 = a6;
    v14 = (a6 + 7) & 0xFFFFFFFFFFFFFFF8ui64;
    Size = v12 + 4 * v7 + v14;
    PoolWithTag = (INT64 *)ExAllocatePoolWithTag(PagedPool, Size + 64, 0x4C617652ui64);
    v9 = PoolWithTag;
    if( PoolWithTag )
    {
      PoolWithTag[3] = v13;
      v16 = (char *)(PoolWithTag + 8);
      *PoolWithTag = v11;
      *((_DWORD *)PoolWithTag + 2) = v7;
      PoolWithTag[2] = (INT64)(PoolWithTag + 8);
      memset((INT64)(PoolWithTag + 8), 0i64);
      v19 = Src;
      v20 = (UINT8 *)&v16[v14];
      if( Src )
      {
        v9[6] = (INT64)v20;
        memmove(v20, v19, 4 * v7);
        v20 += 4 * v7;
      }
      if( v12 )
      {
        v9[5] = (INT64)v20;
        v9[4] = (unsigned int)(v7 * v11);
      }
      v10 = RtlpCompressRvaList((INT64)v9, a1, v17, v18, v9[2], (INT64)&a6, (INT64)&v23);
      if( v10 < 0 )
      {
        ExFreePoolWithTag(v9, 0x4C617652u);
        v9 = 0i64;
      }
    }
    else
    {
      v10 = -1073741670;
    }
  }
  *(_QWORD *)a7 = v9;
  return(unsigned int)v10;
}

Referenced by:

MiParseImageLoadConfig