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