IommuDisableDevicePasid

INT64 __fastcall IommuDisableDevicePasid(_QWORD *a1, INT64 a2){
  __int64 v2; 
  unsigned __int8 v4; 
  unsigned __int8 v5; 
  unsigned __int8 CurrentIrql; 
  UINT64 *v7; 
  UINT64 *v8; 
  _QWORD *v9; 
  _QWORD *i; 
  _QWORD *v11; 
  _QWORD *v12; 
  _QWORD *j; 
  __int64 v14; 
  _QWORD *v15; 
  bool v16; 
  unsigned int v17; 
  __int64 v18; 
  __int64 v19; 
  __int64 v20; 
  _QWORD *v21; 
  __int64 v22; 
  _QWORD *v23; 
  __int64 v24; 
  __int64 v25; 
  UINT64 *v27; 
  unsigned __int8 v29; 
  v2 = a1[1];
  KeAcquireSpinLockRaiseToDpc(&IommupPasidTableLock, a2);
  v5 = v4;
  v29 = v4;
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(0xFui64);
  KxAcquireSpinLock((UINT64 *)(v2 + 24));
  v9 = 0i64;
  for( i = *(_QWORD **)(v2 + 40); i != (_QWORD *)(v2 + 40); i = (_QWORD *)*i )
  {
    v9 = i;
    if( i[2] == *(_QWORD *)(a2 + 24) )
      break;
  }
  v11 = 0i64;
  v12 = v9 + 3;
  for( j = (_QWORD *)*v12; j != v12; j = (_QWORD *)*j )
  {
    v11 = j;
    if( j[5] == a2 )
      break;
  }
  v14 = *v11;
  v15 = (_QWORD *)v11[1];
  if( *(_QWORD **)(*v11 + 8i64) != v11 || (_QWORD *)*v15 != v11 )
    goto LABEL_28;
  v16 = HalpHvIommu == 0;
  *v15 = v14;
  *(_QWORD *)(v14 + 8) = v15;
  if( !v16 )
  {
    v17 = *(_DWORD *)(v2 + 16);
    v18 = *(_QWORD *)(a2 + 40);
    if( (unsigned int)((__int64(__fastcall *)(_QWORD, _QWORD))qword_140C4A258)((unsigned int)v18, v17) == 3473497 )
      KeBugCheckEx(0x159u, 0x3001ui64, (unsigned int)v18, v17, 0i64);
    v5 = v29;
  }
  v19 = *(_QWORD *)(a2 + 24);
  if( (_QWORD *)*v12 == v12 )
  {
    if( HalpHvIommu )
      IommuHvSetAddressSpace(a1, 0i64, v7, v8, v27);
    else(*(void(__fastcall **)(_QWORD, _QWORD, _QWORD, _QWORD))(v19 + 224))(
        *(_QWORD *)(v19 + 16),
        *(_QWORD *)(a2 + 64),
        *(unsigned int *)(v2 + 16),
        0i64);
  }
  KxAcquireSpinLock((UINT64 *)(a2 + 16));
  --*(_DWORD *)(a2 + 32);
  v20 = v11[2];
  v21 = (_QWORD *)v11[3];
  if( *(_QWORD **)(v20 + 8) != v11 + 2 || (_QWORD *)*v21 != v11 + 2 )
    goto LABEL_28;
  *v21 = v20;
  *(_QWORD *)(v20 + 8) = v21;
  if( !*(_DWORD *)(a2 + 32) && !HalpHvIommu )
  {
    (*(void(__fastcall **)(_QWORD, _QWORD, _QWORD))(v19 + 208))(*(_QWORD *)(v19 + 16), *(_QWORD *)(a2 + 40), 0i64);
    v22 = *(_QWORD *)(a2 + 72);
    v23 = *(_QWORD **)(a2 + 80);
    if( *(_QWORD *)(v22 + 8) == a2 + 72 && *v23 == a2 + 72 )
    {
      *v23 = v22;
      *(_QWORD *)(v22 + 8) = v23;
      *(_QWORD *)(a2 + 64) = 0i64;
      goto LABEL_25;
    }
LABEL_28:
    __fastfail(3u);
  }
LABEL_25:
  KxReleaseSpinLock((UINT64 *)(a2 + 16));
  KxReleaseSpinLock((UINT64 *)(v2 + 24));
  __writecr8(CurrentIrql);
  v25 = v11[1544];
  if( v25 )
    HalpMmAllocCtxFree(v24, v25);
  HalpMmAllocCtxFree(v24, (__int64)v11);
  KxReleaseSpinLock(&IommupPasidTableLock);
  __writecr8(v5);
  return 0i64;
}

Referenced by:

No references.