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