IommuDomainDetachDevice
INT64 __fastcall IommuDomainDetachDevice(LONGLONG a1, INT64 a2, INT64 a3){
char v3;
__int32 v4;
__int64 v5;
int v6;
__int64 v7;
unsigned __int8 CurrentIrql;
__int64 v10;
UINT8 v11;
int v12;
__int64 v13;
__int64 *v14;
__int64 v15;
__int64 v16;
v3 = 0;
v4 = 0;
v5 = 0i64;
v6 = a3;
v7 = 0i64;
CurrentIrql = KeGetCurrentIrql();
__writecr8(0xCui64);
KxAcquireSpinLock(&HalpIommuParaVirtDeviceCacheLock);
v10 = HalpIommuParaVirtDeviceCache;
if( (__int64 *)HalpIommuParaVirtDeviceCache != &HalpIommuParaVirtDeviceCache )
{
while( 1 )
{
v5 = v10;
if( *(_QWORD *)(v10 + 40) == a1 && *(_QWORD *)(v10 + 16) == a2 && *(_DWORD *)(v10 + 24) == v6 )
break;
v10 = *(_QWORD *)v10;
if( (__int64 *)v10 == &HalpIommuParaVirtDeviceCache )
goto LABEL_6;
}
v7 = *(_QWORD *)(v10 + 32);
v3 = 1;
v4 = _InterlockedExchange((volatile __int32 *)(v7 + 208), 1);
v13 = *(_QWORD *)v10;
v14 = *(__int64 **)(v10 + 8);
if( *(_QWORD *)(*(_QWORD *)v10 + 8i64) != v10 || *v14 != v10 )
__fastfail(3u);
*v14 = v13;
*(_QWORD *)(v13 + 8) = v14;
}
LABEL_6:
KxReleaseSpinLock(&HalpIommuParaVirtDeviceCacheLock);
__writecr8(CurrentIrql);
if( v3 )
{
v12 = (unsigned int)HalpIommuLeaveDmaDomain((KDEVICE_QUEUE *)v7, a1, v11);
if( v12 >= 0 )
{
if( v4 != 2 )
v12 = HalpIommuDeleteDevice((UINT64 *)v7);
HalpMmAllocCtxFree(v15, *(_QWORD *)(v5 + 48));
HalpMmAllocCtxFree(v16, v5);
}
}
else
{
return(unsigned int)-1073741584;
}
return(unsigned int)v12;
}Referenced by:
No references.