IvtBuildExtendedContextEntry
NTSTATUS __stdcall IvtBuildExtendedContextEntry(
INT64 a1,
CHAR a2,
INT64 a3,
CHAR a4,
CHAR a5,
INT64 a6,
INT64 a7,
INT64 a8){
int v8;
unsigned __int64 v12;
unsigned __int64 v13;
int v14;
unsigned int v15;
unsigned __int64 v16;
int v17;
__int64 v18;
__int64 v19;
v8 = 0;
*(_QWORD *)a8 = 0i64;
*(_QWORD *)(a8 + 16) = 0i64;
*(_QWORD *)(a8 + 24) = 0i64;
v12 = *(_DWORD *)(a1 + 208) & 7;
*(_QWORD *)(a8 + 8) = v12;
if( a5 )
{
*(_QWORD *)a8 |= 0xA00ui64;
v13 = __readmsr(0x277u);
v14 = 0;
v15 = 0;
do
{
v16 = v13 >> v15;
v15 += 8;
LODWORD(v16) = (v16 & 0xF) << v14;
v14 += 4;
v8 |= v16;
}
while( v15 < 0x40 );
v17 = *(_DWORD *)(a1 + 184);
*(_DWORD *)(a8 + 12) = v8;
v18 = *(_QWORD *)(a8 + 8);
if( (v17 & 0x40000000) != 0 )
v18 |= 0x4000010ui64;
*(_QWORD *)(a8 + 16) = a4 & 0xF | (a3 << 12) | *(_DWORD *)(a8 + 16) & 0xFF0;
v12 = v18 & 0xFFFFFFFFFDFFFFFFui64;
}
*(_QWORD *)(a8 + 8) = v12 ^ ((unsigned int)v12 ^ ((_DWORD)a6 << 8)) & 0xFFFF00;
v19 = *(_DWORD *)a8 & 0xFE2;
*(_QWORD *)a8 = v19 | (4 * ((a7 << 10) | a2 & 7)) | 1;
return v19;
}Referenced by:
IvtInitializeIommu
IvtUpdateExtendedContextEntry