ExFreeSvmAsid

VOID __stdcall ExFreeSvmAsid(){
  _EPROCESS *Process; 
  int DeviceAsid; 
  void *SvmData; 
  _LIST_ENTRY *p_SvmProcessDeviceListHead; 
  _LIST_ENTRY *Flink; 
  _LIST_ENTRY *v5; 
  _LIST_ENTRY *v6; 

  Process = KeGetCurrentThread()->ApcState.Process;
  DeviceAsid = Process->DeviceAsid;
  if( DeviceAsid )
  {
    SvmData = Process->SvmData;
    p_SvmProcessDeviceListHead = &Process->SvmProcessDeviceListHead;
    while( 1 )
    {
      Flink = p_SvmProcessDeviceListHead->Flink;
      if( p_SvmProcessDeviceListHead->Flink->Blink != p_SvmProcessDeviceListHead
        || (v5 = Flink->Flink, Flink->Flink->Blink != Flink) )
      {
        __fastfail(3u);
      }
      p_SvmProcessDeviceListHead->Flink = v5;
      v5->Blink = p_SvmProcessDeviceListHead;
      if( Flink == p_SvmProcessDeviceListHead )
        break;
      v6 = Flink[1].Flink;
      (*((void(__fastcall **)(void *, _LIST_ENTRY *))HalIommuDispatch + 6))(SvmData, v6[7].Blink);
      ExpSvmDereferenceDevice((_EXP_SVM_DEVICE *)v6);
      ExFreePoolWithTag(Flink, 0);
    }
    (*((void(__fastcall **)(void *))HalIommuDispatch + 8))(SvmData);
    Process->SvmData = 0i64;
    ExpFreeAsid((unsigned int)(DeviceAsid - 1));
  }
}

Referenced by:

MmCleanProcessAddressSpace