IvtUpdateExtendedContextEntry
INT64 *__stdcall 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 v14;
char v15;
INT64 v16;
__int64 v17;
__int128 v18;
unsigned __int64 v19;
bool v20;
CHAR v21;
int v22;
INT64 v23;
UINT64 v24;
CHAR ContextEntryType;
INT64 v26;
CHAR v27;
VOID *v28;
INT64 v29;
VOID *v30;
INT64 *result;
INT64 v32[2];
__int128 v33;
bool v34;
INT64 v35;
UINT64 v36;
CHAR v37;
v37 = a4;
v36 = a3;
LODWORD(v35) = 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);
v37 = 0;
v14 = 0x10000i64;
v15 = 0;
v16 = 0x10000i64;
v17 = *v13 + 32 * (v10 & 7 | (8i64 * ((v10 >> 3) & 0xF)));
v18 = *(_OWORD *)(v17 + 16);
v19 = *(_QWORD *)v17;
*(_OWORD *)v32 = *(_OWORD *)v17;
v33 = v18;
if( (v32[0] & 1) != 0 && !(_DWORD)a7 )
{
v37 = 1;
v16 = (unsigned __int16)(LODWORD(v32[1]) >> 8);
}
v20 = (v19 & 0x800) != 0;
v21 = 0;
v34 = v20;
v36 = 0i64;
if( a5 )
{
v22 = *(_DWORD *)(a5 + 4);
if( v22 == 1 )
{
v21 = 1;
v15 = 1;
LODWORD(v23) = IvtGetBlockedDomain(a1, &v35, &v36);
v14 = v23;
v20 = v34;
goto LABEL_18;
}
if( v22 )
{
v14 = *(unsigned int *)(a5 + 24);
v24 = *(_QWORD *)(a5 + 16) >> 12;
}
else
{
if( !*(_BYTE *)(a1 + 270) )
goto LABEL_18;
v14 = *(unsigned int *)(a1 + 224);
v24 = *(__int64 *)(a1 + 272) >> 12;
}
v21 = 1;
v36 = v24;
v15 = 1;
}
else if( (v32[0] & 1) != 0 )
{
v14 = (unsigned __int16)(LODWORD(v32[1]) >> 8);
v36 = v19 >> 12;
if( (v19 & 0x18) == 0 )
v21 = 1;
}
LABEL_18:
ContextEntryType = IvtGetContextEntryType(v20, v21);
IvtBuildExtendedContextEntry(a1, ContextEntryType, (unsigned __int64)v33 >> 12, v33 & 0xF, v27, v14, v26, (INT64)v32);
v29 = v32[0];
if( (v32[0] & 1) != 0 )
{
*(_OWORD *)(v17 + 16) = v33;
*(_QWORD *)(v17 + 8) = v32[1];
*(_QWORD *)v17 = v29;
}
else
{
*(_QWORD *)v17 = 0i64;
*(_QWORD *)(v17 + 8) = 0i64;
*(_QWORD *)(v17 + 16) = 0i64;
*(_QWORD *)(v17 + 24) = 0i64;
}
if( v37 )
{
IvtInvalidateExtendedContextEntry((_QWORD *)a1, v10, v16, v28);
if( v15 )
IvtInvalidateExtendedContextEntry((_QWORD *)a1, v10, v14, v30);
}
result = a8;
if( a8 )
*a8 = v16;
return result;
}Referenced by:
HalpIvtpInitializeReservedDomain
IvtAttachDeviceDomainInternal
IvtProcessDeviceExceptions