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