IvtUpdateExtendedContextEntry
INT64 *__fastcall IvtUpdateExtendedContextEntry(
INT64 a1,
UINT64 a2,
UINT64 a3,
CHAR a4,
INT64 a5,
INT64 a6,
INT64 a7,
INT64 *a8){
unsigned __int64 v9;
unsigned int v10;
unsigned __int8 v11;
__int64 v12;
_QWORD *v13;
INT64 BlockedDomain;
char v15;
INT64 v16;
__int64 v17;
__int128 v18;
unsigned __int64 v19;
bool v20;
CHAR v21;
int v22;
UINT64 v23;
CHAR ContextEntryType;
INT64 v25;
CHAR v26;
INT64 v27;
INT64 v28;
INT64 v29;
INT64 *result;
INT64 v31[2];
__int128 v32;
bool v33;
INT64 v34;
UINT64 v35;
CHAR v36;
v36 = a4;
v35 = a3;
LODWORD(v34) = a2;
v9 = 2 * ((unsigned __int64)(unsigned int)a2 >> 8);
v10 = a2;
v11 = a2;
v12 = *(_QWORD *)(a1 + 32);
if( (*(_DWORD *)(a1 + 184) & 0x1000000) != 0 )
v13 = (_QWORD *)(v12 + 8 * (v9 + ((unsigned __int8)(v11 >> 3) >= 0x10u)));
else
v13 = (_QWORD *)(v12 + 8 * v9);
v36 = 0;
BlockedDomain = 0x10000i64;
v15 = 0;
v16 = 0x10000i64;
v17 = *v13 + 32 * (v10 & 7 | (8i64 * ((v10 >> 3) & 0xF)));
v18 = *(_OWORD *)(v17 + 16);
v19 = *(_QWORD *)v17;
*(_OWORD *)v31 = *(_OWORD *)v17;
v32 = v18;
if( (v31[0] & 1) != 0 && !(_DWORD)a7 )
{
v36 = 1;
v16 = (unsigned __int16)(LODWORD(v31[1]) >> 8);
}
v20 = (v19 & 0x800) != 0;
v21 = 0;
v33 = v20;
v35 = 0i64;
if( a5 )
{
v22 = *(_DWORD *)(a5 + 4);
if( v22 == 1 )
{
v21 = 1;
v15 = 1;
BlockedDomain = IvtGetBlockedDomain(a1, &v34, &v35);
v20 = v33;
goto LABEL_18;
}
if( v22 )
{
BlockedDomain = *(unsigned int *)(a5 + 24);
v23 = *(_QWORD *)(a5 + 16) >> 12;
}
else
{
if( !*(_BYTE *)(a1 + 270) )
goto LABEL_18;
BlockedDomain = *(unsigned int *)(a1 + 224);
v23 = *(__int64 *)(a1 + 272) >> 12;
}
v21 = 1;
v35 = v23;
v15 = 1;
}
else if( (v31[0] & 1) != 0 )
{
BlockedDomain = (unsigned __int16)(LODWORD(v31[1]) >> 8);
v35 = v19 >> 12;
if( (v19 & 0x18) == 0 )
v21 = 1;
}
LABEL_18:
ContextEntryType = IvtGetContextEntryType(v20, v21);
IvtBuildExtendedContextEntry(
a1,
ContextEntryType,
(unsigned __int64)v32 >> 12,
v32 & 0xF,
v26,
BlockedDomain,
v25,
(INT64)v31);
v28 = v31[0];
if( (v31[0] & 1) != 0 )
{
*(_OWORD *)(v17 + 16) = v32;
*(_QWORD *)(v17 + 8) = v31[1];
*(_QWORD *)v17 = v28;
}
else
{
*(_QWORD *)v17 = 0i64;
*(_QWORD *)(v17 + 8) = 0i64;
*(_QWORD *)(v17 + 16) = 0i64;
*(_QWORD *)(v17 + 24) = 0i64;
}
if( v36 )
{
IvtInvalidateExtendedContextEntry((_QWORD *)a1, v10, v16, v27);
if( v15 )
IvtInvalidateExtendedContextEntry((_QWORD *)a1, v10, BlockedDomain, v29);
}
result = a8;
if( a8 )
*a8 = v16;
return result;
}Referenced by:
HalpIvtpInitializeReservedDomain
IvtAttachDeviceDomainInternal
IvtProcessDeviceExceptions