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