HalpApicConvertFromRte

NTSTATUS __stdcall HalpApicConvertFromRte(INT64 a1, UINT64 a2, INT64 a3){
  int v3; 
  unsigned int v5; 
  int v6; 
  unsigned int v7; 
  unsigned int v8; 
  bool v9; 
  int v10; 
  NTSTATUS result; 

  *(_OWORD *)a3 = 0i64;
  v3 = a1;
  *(_OWORD *)(a3 + 16) = 0i64;
  v5 = a2;
  *(_OWORD *)(a3 + 32) = 0i64;
  *(_QWORD *)(a3 + 48) = 0i64;
  *(_DWORD *)(a3 + 48) = (unsigned __int8)a1;
  *(_DWORD *)(a3 + 52) = (unsigned __int8)a1 >> 4;
  *(_DWORD *)(a3 + 16) = -1;
  v6 = a1 & 0x700;
  if( (a1 & 0x700) == 0 )
    goto LABEL_12;
  switch( v6 )
  {
    case 256:
      *(_DWORD *)(a3 + 12) = 2;
LABEL_12:
      *(_DWORD *)(a3 + 20) = 1;
      break;
    case 512:
      *(_DWORD *)(a3 + 20) = 3;
      break;
    case 1024:
      *(_DWORD *)(a3 + 20) = 2;
      break;
    case 1280:
      *(_DWORD *)(a3 + 20) = 7;
      break;
    case 1792:
      *(_DWORD *)(a3 + 20) = 4;
      break;
  }
  if( (a2 & 0x10000) != 0 )
  {
    *(_DWORD *)(a3 + 24) = 7;
    *(_DWORD *)(a3 + 32) = (unsigned int)a2 >> 17;
    if( (a1 & 0x800) == 0 )
      goto LABEL_32;
    v7 = ((unsigned int)a2 >> 17) | 0x8000;
    goto LABEL_31;
  }
  if( (a1 & 0x800) != 0 )
  {
    if( !*(&stru_140CF2E80 + 6617) || HalpApicRestoreNonX2ModeOnReset )
    {
      v8 = BYTE3(a2);
      if( (unsigned int)((__int64(__fastcall *)(__int64, __int64))qword_140C50760)(224i64, 7i64) == -1 )
      {
        *(_DWORD *)(a3 + 24) = 5;
        v7 = HIBYTE(v5);
LABEL_31:
        *(_DWORD *)(a3 + 32) = v7;
        goto LABEL_32;
      }
      *(_DWORD *)(a3 + 36) = v8 & 0xF;
      v7 = v5 >> 28;
    }
    else
    {
      *(_DWORD *)(a3 + 36) = (unsigned __int16)a2;
      v7 = WORD1(a2);
    }
    *(_DWORD *)(a3 + 24) = 6;
    goto LABEL_31;
  }
  v9 = *(&stru_140CF2E80 + 6617) == 0;
  *(_DWORD *)(a3 + 24) = 4;
  if( v9 || HalpApicRestoreNonX2ModeOnReset )
  {
    v7 = BYTE3(a2);
    v10 = 4;
    if( BYTE3(a2) == 255 )
      v10 = 1;
    *(_DWORD *)(a3 + 24) = v10;
    goto LABEL_31;
  }
  *(_DWORD *)(a3 + 32) = a2;
  if( (_DWORD)a2 == -1 )
    *(_DWORD *)(a3 + 24) = 1;
LABEL_32:
  *(_DWORD *)(a3 + 8) = (v3 & 0x8000) == 0;
  result = 1;
  if( (v3 & 0x2000) != 0 )
    result = 2;
  *(_DWORD *)a3 = result;
  if( (v3 & 0x10000) == 0 )
    *(_DWORD *)(a3 + 12) |= 0x10u;
  *(_BYTE *)(a3 + 4) = 0;
  return result;
}

Referenced by:

HalpApicInitializeIoUnit