IommuDisableDevicePasid
INT64 __fastcall IommuDisableDevicePasid(_QWORD *a1, INT64 a2){
__int64 v2;
unsigned __int8 v4;
unsigned __int8 v5;
unsigned __int8 CurrentIrql;
UINT64 *v7;
UINT64 *v8;
_QWORD *v9;
_QWORD *i;
_QWORD *v11;
_QWORD *v12;
_QWORD *j;
__int64 v14;
_QWORD *v15;
bool v16;
unsigned int v17;
__int64 v18;
__int64 v19;
__int64 v20;
_QWORD *v21;
__int64 v22;
_QWORD *v23;
__int64 v24;
__int64 v25;
UINT64 *v27;
unsigned __int8 v29;
v2 = a1[1];
KeAcquireSpinLockRaiseToDpc(&IommupPasidTableLock, a2);
v5 = v4;
v29 = v4;
CurrentIrql = KeGetCurrentIrql();
__writecr8(0xFui64);
KxAcquireSpinLock((UINT64 *)(v2 + 24));
v9 = 0i64;
for( i = *(_QWORD **)(v2 + 40); i != (_QWORD *)(v2 + 40); i = (_QWORD *)*i )
{
v9 = i;
if( i[2] == *(_QWORD *)(a2 + 24) )
break;
}
v11 = 0i64;
v12 = v9 + 3;
for( j = (_QWORD *)*v12; j != v12; j = (_QWORD *)*j )
{
v11 = j;
if( j[5] == a2 )
break;
}
v14 = *v11;
v15 = (_QWORD *)v11[1];
if( *(_QWORD **)(*v11 + 8i64) != v11 || (_QWORD *)*v15 != v11 )
goto LABEL_28;
v16 = HalpHvIommu == 0;
*v15 = v14;
*(_QWORD *)(v14 + 8) = v15;
if( !v16 )
{
v17 = *(_DWORD *)(v2 + 16);
v18 = *(_QWORD *)(a2 + 40);
if( (unsigned int)((__int64(__fastcall *)(_QWORD, _QWORD))qword_140C4A258)((unsigned int)v18, v17) == 3473497 )
KeBugCheckEx(0x159u, 0x3001ui64, (unsigned int)v18, v17, 0i64);
v5 = v29;
}
v19 = *(_QWORD *)(a2 + 24);
if( (_QWORD *)*v12 == v12 )
{
if( HalpHvIommu )
IommuHvSetAddressSpace(a1, 0i64, v7, v8, v27);
else(*(void(__fastcall **)(_QWORD, _QWORD, _QWORD, _QWORD))(v19 + 224))(
*(_QWORD *)(v19 + 16),
*(_QWORD *)(a2 + 64),
*(unsigned int *)(v2 + 16),
0i64);
}
KxAcquireSpinLock((UINT64 *)(a2 + 16));
--*(_DWORD *)(a2 + 32);
v20 = v11[2];
v21 = (_QWORD *)v11[3];
if( *(_QWORD **)(v20 + 8) != v11 + 2 || (_QWORD *)*v21 != v11 + 2 )
goto LABEL_28;
*v21 = v20;
*(_QWORD *)(v20 + 8) = v21;
if( !*(_DWORD *)(a2 + 32) && !HalpHvIommu )
{
(*(void(__fastcall **)(_QWORD, _QWORD, _QWORD))(v19 + 208))(*(_QWORD *)(v19 + 16), *(_QWORD *)(a2 + 40), 0i64);
v22 = *(_QWORD *)(a2 + 72);
v23 = *(_QWORD **)(a2 + 80);
if( *(_QWORD *)(v22 + 8) == a2 + 72 && *v23 == a2 + 72 )
{
*v23 = v22;
*(_QWORD *)(v22 + 8) = v23;
*(_QWORD *)(a2 + 64) = 0i64;
goto LABEL_25;
}
LABEL_28:
__fastfail(3u);
}
LABEL_25:
KxReleaseSpinLock((UINT64 *)(a2 + 16));
KxReleaseSpinLock((UINT64 *)(v2 + 24));
__writecr8(CurrentIrql);
v25 = v11[1544];
if( v25 )
HalpMmAllocCtxFree(v24, v25);
HalpMmAllocCtxFree(v24, (__int64)v11);
KxReleaseSpinLock(&IommupPasidTableLock);
__writecr8(v5);
return 0i64;
}Referenced by:
No references.