IommupGetSystemContext
VOID **__fastcall IommupGetSystemContext(UINT64 a1){
unsigned int v1;
PVOID *v2;
unsigned __int8 CurrentIrql;
PVOID *i;
__int64 v5;
__int64 v6;
_DWORD *v7;
unsigned __int8 v8;
PVOID *v9;
_QWORD *v10;
__int64 v12;
int v13;
v1 = a1;
v2 = 0i64;
CurrentIrql = KeGetCurrentIrql();
__writecr8(0xFui64);
KxAcquireSpinLock(&IommupSystemContextListLock);
for( i = (PVOID *)IommupSystemContextListHead; i != &IommupSystemContextListHead; i = (PVOID *)*i )
{
v2 = i;
if( *((_DWORD *)i + 4) == v1 )
break;
}
KxReleaseSpinLock(&IommupSystemContextListLock);
__writecr8(CurrentIrql);
if( v2 && *((_DWORD *)v2 + 4) == v1 )
return v2;
v6 = HalpMmAllocCtxAlloc(v5, 64i64);
v7 = (_DWORD *)v6;
if( v6 )
{
memset(v6, 0i64);
v7[4] = v1;
*((_QWORD *)v7 + 5) = v7 + 8;
*((_QWORD *)v7 + 4) = v7 + 8;
*((_QWORD *)v7 + 7) = v7 + 12;
*((_QWORD *)v7 + 6) = v7 + 12;
*((_QWORD *)v7 + 3) = 0i64;
v8 = KeGetCurrentIrql();
__writecr8(0xFui64);
KxAcquireSpinLock(&IommupSystemContextListLock);
v9 = (PVOID *)IommupSystemContextListHead;
if( IommupSystemContextListHead == &IommupSystemContextListHead )
{
LABEL_6:
if( HalpHvIommu
&& (!IommupHvSvmEnabled
|| (int)((__int64(__fastcall *)(_QWORD, _QWORD))qword_140C4A228)(v1, (unsigned int)IommupHvMaximumAsids) < 0) )
{
KxReleaseSpinLock(&IommupSystemContextListLock);
__writecr8(v8);
HalpMmAllocCtxFree(v12, (__int64)v7);
return 0i64;
}
v10 = IommupSystemContextListHead;
if( *((PVOID **)IommupSystemContextListHead + 1) != &IommupSystemContextListHead )
__fastfail(3u);
*(_QWORD *)v7 = IommupSystemContextListHead;
v2 = (PVOID *)v7;
*((_QWORD *)v7 + 1) = &IommupSystemContextListHead;
v10[1] = v7;
IommupSystemContextListHead = v7;
v7 = 0i64;
}
else
{
while( 1 )
{
v13 = *((_DWORD *)v9 + 4);
v2 = v9;
if( v13 == v1 )
break;
v9 = (PVOID *)*v9;
if( v9 == &IommupSystemContextListHead )
{
if( v13 == v1 )
break;
goto LABEL_6;
}
}
}
KxReleaseSpinLock(&IommupSystemContextListLock);
__writecr8(v8);
if( v7 )
HalpMmAllocCtxFree(v8, (__int64)v7);
return v2;
}
return 0i64;
}Referenced by:
IommuGetConfiguration
IommuGetLibraryContext
IommuHvGetConfiguration