XmGetStringAddressRange
INT64 *__stdcall 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;
VOID *v14;
int v15;
int v16;
int v17;
unsigned int v18;
bool v19;
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 )
{
v15 = *(_DWORD *)a4;
}
else
{
*(_DWORD *)a4 = 1;
v15 = 1;
}
v16 = v15 * (*(_DWORD *)(a1 + 120) + 1);
v17 = *(_DWORD *)(a1 + 16);
if( (v17 & 0x400) != 0 )
v16 = -v16;
if( *(_BYTE *)(a1 + 137) )
*(_DWORD *)(a1 + 52) += v16;
else
*(_WORD *)(a1 + 52) += v16;
v18 = *(unsigned __int16 *)(a1 + 68);
if( (v17 & 0x400) != 0 )
v19 = v6 + *(_DWORD *)(a1 + 120) <= v18;
else
v19 = v6 + v16 - 1 <= v18;
if( !v19 )
longjmp((unsigned __int64 *)(a1 + 160), (VOID *)0xE, v14);
return v12;
}Referenced by:
XmStosOp