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.