XmEvaluateAddressSpecifier
NTSTATUS __stdcall XmEvaluateAddressSpecifier(INT64 a1, INT64 *a2, VOID *a3){
unsigned int v4;
unsigned __int8 CodeByte;
INT64 v7;
VOID *v8;
unsigned int v9;
bool v10;
NTSTATUS result;
unsigned int v12;
unsigned int v13;
unsigned int v14;
unsigned int v15;
unsigned __int64 v16;
unsigned int v17;
__int16 v18;
__int16 v19;
unsigned __int16 WordImmediate;
unsigned int v21;
unsigned int v22;
unsigned __int16 v23;
unsigned int v24;
unsigned int v25;
unsigned int v26;
unsigned int v27;
unsigned int v28;
unsigned int v29;
unsigned int LongImmediate;
unsigned int v31;
unsigned int v32;
unsigned int v33;
unsigned int v34;
NTSTATUS v35;
NTSTATUS v36;
NTSTATUS v37;
NTSTATUS v38;
unsigned int v39;
unsigned int v40;
unsigned int v41;
unsigned int v42;
unsigned int v43;
NTSTATUS v44;
NTSTATUS v45;
NTSTATUS v46;
__int16 v47;
unsigned __int16 v48;
__int16 v49;
__int16 v50;
unsigned __int16 v51;
__int16 v52;
unsigned int v53;
unsigned int v54;
unsigned int v55;
CHAR v56;
__int16 v57;
CHAR v58;
__int16 v59;
unsigned int v60;
unsigned int v61;
v4 = 0;
CodeByte = XmGetCodeByte(a1, (INT64)a2, a3);
*(_BYTE *)(a1 + 142) = 0;
v7 = CodeByte >> 6;
v8 = (VOID *)(CodeByte & 7);
v9 = (unsigned int)v8 | (8 * v7);
*(_DWORD *)a2 = (CodeByte >> 3) & 7;
if( !*(_BYTE *)(a1 + 137) )
{
if( v9 <= 0xC )
{
if( v9 == 12 )
{
v18 = XmGetCodeByte(a1, v7, v8);
v19 = *(_WORD *)(a1 + 48);
LABEL_24:
WordImmediate = v18 + v19;
goto LABEL_25;
}
if( v9 == 6 )
{
WordImmediate = XmGetWordImmediate(a1);
goto LABEL_25;
}
if( v9 > 6 )
{
v24 = v9 - 7;
if( !v24 )
{
v4 = *(unsigned __int16 *)(a1 + 36);
goto LABEL_19;
}
v53 = v24 - 1;
if( v53 )
{
v54 = v53 - 1;
if( v54 )
{
v55 = v54 - 1;
if( v55 )
{
if( v55 != 1 )
goto LABEL_19;
v56 = XmGetCodeByte(a1, v7, v8);
v57 = *(_WORD *)(a1 + 52);
}
else
{
v56 = XmGetCodeByte(a1, v7, v8);
v57 = *(_WORD *)(a1 + 48);
}
v48 = v56 + *(_WORD *)(a1 + 44) + v57;
goto LABEL_103;
}
v58 = XmGetCodeByte(a1, v7, v8);
v59 = *(_WORD *)(a1 + 52);
}
else
{
v58 = XmGetCodeByte(a1, v7, v8);
v59 = *(_WORD *)(a1 + 48);
}
v51 = v58 + *(_WORD *)(a1 + 36) + v59;
}
else
{
if( v9 )
{
v12 = v9 - 1;
if( v12 )
{
v13 = v12 - 1;
if( v13 )
{
v14 = v13 - 1;
if( v14 )
{
v15 = v14 - 1;
if( v15 )
{
if( v15 == 1 )
v4 = *(unsigned __int16 *)(a1 + 52);
}
else
{
v4 = *(unsigned __int16 *)(a1 + 48);
}
goto LABEL_19;
}
v47 = *(_WORD *)(a1 + 52);
}
else
{
v47 = *(_WORD *)(a1 + 48);
}
v48 = *(_WORD *)(a1 + 44) + v47;
goto LABEL_103;
}
v50 = *(_WORD *)(a1 + 52);
}
else
{
v50 = *(_WORD *)(a1 + 48);
}
v51 = *(_WORD *)(a1 + 36) + v50;
}
}
else
{
if( v9 > 0x13 )
{
if( v9 == 20 )
{
WordImmediate = *(_WORD *)(a1 + 48) + XmGetWordImmediate(a1);
goto LABEL_25;
}
if( v9 == 21 )
{
WordImmediate = *(_WORD *)(a1 + 52) + XmGetWordImmediate(a1);
goto LABEL_25;
}
if( v9 != 22 )
{
v10 = v9 <= 0x17;
if( v9 != 23 )
goto LABEL_8;
WordImmediate = *(_WORD *)(a1 + 36) + XmGetWordImmediate(a1);
LABEL_25:
v4 = WordImmediate;
goto LABEL_19;
}
v23 = *(_WORD *)(a1 + 44) + XmGetWordImmediate(a1);
goto LABEL_32;
}
if( v9 == 19 )
{
v49 = *(_WORD *)(a1 + 52) + XmGetWordImmediate(a1);
LABEL_102:
v48 = v49 + *(_WORD *)(a1 + 44);
LABEL_103:
v4 = v48;
LABEL_33:
if( !*(_BYTE *)(a1 + 140) )
*(_DWORD *)(a1 + 116) = 2;
goto LABEL_19;
}
v21 = v9 - 13;
if( !v21 )
{
v18 = XmGetCodeByte(a1, v7, v8);
v19 = *(_WORD *)(a1 + 52);
goto LABEL_24;
}
v22 = v21 - 1;
if( !v22 )
{
v23 = XmGetCodeByte(a1, v7, v8) + *(_WORD *)(a1 + 44);
LABEL_32:
v4 = v23;
goto LABEL_33;
}
v25 = v22 - 1;
if( !v25 )
{
v18 = XmGetCodeByte(a1, v7, v8);
v19 = *(_WORD *)(a1 + 36);
goto LABEL_24;
}
v60 = v25 - 1;
if( v60 )
{
v61 = v60 - 1;
if( v61 )
{
if( v61 != 1 )
goto LABEL_19;
v49 = *(_WORD *)(a1 + 48) + XmGetWordImmediate(a1);
goto LABEL_102;
}
v52 = *(_WORD *)(a1 + 52) + XmGetWordImmediate(a1);
}
else
{
v52 = *(_WORD *)(a1 + 48) + XmGetWordImmediate(a1);
}
v51 = v52 + *(_WORD *)(a1 + 36);
}
v4 = v51;
goto LABEL_19;
}
if( v9 <= 0xC )
{
if( v9 == 12 )
goto LABEL_97;
if( v9 <= 6 )
{
if( v9 == 6 )
{
v4 = *(_DWORD *)(a1 + 48);
goto LABEL_19;
}
if( !v9 )
{
v4 = *(_DWORD *)(a1 + 24);
goto LABEL_19;
}
v26 = v9 - 1;
if( !v26 )
{
v4 = *(_DWORD *)(a1 + 28);
goto LABEL_19;
}
v27 = v26 - 1;
if( !v27 )
{
v4 = *(_DWORD *)(a1 + 32);
goto LABEL_19;
}
v28 = v27 - 1;
if( !v28 )
{
v4 = *(_DWORD *)(a1 + 36);
goto LABEL_19;
}
v29 = v28 - 1;
if( v29 )
{
if( v29 != 1 )
goto LABEL_19;
LongImmediate = XmGetLongImmediate(a1);
goto LABEL_98;
}
LABEL_97:
LongImmediate = XmEvaluateIndexSpecifier(a1, v7, v8);
LABEL_98:
v4 = LongImmediate;
goto LABEL_19;
}
v31 = v9 - 7;
if( !v31 )
{
v4 = *(_DWORD *)(a1 + 52);
goto LABEL_19;
}
v32 = v31 - 1;
if( v32 )
{
v33 = v32 - 1;
if( v33 )
{
v34 = v33 - 1;
if( v34 )
{
if( v34 != 1 )
goto LABEL_19;
v35 = XmGetCodeByte(a1, v7, v8);
goto LABEL_64;
}
v36 = XmGetCodeByte(a1, v7, v8);
LABEL_66:
v4 = *(_DWORD *)(a1 + 32) + v36;
goto LABEL_19;
}
v37 = XmGetCodeByte(a1, v7, v8);
goto LABEL_69;
}
v38 = XmGetCodeByte(a1, v7, v8);
goto LABEL_72;
}
if( v9 <= 0x13 )
{
if( v9 == 19 )
{
v35 = XmGetLongImmediate(a1);
LABEL_64:
v4 = *(_DWORD *)(a1 + 36) + v35;
goto LABEL_19;
}
v39 = v9 - 13;
if( v39 )
{
v40 = v39 - 1;
if( v40 )
{
v41 = v40 - 1;
if( v41 )
{
v42 = v41 - 1;
if( v42 )
{
v43 = v42 - 1;
if( v43 )
{
if( v43 != 1 )
goto LABEL_19;
v36 = XmGetLongImmediate(a1);
goto LABEL_66;
}
v37 = XmGetLongImmediate(a1);
LABEL_69:
v4 = *(_DWORD *)(a1 + 28) + v37;
goto LABEL_19;
}
v38 = XmGetLongImmediate(a1);
LABEL_72:
v4 = *(_DWORD *)(a1 + 24) + v38;
goto LABEL_19;
}
v44 = XmGetCodeByte(a1, v7, v8);
LABEL_85:
v4 = *(_DWORD *)(a1 + 52) + v44;
goto LABEL_19;
}
v45 = XmGetCodeByte(a1, v7, v8);
LABEL_88:
v4 = *(_DWORD *)(a1 + 48) + v45;
goto LABEL_19;
}
v46 = XmGetCodeByte(a1, v7, v8);
LABEL_91:
v4 = *(_DWORD *)(a1 + 44) + v46;
goto LABEL_33;
}
switch( v9 )
{
case 0x14u:
goto LABEL_97;
case 0x15u:
v46 = XmGetLongImmediate(a1);
goto LABEL_91;
case 0x16u:
v45 = XmGetLongImmediate(a1);
goto LABEL_88;
}
v10 = v9 <= 0x17;
if( v9 == 23 )
{
v44 = XmGetLongImmediate(a1);
goto LABEL_85;
}
LABEL_8:
if( !v10 )
{
*(_BYTE *)(a1 + 142) = 1;
return XmGetRegisterAddress(a1, CodeByte & 7);
}
LABEL_19:
if( *(_BYTE *)(a1 + 143) )
{
result = (unsigned __int16)v4;
if( *(_DWORD *)(a1 + 120) != 1 )
result = v4;
*(_DWORD *)(a1 + 128) = result;
}
else
{
v16 = *(unsigned int *)(a1 + 116);
v17 = *(unsigned __int16 *)(a1 + 2 * v16 + 68);
if( v4 > v17 || v4 + *(_DWORD *)(a1 + 120) > v17 )
longjmp((unsigned __int64 *)(a1 + 160), (VOID *)0xE, (VOID *)v16);
*(_DWORD *)(a1 + 128) = v4;
return(unsigned int)x86BiosTranslateAddress(*(_WORD *)(a1 + 2 * v16 + 56), v4);
}
return result;
}Referenced by:
XmBitScanGeneral
XmEffectiveOffset
XmGeneralBitOffset
XmGeneralRegister
XmGroup1General
XmGroup1Immediate
XmGroup2By1
XmGroup2ByByte
XmGroup2ByCL
XmGroup3General
XmGroup45General
XmGroup7General
XmGroup8BitOffset
XmImulImmediate
XmLoadSegment
XmMoveGeneral
XmMoveImmediate
XmMoveSegment
XmMoveXxGeneral
XmPopGeneral
XmSetccByte
XmShiftDouble