HsaAttachDeviceDomainInternal

INT64 __fastcall HsaAttachDeviceDomainInternal(INT64 a1, INT64 a2, INT64 *p_Routine){
  WORK_QUEUE_TYPE v6; 
  void *v7; 
  int v8; 
  unsigned __int8 CurrentIrql; 
  UINT8 *a6; 
  UINT8 *a6a; 
  INT64 a7; 
  INT64 v14; 
  INT64 v15; 
  INT64 v16; 
  INT64 v17[2]; 
  struct _IO_WORKITEM LockHandle; 
  INT64 a10; 
  LockHandle.WorkItem.WorkerRoutine = 0i64;
  v17[1] = (INT64)v17;
  a10 = 0x10000i64;
  v17[0] = (INT64)v17;
  memset((INT64)&LockHandle.Routine, 0i64);
  if( !p_Routine )
  {
    v8 = *(_DWORD *)(a1 + 172);
    if( v8 == 2 )
    {
      HIDWORD(LockHandle.Routine) = 1;
    }
    else if( v8 != 1 )
    {
      return 3221225473i64;
    }
    p_Routine = (INT64 *)&LockHandle.Routine;
  }
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(0xFui64);
  LockHandle.WorkItem.List.Flink = 0i64;
  LockHandle.WorkItem.List.Blink = (_LIST_ENTRY *)(a1 + 152);
  KxAcquireQueuedSpinLock(&LockHandle, (PIO_WORKITEM_ROUTINE)(a1 + 152), v6, v7);
  LODWORD(a7) = 0;
  LODWORD(a6) = 1;
  HsaUpdateDeviceTableEntry(
    (UINT64 *)a1,
    **(unsigned int **)(a2 + 32),
    0i64,
    1,
    (INT64)p_Routine,
    a6,
    a7,
    v14,
    v16,
    (INT64)&a10);
  KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
  __writecr8(CurrentIrql);
  if( a10 != 0x10000 )
  {
    LODWORD(v15) = 0;
    LODWORD(a6a) = 0;
    HsaFlushTbInternal((UINT64 *)a1, 0i64, a10, 0, 1, (INT64)a6a, (INT64)v17, v15, 0i64);
  }
  LODWORD(v15) = 0;
  LODWORD(a6a) = 0;
  HsaFlushTbInternal((UINT64 *)a1, 0i64, *((_DWORD *)p_Routine + 6), 0, 1, (INT64)a6a, (INT64)v17, v15, 0i64);
  return 0i64;
}

Referenced by:

HsaAttachDeviceDomain
HsaDetachDeviceDomain