Newer
Older
AMI-Aptio-BIOS-Reversed / RegAccessPeim / decompiled / RegAccessTranslateFull.c
@Ajax Dong Ajax Dong 2 days ago 1 KB Init
// RegAccessTranslateFull - addr:0xffdaf74d
int __cdecl RegAccessTranslateFull(int a1, int a2, int *a3, int *a4)
{
  int v4; // edi
  int v5; // edx
  int v6; // ecx
  int v7; // eax
  _DWORD v9[3]; // [esp+10h] [ebp-10h] BYREF
  int v10; // [esp+1Ch] [ebp-4h]

  v4 = a3[3];
  if ( v4 && (*a3 & 0x8000) != 0 )
    *a3 = RegAccessStripHighBits(v4, *a3);
  v5 = *a3;
  a3[2] = a3[2] & 0xFFFFF0FF | ((((unsigned int)*a3 >> 13) & 3) << 8);
  if ( v4
    && *(_BYTE *)(v4 + 628672)
    && *(_DWORD *)(v4 + 628660) == (v5 & 0xFFFFF000)
    && *(_DWORD *)(v4 + 628664) == a3[1] )
  {
    *a4 = *(_DWORD *)(v4 + 628668) | *(_WORD *)a3 & 0xFFF;
  }
  else
  {
    v10 = 0;
    memset(v9, 0, sizeof(v9));
    TranslateAddressWalk((int)a3, v4 + 255608, (int)v9);
    v6 = (LOWORD(v9[0]) ^ *(_WORD *)a3) & 0xFFF ^ v9[0];
    v10 = a3[3];
    v9[0] = v6;
    v7 = RegAccessLookupTablePointer((int)v9);
    *a4 = v7 + (v9[0] & 0xFFFFFFF);
    if ( v4 )
    {
      *(_DWORD *)(v4 + 628660) = *a3 & 0xFFFFF000;
      *(_DWORD *)(v4 + 628664) = a3[1];
      *(_DWORD *)(v4 + 628668) = *a4 & 0xFFFFF000;
    }
  }
  return 0;
}