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.