IvtUpdateContextEntry
INT64 *__stdcall IvtUpdateContextEntry(INT64 a1, UINT64 a2, INT64 a3, INT64 a4, INT64 a5, INT64 *a6){
__int64 v7;
UINT16 v8;
_QWORD *v9;
char v10;
CHAR v11;
__int64 v12;
int v13;
INT64 v14;
int v15;
char ContextEntryType;
__int64 v17;
unsigned __int64 v18;
__int64 v19;
VOID *v20;
INT64 *result;
UINT64 v22;
INT64 v23;
LODWORD(v23) = a2;
v7 = *(_QWORD *)(a1 + 32);
v8 = a2;
if( (*(_DWORD *)(a1 + 184) & 0x1000000) != 0 )
v9 = (_QWORD *)(v7
+ 8
* (2 * ((unsigned __int64)(unsigned int)a2 >> 8)
+ ((unsigned __int8)((unsigned __int8)a2 >> 3) >= 0x10u)));
else
v9 = (_QWORD *)(v7 + 16 * ((unsigned __int64)(unsigned int)a2 >> 8));
v10 = 0;
v11 = 0;
v12 = *v9 + 16i64 * (unsigned __int8)a2;
LOWORD(v13) = 0;
v14 = 0x10000i64;
if( (*(_OWORD *)v12 & 1) != 0 && !(_DWORD)a5 )
{
v10 = 1;
v14 = (unsigned __int16)((unsigned int)*(_QWORD *)(v12 + 8) >> 8);
}
v15 = *(_DWORD *)(a3 + 4);
v22 = 0i64;
if( v15 == 1 )
{
v11 = 1;
LOWORD(v13) = IvtGetBlockedDomain(a1, &v23, &v22);
}
else if( v15 )
{
v11 = 1;
v13 = *(_DWORD *)(a3 + 24);
v22 = *(_QWORD *)(a3 + 16) >> 12;
}
ContextEntryType = IvtGetContextEntryType(0, v11);
v18 = v17 << 10;
*(_QWORD *)(v12 + 8) = v19;
*(_QWORD *)v12 = (4 * (v18 | ContextEntryType & 3)) | 1;
if( v10 )
{
IvtInvalidateContextEntry(a1, v8, v14, (VOID *)v18, 1);
if( v11 )
IvtInvalidateContextEntry(a1, v8, v13, v20, 1);
}
result = a6;
if( a6 )
*a6 = v14;
return result;
}Referenced by:
HalpIvtpInitializeReservedDomain
IvtAttachDeviceDomainInternal
IvtProcessDeviceExceptions