// 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;
}