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.