IommuUnmapDevice
__int64 __fastcall IommuUnmapDevice(__int64 a1, PVOID *a2, __int64 a3){
unsigned __int8 CurrentIrql;
UINT64 *v6;
__int64 *v7;
__int64 *i;
__int64 *v9;
__int64 *j;
__int64 *v11;
__int64 **v12;
PVOID *v13;
PVOID **v14;
__int64 v15;
__int64 v16;
__int64 v17;
if( HalpHvIommu )
{
IommupHvUnmapDevice(a2[5]);
}
else
{
LOBYTE(a3) = 1;
(*((void(__fastcall **)(_QWORD, PVOID, __int64))a2[3] + 25))(*((_QWORD *)a2[3] + 2), a2[5], a3);
}
CurrentIrql = KeGetCurrentIrql();
__writecr8(0xFui64);
v6 = (UINT64 *)(a1 + 24);
KxAcquireSpinLock((UINT64 *)(a1 + 24));
v7 = 0i64;
for( i = *(__int64 **)(a1 + 32); i != (__int64 *)(a1 + 32); i = (__int64 *)*i )
{
v7 = i;
if( (PVOID)i[2] == a2[3] )
break;
}
v9 = 0i64;
for( j = (__int64 *)v7[3]; j != v7 + 3; j = (__int64 *)*j )
{
v9 = j;
if( (PVOID *)j[5] == a2 )
break;
}
v11 = (__int64 *)*v9;
v12 = (__int64 **)v9[1];
if( *(__int64 **)(*v9 + 8) != v9
|| *v12 != v9
|| (*v12 = v11, v11[1] = (__int64)v12, v13 = (PVOID *)*a2, v14 = (PVOID **)a2[1], *((PVOID **)*a2 + 1) != a2)
|| *v14 != a2 )
{
__fastfail(3u);
}
*v14 = v13;
v13[1] = v14;
KxReleaseSpinLock(v6);
__writecr8(CurrentIrql);
HalpMmAllocCtxFree(v15, (__int64)a2);
v17 = v9[1544];
if( v17 )
HalpMmAllocCtxFree(v16, v17);
HalpMmAllocCtxFree(v16, (__int64)v9);
return 0i64;
}Referenced by:
No references.