HalpIommuGetHardwareDomain
INT64 __fastcall HalpIommuGetHardwareDomain(LONGLONG a1, INT64 a2, CHAR a3, CHAR a4, LARGE_INTEGER **a5){
LARGE_INTEGER *v9;
int DmarptRootAddress;
__int64 v11;
unsigned __int8 v12;
unsigned __int64 v13;
LARGE_INTEGER *v14;
__int64 v15;
INT64 v16;
LARGE_INTEGER **v17;
LARGE_INTEGER v19;
v19.QuadPart = 0i64;
v9 = 0i64;
DmarptRootAddress = 0;
KeAcquireSpinLockRaiseToDpc((UINT64 *)(a1 + 16), a2);
v13 = v12;
v14 = *(LARGE_INTEGER **)a1;
if( *(_QWORD *)a1 != a1 )
{
do
{
v9 = v14;
if( v14[3].QuadPart == a2 )
break;
v14 = (LARGE_INTEGER *)v14->QuadPart;
}
while( v14 != (LARGE_INTEGER *)a1 );
if( v14 != (LARGE_INTEGER *)a1 )
{
if( a1 != HalpIommuBypassDomain && a4 )
++v9[2].QuadPart;
goto LABEL_18;
}
}
if( !a3 )
goto LABEL_18;
v15 = HalpMmAllocCtxAlloc(v11, 112i64);
v9 = (LARGE_INTEGER *)v15;
if( !v15 )
{
DmarptRootAddress = -1073741670;
goto LABEL_21;
}
memset(v15, 0i64);
v9[3].QuadPart = a2;
v9[2].QuadPart = 1i64;
v9[4].LowPart = 1;
v16 = *(_QWORD *)(a1 + 24);
if( v16 )
{
DmarptRootAddress = HalpIommuGetDmarptRootAddress(v16, ((*(_DWORD *)(a2 + 456) >> 12) & 7u) + 1, &v19);
if( DmarptRootAddress < 0 )
goto LABEL_19;
v9[6] = v19;
}
v9[4].HighPart = *(_DWORD *)(a1 + 36);
DmarptRootAddress = HalpIommuAcquireNewDomain(a2, (INT64)&v9[4]);
if( DmarptRootAddress >= 0 )
{
v17 = *(LARGE_INTEGER ***)(a1 + 8);
if( *v17 != (LARGE_INTEGER *)a1 )
__fastfail(3u);
v9->QuadPart = a1;
v9[1].QuadPart = (LONGLONG)v17;
*v17 = v9;
*(_QWORD *)(a1 + 8) = v9;
LABEL_18:
*a5 = v9;
if( DmarptRootAddress >= 0 )
goto LABEL_21;
}
LABEL_19:
if( v9 )
HalpMmAllocCtxFree(v11, (__int64)v9);
LABEL_21:
KxReleaseSpinLock((UINT64 *)(a1 + 16));
__writecr8(v13);
return(unsigned int)DmarptRootAddress;
}Referenced by:
HalpIommuInitializeDmar
HalpIommuJoinDmaDomain
HalpIommuLeaveDmaDomain