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