IvtAllocateContextTable

INT64 __fastcall IvtAllocateContextTable(INT64 a1, UINT64 a2){
  INT64 v2; 
  __int64 v3; 
  UINT64 v4; 
  unsigned int v5; 
  __int64 v6; 
  __int64 v7; 
  INT64 *v8; 
  LONGLONG *v9; 
  MEMORY_CACHING_TYPE v10; 
  INT64 result; 
  unsigned __int8 CurrentIrql; 
  WORK_QUEUE_TYPE v13; 
  PVOID v14; 
  INT64 v15; 
  _BYTE LockHandle[72]; 
  INT64 v17; 
  LARGE_INTEGER v18; 
  v17 = 0i64;
  *(_QWORD *)&LockHandle[16] = 0i64;
  v18.QuadPart = 0i64;
  v2 = a1;
  v3 = *(_QWORD *)(a1 + 184);
  v4 = a2 >> 8;
  v5 = (unsigned __int8)a2 >> 3;
  v6 = (unsigned int)(2 * v4);
  if( (v3 & 0x1000000) != 0 )
  {
    v7 = *(_QWORD *)(a1 + 32);
    a1 = v6 + (v5 >= 0x10);
    v8 = (INT64 *)(v7 + 8 * a1);
  }
  else
  {
    v8 = (INT64 *)(*(_QWORD *)(a1 + 32) + 8 * v6);
  }
  if( *v8 )
    return 0i64;
  v9 = (LONGLONG *)(*(_QWORD *)(v2 + 16) + 8 * v6);
  if( (v3 & 0x1000000) != 0 && v5 >= 0x10 )
    ++v9;
  v10 = v3 & 1;
  result = ExtEnvAllocatePhysicalMemory(a1, 0x1000ui64, 0x1000ui64, v10, &v18, (INT64)&v17);
  if( (int)result >= 0 )
  {
    memmove((UINT8 *)v17, *(UINT8 **)(v2 + 40), 0x1000ui64);
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(0xFui64);
    *(_QWORD *)LockHandle = 0i64;
    *(_QWORD *)&LockHandle[8] = v2 + 168;
    KxAcquireQueuedSpinLock((PIO_WORKITEM)LockHandle, (PIO_WORKITEM_ROUTINE)(v2 + 168), v13, v14);
    if( *v8 )
    {
      KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)LockHandle);
      __writecr8(CurrentIrql);
      ExtEnvFreePhysicalMemory(v15, (VOID *)v17, 0x1000ui64, (unsigned int)v10);
    }
    else
    {
      *v8 = v17;
      *v9 = ((v18.QuadPart / 4096) << 12) | 1;
      KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)LockHandle);
      __writecr8(CurrentIrql);
    }
    return 0i64;
  }
  return result;
}

Referenced by:

HalpIvtpInitializeReservedDomain
IvtAttachDeviceDomainInternal
IvtProcessDeviceExceptions