IvtAttachDeviceDomainInternal
NTSTATUS IvtAttachDeviceDomainInternal(INT64 a1, __int64 a2, int *a3, ...){
unsigned int *v3;
int *v5;
char v8;
NTSTATUS result;
int v10;
unsigned __int8 CurrentIrql;
UINT64 v12;
INT64 v13;
__int64 v14;
UINT64 v15;
INT64 v16;
INT64 v17;
INT64 v18;
INT64 v19;
INT64 v20;
INT64 v21;
INT64 v22;
INT64 v23;
INT64 v24[2];
_KLOCK_QUEUE_HANDLE LockQueue;
int v26[20];
INT64 v27;
va_list va;
va_list va1;
va_start(va1, a3);
va_start(va, a3);
v27 = va_arg(va1, _QWORD);
v3 = *(unsigned int **)(a2 + 32);
*(_QWORD *)&LockQueue.OldIrql = 0i64;
v5 = a3;
v27 = 0x10000i64;
v8 = 0;
result = IvtAllocateContextTable(a1, *v3);
if( result >= 0 )
{
memset(v26, 0i64, sizeof(v26));
if( !a3 )
{
v10 = *(_DWORD *)(a1 + 260);
if( v10 == 2 )
{
v26[1] = 1;
}
else if( v10 != 1 )
{
return -1073741823;
}
v5 = v26;
}
CurrentIrql = KeGetCurrentIrql();
__writecr8(0xFui64);
LockQueue.LockQueue.Next = 0i64;
LockQueue.LockQueue.Lock = (unsigned __int64 *volatile)(a1 + 168);
KxAcquireQueuedSpinLock(&LockQueue.LockQueue, (UINT64 *)(a1 + 168));
if( a3 || (LODWORD(v14) = IvtGetDomainId(a1, **(unsigned int **)(a2 + 32)), v14 == *(_QWORD *)(a2 + 16)) )
{
v15 = **(unsigned int **)(a2 + 32);
if( (*(_DWORD *)(a1 + 184) & 0x1000000) != 0 )
{
LODWORD(v21) = 0;
IvtUpdateExtendedContextEntry(a1, v15, v12, v13, (INT64)v5, v19, v21, (INT64 *)va);
}
else
{
LODWORD(v18) = 0;
IvtUpdateContextEntry(a1, v15, (INT64)v5, v13, v18, (INT64 *)va);
}
v8 = 1;
}
*(_QWORD *)(a2 + 16) = (unsigned int)v5[6];
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
__writecr8(CurrentIrql);
if( v8 )
{
v24[1] = (INT64)v24;
v24[0] = (INT64)v24;
LODWORD(v22) = 0;
IvtFlushTbInternal(a1, v16, v27, 0i64, 1, v19, (INT64)v24, v22, 0i64);
LODWORD(v23) = 0;
IvtFlushTbInternal(a1, v17, (unsigned int)v5[6], 0i64, 1, v20, (INT64)v24, v23, 0i64);
}
return 0;
}
return result;
}Referenced by:
IvtAttachDeviceDomain
IvtDetachDeviceDomain