IommuUnmapDevice
NTSTATUS __stdcall IommuUnmapDevice(INT64 a1, _XSTATE_FEATURE *a2, INT64 a3){
unsigned __int8 CurrentIrql;
UINT64 *v6;
_QWORD *v7;
_QWORD *i;
_QWORD *v9;
__int64 *j;
__int64 v11;
_QWORD *v12;
_XSTATE_FEATURE v13;
_XSTATE_FEATURE **v14;
_HALP_ALLOC_CONTEXT *v15;
_HALP_ALLOC_CONTEXT *v16;
VOID *v17;
if( byte_140C49B2C )
{
IommupHvUnmapDevice(*(PVOID *)&a2[5]);
}
else
{
LOBYTE(a3) = 1;
(*(void(__fastcall **)(_QWORD, _QWORD, INT64))(*(_QWORD *)&a2[3] + 200i64))(
*(_QWORD *)(*(_QWORD *)&a2[3] + 16i64),
*(_QWORD *)&a2[5],
a3);
}
CurrentIrql = KeGetCurrentIrql();
__writecr8(0xFui64);
v6 = (UINT64 *)(a1 + 24);
KxAcquireSpinLock((UINT64 *)(a1 + 24));
v7 = 0i64;
for( i = *(_QWORD **)(a1 + 32); i != (_QWORD *)(a1 + 32); i = (_QWORD *)*i )
{
v7 = i;
if( i[2] == *(_QWORD *)&a2[3] )
break;
}
v9 = 0i64;
for( j = (__int64 *)v7[3]; j != v7 + 3; j = (__int64 *)*j )
{
v9 = j;
if( (_XSTATE_FEATURE *)j[5] == a2 )
break;
}
v11 = *v9;
v12 = (_QWORD *)v9[1];
if( *(_QWORD **)(*v9 + 8i64) != v9
|| (_QWORD *)*v12 != v9
|| (*v12 = v11,
*(_QWORD *)(v11 + 8) = v12,
v13 = *a2,
v14 = (_XSTATE_FEATURE **)a2[1],
*(_XSTATE_FEATURE **)(*(_QWORD *)a2 + 8i64) != a2)
|| *v14 != a2 )
{
__fastfail(3u);
}
*v14 = (_XSTATE_FEATURE *)v13;
*(_QWORD *)(*(_QWORD *)&v13 + 8i64) = v14;
KxReleaseSpinLock(v6);
__writecr8(CurrentIrql);
HalpMmAllocCtxFree(v15, a2);
v17 = (VOID *)v9[1544];
if( v17 )
HalpMmAllocCtxFree(v16, v17);
HalpMmAllocCtxFree(v16, v9);
return 0;
}Referenced by:
No references.