IommuEnableDevicePasid

INT64 __fastcall IommuEnableDevicePasid(INT64 *a1, INT64 a2){
  INT64 v2; 
  INT64 v4; 
  __int64 v5; 
  __int64 v6; 
  __int64 v7; 
  unsigned __int8 v8; 
  __int64 v9; 
  _QWORD *v10; 
  __int64 v11; 
  _QWORD *v12; 
  int v13; 
  __int64 v14; 
  __int64 v15; 
  __int64 v16; 
  __int64 v17; 
  __int64 v18; 
  bool v19; 
  __int64 *v20; 
  __int64 v21; 
  __int64 v22; 
  __int64 v23; 
  __int64 v24; 
  _QWORD *v25; 
  __int64 v26; 
  __int64 v27; 
  _QWORD *v28; 
  __int64 v29; 
  __int64 v30; 
  int v31; 
  __int64 v32; 
  __int64 v33; 
  __int64 v34; 
  _QWORD *v35; 
  __int64 v36; 
  unsigned __int8 CurrentIrql; 
  UINT64 *v38; 
  _QWORD *v39; 
  _QWORD *v40; 
  __int64 v41; 
  __int64 v42; 
  _QWORD *v43; 
  __int64 v44; 
  __int64 *v45; 
  __int64 v46; 
  INT64 v47; 
  __int64 v48; 
  __int64 v49; 
  _QWORD *v50; 
  __int64 v51; 
  unsigned __int8 v53; 
  INT64 v54; 
  v2 = a1[1];
  v4 = *a1;
  v5 = 0i64;
  v6 = *(_QWORD *)(a2 + 24);
  v54 = v2;
  v7 = 0i64;
  KeAcquireSpinLockRaiseToDpc(&IommupPasidTableLock, a2);
  v53 = v8;
  v10 = (_QWORD *)HalpMmAllocCtxAlloc(v9, 40i64);
  v12 = v10;
  if( !v10 )
    goto LABEL_2;
  v10[2] = *(_QWORD *)(a2 + 24);
  v10[4] = v10 + 3;
  v10[3] = v10 + 3;
  v15 = HalpMmAllocCtxAlloc(v11, 12360i64);
  v5 = v15;
  if( !v15 )
    goto LABEL_2;
  memset(v15, 0i64);
  if( HalpHvIommu )
  {
    v17 = v6 + 24;
    v18 = HalpMmAllocCtxAlloc(v16, (unsigned int)(*(_DWORD *)(v6 + 44) << 9));
    *(_QWORD *)(v5 + 12352) = v18;
    if( !v18 )
      goto LABEL_2;
  }
  else
  {
    v17 = v6 + 384;
  }
  *(_QWORD *)(v5 + 40) = a2;
  *(_BYTE *)(v5 + 32) = 0;
  *(_QWORD *)(v5 + 48) = v2;
  v19 = HalpHvIommu == 0;
  *(_DWORD *)(v5 + 60) = *(_DWORD *)(v17 + 16);
  if( !v19 )
  {
    v13 = ((__int64(__fastcall *)(_QWORD, _QWORD))qword_140C4A250)(*(_QWORD *)(a2 + 40), *(unsigned int *)(v2 + 16));
    if( v13 < 0 )
      goto LABEL_3;
    goto LABEL_34;
  }
  v20 = (__int64 *)(v6 + 368);
  v21 = *(_QWORD *)(v6 + 368);
  if( v21 != v6 + 368 )
  {
    v16 = *(unsigned int *)(v4 + 16);
    do
    {
      v7 = v21;
      if( *(_DWORD *)(v21 + 16) == (_DWORD)v16 )
        break;
      v21 = *(_QWORD *)v21;
    }
    while( (__int64 *)v21 != v20 );
  }
  v22 = *(_QWORD *)(a2 + 64);
  if( v22 && v22 != v7 )
  {
    v13 = -1073741823;
LABEL_16:
    v7 = 0i64;
    goto LABEL_3;
  }
  if( v7 && *(_DWORD *)(v7 + 16) == *(_DWORD *)(v4 + 16) )
  {
    v2 = v54;
    v13 = (*(__int64(__fastcall **)(_QWORD, __int64, _QWORD))(v6 + 216))(
            *(_QWORD *)(v6 + 16),
            v7,
            *(unsigned int *)(v54 + 16));
    if( v13 < 0 )
      goto LABEL_16;
    v24 = *(_QWORD *)(v7 + 56);
    if( v24 )
    {
      v25 = *(_QWORD **)(v7 + 24);
      if( v25 != (_QWORD *)(v7 + 24) )
      {
        do
        {
          (*(void(__fastcall **)(_QWORD, _QWORD, __int64))(v6 + 208))(*(_QWORD *)(v6 + 16), *(v25 - 4), v7);
          v25 = (_QWORD *)*v25;
        }
        while( v25 != (_QWORD *)(v7 + 24) );
        v24 = *(_QWORD *)(v7 + 56);
      }
      HalpMmAllocCtxFree(v23, v24);
      *(_QWORD *)(v7 + 56) = 0i64;
      v2 = v54;
    }
    if( !*(_QWORD *)(a2 + 64) )
    {
      v26 = *(_QWORD *)(a2 + 40);
      *(_QWORD *)(a2 + 64) = v7;
      (*(void(__fastcall **)(_QWORD, __int64, __int64))(v6 + 208))(*(_QWORD *)(v6 + 16), v26, v7);
      v27 = v7 + 24;
      v28 = (_QWORD *)(a2 + 72);
      v29 = *(_QWORD *)v27;
      if( *(_QWORD *)(*(_QWORD *)v27 + 8i64) != v27 )
        goto LABEL_44;
      *v28 = v29;
      *(_QWORD *)(a2 + 80) = v27;
      *(_QWORD *)(v29 + 8) = v28;
      *(_QWORD *)v27 = v28;
    }
    goto LABEL_34;
  }
  v30 = HalpMmAllocCtxAlloc(v16, 64i64);
  v7 = v30;
  if( v30 )
  {
    memset(v30, 0i64);
    v31 = *(_DWORD *)(v4 + 16);
    v32 = v7 + 24;
    *(_DWORD *)(v7 + 16) = v31;
    *(_QWORD *)(v7 + 32) = v7 + 24;
    *(_QWORD *)(v7 + 24) = v7 + 24;
    *(_QWORD *)(v7 + 40) = 0i64;
    *(_QWORD *)(v7 + 56) = 0i64;
    v13 = (*(__int64(__fastcall **)(_QWORD, __int64, _QWORD))(v6 + 216))(
            *(_QWORD *)(v6 + 16),
            v7,
            *(unsigned int *)(v54 + 16));
    if( v13 < 0 )
      goto LABEL_3;
    v33 = *(_QWORD *)(a2 + 40);
    *(_QWORD *)(a2 + 64) = v7;
    (*(void(__fastcall **)(_QWORD, __int64, __int64))(v6 + 208))(*(_QWORD *)(v6 + 16), v33, v7);
    v34 = *(_QWORD *)v32;
    v35 = (_QWORD *)(a2 + 72);
    if( *(_QWORD *)(*(_QWORD *)v32 + 8i64) != v32 )
      goto LABEL_44;
    *v35 = v34;
    *(_QWORD *)(a2 + 80) = v32;
    *(_QWORD *)(v34 + 8) = v35;
    *(_QWORD *)v32 = v35;
    v36 = *v20;
    if( *(__int64 **)(*v20 + 8) != v20 )
      goto LABEL_44;
    *(_QWORD *)(v7 + 8) = v20;
    *(_QWORD *)v7 = v36;
    *(_QWORD *)(v36 + 8) = v7;
    *v20 = v7;
    v2 = v54;
LABEL_34:
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(0xFui64);
    KxAcquireSpinLock((UINT64 *)(v2 + 24));
    v38 = (UINT64 *)(a2 + 16);
    KxAcquireSpinLock((UINT64 *)(a2 + 16));
    ++*(_DWORD *)(a2 + 32);
    v39 = (_QWORD *)(v54 + 40);
    v40 = *(_QWORD **)(v54 + 40);
    if( v40 == (_QWORD *)(v54 + 40) )
      goto LABEL_39;
    v41 = *(_QWORD *)(a2 + 24);
    do
    {
      v42 = v40[2];
      v43 = v40;
      if( v42 == v41 )
        goto LABEL_41;
      v40 = (_QWORD *)*v40;
    }
    while( v40 != v39 );
    if( v42 != v41 )
    {
LABEL_39:
      v44 = *v39;
      if( *(_QWORD **)(*v39 + 8i64) != v39 )
        goto LABEL_44;
      *v12 = v44;
      v43 = v12;
      v12[1] = v39;
      *(_QWORD *)(v44 + 8) = v12;
      *v39 = v12;
      v12 = 0i64;
    }
LABEL_41:
    v45 = v43 + 3;
    v46 = v43[3];
    if( *(_QWORD **)(v46 + 8) == v43 + 3 )
    {
      *(_QWORD *)(v5 + 8) = v45;
      v47 = a2 + 88;
      *(_QWORD *)v5 = v46;
      *(_QWORD *)(v46 + 8) = v5;
      *v45 = v5;
      v48 = v5;
      v49 = *(_QWORD *)v47;
      v5 = 0i64;
      v50 = (_QWORD *)(v48 + 16);
      if( *(_QWORD *)(*(_QWORD *)v47 + 8i64) == v47 )
      {
        *v50 = v49;
        v50[1] = v47;
        *(_QWORD *)(v49 + 8) = v50;
        *(_QWORD *)v47 = v50;
        KxReleaseSpinLock(v38);
        KxReleaseSpinLock((UINT64 *)(v2 + 24));
        __writecr8(CurrentIrql);
        v7 = 0i64;
        goto LABEL_3;
      }
    }
LABEL_44:
    __fastfail(3u);
  }
LABEL_2:
  v13 = -1073741670;
LABEL_3:
  KxReleaseSpinLock(&IommupPasidTableLock);
  __writecr8(v53);
  if( v12 )
    HalpMmAllocCtxFree(v14, (__int64)v12);
  if( v5 )
  {
    v51 = *(_QWORD *)(v5 + 12352);
    if( v51 )
      HalpMmAllocCtxFree(v14, v51);
    HalpMmAllocCtxFree(v14, v5);
  }
  if( v7 )
    HalpMmAllocCtxFree(v14, v7);
  return(unsigned int)v13;
}

Referenced by:

No references.