IommuDomainDetachDevice
NTSTATUS __stdcall IommuDomainDetachDevice(_XSTATE_CONFIGURATION *a1, INT64 a2, INT64 a3){
char v3;
__int32 v4;
VOID **v5;
int v6;
volatile __int32 *v7;
unsigned __int8 CurrentIrql;
VOID **v10;
UINT8 v11;
int v12;
_QWORD *v13;
VOID **v14;
_HALP_ALLOC_CONTEXT *v15;
_HALP_ALLOC_CONTEXT *v16;
v3 = 0;
v4 = 0;
v5 = 0i64;
v6 = a3;
v7 = 0i64;
CurrentIrql = KeGetCurrentIrql();
__writecr8(0xCui64);
KxAcquireSpinLock((UINT64 *)&CmpDummyThreadEvent + 514);
v10 = (VOID **)*(&CmpDummyThreadEvent + 512);
if( (_UNKNOWN *)*(&CmpDummyThreadEvent + 512) != (_UNKNOWN *)((char *)&CmpDummyThreadEvent + 4096) )
{
while( 1 )
{
v5 = v10;
if( v10[5] == a1 && v10[2] == (VOID *)a2 && *((_DWORD *)v10 + 6) == v6 )
break;
v10 = (VOID **)*v10;
if( v10 == (VOID **)((char *)&CmpDummyThreadEvent + 4096) )
goto LABEL_6;
}
v7 = (volatile __int32 *)v10[4];
v3 = 1;
v4 = _InterlockedExchange(v7 + 52, 1);
v13 = *v10;
v14 = (VOID **)v10[1];
if( *((VOID ***)*v10 + 1) != v10 || *v14 != v10 )
__fastfail(3u);
*v14 = v13;
v13[1] = v14;
}
LABEL_6:
KxReleaseSpinLock((UINT64 *)&CmpDummyThreadEvent + 514);
__writecr8(CurrentIrql);
if( !v3 )
return -1073741584;
v12 = (unsigned int)HalpIommuLeaveDmaDomain((_KDEVICE_QUEUE *)v7, (UINT64)a1, v11);
if( v12 >= 0 )
{
if( v4 != 2 )
v12 = HalpIommuDeleteDevice((UINT64 *)v7);
HalpMmAllocCtxFree(v15, v5[6]);
HalpMmAllocCtxFree(v16, v5);
}
return v12;
}Referenced by:
No references.