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