IvtAttachDeviceDomainInternal
INT64 IvtAttachDeviceDomainInternal(INT64 a1, INT64 a2, INT64 *a3, ...){
unsigned int *v3;
INT64 *p_Routine;
char v8;
INT64 result;
WORK_QUEUE_TYPE v10;
void *v11;
int v12;
unsigned __int8 CurrentIrql;
UINT64 v14;
INT64 v15;
UINT64 v16;
INT64 v17;
INT64 v18;
INT64 v19;
INT64 a6;
INT64 a6a;
INT64 a7;
INT64 a8;
INT64 a8a;
INT64 v25[2];
struct _IO_WORKITEM LockHandle;
INT64 a3a;
va_list va1;
va_list a3b;
va_start(va1, a3);
va_start(a3b, a3);
a3a = va_arg(va1, _QWORD);
v3 = *(unsigned int **)(a2 + 32);
LockHandle.WorkItem.WorkerRoutine = 0i64;
p_Routine = a3;
a3a = 0x10000i64;
v8 = 0;
result = IvtAllocateContextTable(a1, *v3);
if( (int)result >= 0 )
{
memset((INT64)&LockHandle.Routine, 0i64);
if( !a3 )
{
v12 = *(_DWORD *)(a1 + 260);
if( v12 == 2 )
{
HIDWORD(LockHandle.Routine) = 1;
}
else if( v12 != 1 )
{
return 3221225473i64;
}
p_Routine = (INT64 *)&LockHandle.Routine;
}
CurrentIrql = KeGetCurrentIrql();
__writecr8(0xFui64);
LockHandle.WorkItem.List.Flink = 0i64;
LockHandle.WorkItem.List.Blink = (_LIST_ENTRY *)(a1 + 168);
KxAcquireQueuedSpinLock(&LockHandle, (PIO_WORKITEM_ROUTINE)(a1 + 168), v10, v11);
if( a3 || IvtGetDomainId(a1, **(unsigned int **)(a2 + 32)) == *(_QWORD *)(a2 + 16) )
{
v16 = **(unsigned int **)(a2 + 32);
if( (*(_DWORD *)(a1 + 184) & 0x1000000) != 0 )
{
LODWORD(a7) = 0;
IvtUpdateExtendedContextEntry(a1, v16, v14, v15, (INT64)p_Routine, a6, a7, (INT64 *)a3b);
}
else
{
LODWORD(v19) = 0;
IvtUpdateContextEntry(a1, v16, (INT64)p_Routine, v15, v19, (INT64 *)a3b);
}
v8 = 1;
}
*(_QWORD *)(a2 + 16) = *((unsigned int *)p_Routine + 6);
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
__writecr8(CurrentIrql);
if( v8 )
{
v25[1] = (INT64)v25;
v25[0] = (INT64)v25;
LODWORD(a8) = 0;
IvtFlushTbInternal((_QWORD *)a1, v17, a3a, 0, 1, a6, (INT64)v25, a8, 0i64);
LODWORD(a8a) = 0;
IvtFlushTbInternal((_QWORD *)a1, v18, *((unsigned int *)p_Routine + 6), 0, 1, a6a, (INT64)v25, a8a, 0i64);
}
return 0i64;
}
return result;
}Referenced by:
IvtAttachDeviceDomain
IvtDetachDeviceDomain