IvtUpdateExtendedContextEntry

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

Referenced by:

HalpIvtpInitializeReservedDomain
IvtAttachDeviceDomainInternal
IvtProcessDeviceExceptions