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