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