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