XmGetStringAddressRange
INT64 *__fastcall XmGetStringAddressRange(INT64 a1, INT64 a2, INT64 a3, INT64 *a4){
int v6;
UINT16 v7;
int v8;
unsigned int v9;
unsigned int v10;
unsigned int v11;
INT64 *v12;
int v13;
int v14;
int v15;
int v16;
unsigned int v17;
bool v18;
if( *(_BYTE *)(a1 + 137) )
v6 = *(_DWORD *)(a1 + 52);
else
v6 = *(unsigned __int16 *)(a1 + 52);
v7 = *(_WORD *)(a1 + 56);
v8 = *(_DWORD *)(a1 + 120);
v9 = ((_WORD)v6 + 16 * v7) & 0xFFF;
v10 = v8 + 1;
if( (*(_DWORD *)(a1 + 16) & 0x400) != 0 )
v11 = v9 / v10 + 1;
else
v11 = (v8 - v9 + 4096) / v10;
if( *(_DWORD *)a4 > v11 )
*(_DWORD *)a4 = v11;
v12 = x86BiosTranslateAddress(v7, v6);
v13 = (*(_DWORD *)(a1 + 120) + 1) * (*(_DWORD *)a4 - 1);
if( (*(_DWORD *)(a1 + 16) & 0x400) != 0 )
v13 = -v13;
if( (unsigned int)x86BiosTranslateAddress(*(_WORD *)(a1 + 56), (unsigned __int16)v13 + (unsigned __int16)v6)
- (_DWORD)v12 == v13 )
{
v14 = *(_DWORD *)a4;
}
else
{
*(_DWORD *)a4 = 1;
v14 = 1;
}
v15 = v14 * (*(_DWORD *)(a1 + 120) + 1);
v16 = *(_DWORD *)(a1 + 16);
if( (v16 & 0x400) != 0 )
v15 = -v15;
if( *(_BYTE *)(a1 + 137) )
*(_DWORD *)(a1 + 52) += v15;
else
*(_WORD *)(a1 + 52) += v15;
v17 = *(unsigned __int16 *)(a1 + 68);
if( (v16 & 0x400) != 0 )
v18 = v6 + *(_DWORD *)(a1 + 120) <= v17;
else
v18 = v6 + v15 - 1 <= v17;
if( !v18 )
longjmp((_JBTYPE *)(a1 + 160), 14i64);
return v12;
}Referenced by:
XmStosOp