ExFreeSvmAsid
VOID __stdcall ExFreeSvmAsid(){
__int64 v0;
int v1;
__int64 v2;
_QWORD *v3;
_QWORD *v4;
__int64 v5;
_QWORD *v6;
v0 = *((_QWORD *)KeGetCurrentThread() + 23);
v1 = *(_DWORD *)(v0 + 2176);
if( v1 )
{
v2 = *(_QWORD *)(v0 + 2184);
v3 = (_QWORD *)(v0 + 2208);
while( 1 )
{
v4 = (_QWORD *)*v3;
if( *(_QWORD **)(*v3 + 8i64) != v3 || (v5 = *v4, *(_QWORD **)(*v4 + 8i64) != v4) )
__fastfail(3u);
*v3 = v5;
*(_QWORD *)(v5 + 8) = v3;
if( v4 == v3 )
break;
v6 = (_QWORD *)v4[2];
(*(void(__fastcall **)(__int64, _QWORD))(HalIommuDispatch + 48))(v2, v6[15]);
ExpSvmDereferenceDevice(v6);
ExFreePoolWithTag(v4, 0);
}
(*(void(__fastcall **)(__int64))(HalIommuDispatch + 64))(v2);
*(_QWORD *)(v0 + 2184) = 0i64;
ExpFreeAsid((unsigned int)(v1 - 1));
}
}Referenced by:
MmCleanProcessAddressSpace