IommuEnableDevicePasid
NTSTATUS __stdcall IommuEnableDevicePasid(INT64 *a1, INT64 a2){
INT64 v2;
INT64 v4;
UINT8 *v5;
__int64 v6;
UINT8 *v7;
_HALP_ALLOC_CONTEXT *v8;
UINT8 *v9;
_HALP_ALLOC_CONTEXT *v10;
UINT8 *v11;
NTSTATUS v12;
_HALP_ALLOC_CONTEXT *v13;
UINT8 *v14;
_HALP_ALLOC_CONTEXT *v15;
__int64 v16;
UINT8 *v17;
bool v18;
UINT8 *v19;
UINT8 *v20;
UINT8 *v21;
_HALP_ALLOC_CONTEXT *v22;
VOID *v23;
UINT8 *v24;
__int64 v25;
char *v26;
_QWORD *v27;
__int64 v28;
UINT8 *v29;
int v30;
char *v31;
__int64 v32;
__int64 v33;
_QWORD *v34;
__int64 v35;
unsigned __int8 CurrentIrql;
UINT64 *v37;
UINT8 **v38;
UINT8 *v39;
__int64 v40;
__int64 v41;
UINT8 *v42;
UINT8 *v43;
UINT8 **v44;
__int64 v45;
INT64 v46;
UINT8 *v47;
__int64 v48;
_QWORD *v49;
VOID *v50;
unsigned __int8 v52;
INT64 v53;
v2 = a1[1];
v4 = *a1;
v5 = 0i64;
v6 = *(_QWORD *)(a2 + 24);
v53 = v2;
v7 = 0i64;
v52 = KeAcquireSpinLockRaiseToDpc((UINT64 *)&CmpDummyThreadEvent + 518);
v9 = HalpMmAllocCtxAlloc(v8, 0x28ui64);
v11 = v9;
if( !v9 )
goto LABEL_2;
*((_QWORD *)v9 + 2) = *(_QWORD *)(a2 + 24);
*((_QWORD *)v9 + 4) = v9 + 24;
*((_QWORD *)v9 + 3) = v9 + 24;
v14 = HalpMmAllocCtxAlloc(v10, 0x3048ui64);
v5 = v14;
if( !v14 )
goto LABEL_2;
memset(v14, 0i64, 0x3048u);
if( byte_140C49B2C )
{
v16 = v6 + 24;
v17 = HalpMmAllocCtxAlloc(v15, (unsigned int)(*(_DWORD *)(v6 + 44) << 9));
*((_QWORD *)v5 + 1544) = v17;
if( !v17 )
goto LABEL_2;
}
else
{
v16 = v6 + 384;
}
*((_QWORD *)v5 + 5) = a2;
v5[32] = 0;
*((_QWORD *)v5 + 6) = v2;
v18 = byte_140C49B2C == 0;
*((_DWORD *)v5 + 15) = *(_DWORD *)(v16 + 16);
if( !v18 )
{
v12 = ((__int64(__fastcall *)(_QWORD, _QWORD))qword_140C4A250)(*(_QWORD *)(a2 + 40), *(unsigned int *)(v2 + 16));
if( v12 < 0 )
goto LABEL_3;
goto LABEL_34;
}
v19 = (UINT8 *)(v6 + 368);
v20 = *(UINT8 **)(v6 + 368);
if( v20 != (UINT8 *)(v6 + 368) )
{
v15 = (_HALP_ALLOC_CONTEXT *)*(unsigned int *)(v4 + 16);
do
{
v7 = v20;
if( *((_DWORD *)v20 + 4) == (_DWORD)v15 )
break;
v20 = *(UINT8 **)v20;
}
while( v20 != v19 );
}
v21 = *(UINT8 **)(a2 + 64);
if( v21 && v21 != v7 )
{
v12 = -1073741823;
LABEL_16:
v7 = 0i64;
goto LABEL_3;
}
if( v7 && *((_DWORD *)v7 + 4) == *(_DWORD *)(v4 + 16) )
{
v2 = v53;
v12 = (*(__int64(__fastcall **)(_QWORD, UINT8 *, _QWORD))(v6 + 216))(
*(_QWORD *)(v6 + 16),
v7,
*(unsigned int *)(v53 + 16));
if( v12 < 0 )
goto LABEL_16;
v23 = (VOID *)*((_QWORD *)v7 + 7);
if( v23 )
{
v24 = (UINT8 *)*((_QWORD *)v7 + 3);
if( v24 != v7 + 24 )
{
do
{
(*(void(__fastcall **)(_QWORD, _QWORD, UINT8 *))(v6 + 208))(*(_QWORD *)(v6 + 16), *((_QWORD *)v24 - 4), v7);
v24 = *(UINT8 **)v24;
}
while( v24 != v7 + 24 );
v23 = (VOID *)*((_QWORD *)v7 + 7);
}
HalpMmAllocCtxFree(v22, v23);
*((_QWORD *)v7 + 7) = 0i64;
v2 = v53;
}
if( !*(_QWORD *)(a2 + 64) )
{
v25 = *(_QWORD *)(a2 + 40);
*(_QWORD *)(a2 + 64) = v7;
(*(void(__fastcall **)(_QWORD, __int64, UINT8 *))(v6 + 208))(*(_QWORD *)(v6 + 16), v25, v7);
v26 = (char *)(v7 + 24);
v27 = (_QWORD *)(a2 + 72);
v28 = *(_QWORD *)v26;
if( *(char **)(*(_QWORD *)v26 + 8i64) != v26 )
goto LABEL_44;
*v27 = v28;
*(_QWORD *)(a2 + 80) = v26;
*(_QWORD *)(v28 + 8) = v27;
*(_QWORD *)v26 = v27;
}
goto LABEL_34;
}
v29 = HalpMmAllocCtxAlloc(v15, 0x40ui64);
v7 = v29;
if( v29 )
{
memset(v29, 0i64, 0x40u);
v30 = *(_DWORD *)(v4 + 16);
v31 = (char *)(v7 + 24);
*((_DWORD *)v7 + 4) = v30;
*((_QWORD *)v7 + 4) = v7 + 24;
*((_QWORD *)v7 + 3) = v7 + 24;
*((_QWORD *)v7 + 5) = 0i64;
*((_QWORD *)v7 + 7) = 0i64;
v12 = (*(__int64(__fastcall **)(_QWORD, UINT8 *, _QWORD))(v6 + 216))(
*(_QWORD *)(v6 + 16),
v7,
*(unsigned int *)(v53 + 16));
if( v12 < 0 )
goto LABEL_3;
v32 = *(_QWORD *)(a2 + 40);
*(_QWORD *)(a2 + 64) = v7;
(*(void(__fastcall **)(_QWORD, __int64, UINT8 *))(v6 + 208))(*(_QWORD *)(v6 + 16), v32, v7);
v33 = *(_QWORD *)v31;
v34 = (_QWORD *)(a2 + 72);
if( *(char **)(*(_QWORD *)v31 + 8i64) != v31 )
goto LABEL_44;
*v34 = v33;
*(_QWORD *)(a2 + 80) = v31;
*(_QWORD *)(v33 + 8) = v34;
*(_QWORD *)v31 = v34;
v35 = *(_QWORD *)v19;
if( *(UINT8 **)(*(_QWORD *)v19 + 8i64) != v19 )
goto LABEL_44;
*((_QWORD *)v7 + 1) = v19;
*(_QWORD *)v7 = v35;
*(_QWORD *)(v35 + 8) = v7;
*(_QWORD *)v19 = v7;
v2 = v53;
LABEL_34:
CurrentIrql = KeGetCurrentIrql();
__writecr8(0xFui64);
KxAcquireSpinLock((UINT64 *)(v2 + 24));
v37 = (UINT64 *)(a2 + 16);
KxAcquireSpinLock((UINT64 *)(a2 + 16));
++*(_DWORD *)(a2 + 32);
v38 = (UINT8 **)(v53 + 40);
v39 = *(UINT8 **)(v53 + 40);
if( v39 == (UINT8 *)(v53 + 40) )
goto LABEL_39;
v40 = *(_QWORD *)(a2 + 24);
do
{
v41 = *((_QWORD *)v39 + 2);
v42 = v39;
if( v41 == v40 )
goto LABEL_41;
v39 = *(UINT8 **)v39;
}
while( v39 != (UINT8 *)v38 );
if( v41 != v40 )
{
LABEL_39:
v43 = *v38;
if( *((UINT8 ***)*v38 + 1) != v38 )
goto LABEL_44;
*(_QWORD *)v11 = v43;
v42 = v11;
*((_QWORD *)v11 + 1) = v38;
*((_QWORD *)v43 + 1) = v11;
*v38 = v11;
v11 = 0i64;
}
LABEL_41:
v44 = (UINT8 **)(v42 + 24);
v45 = *((_QWORD *)v42 + 3);
if( *(UINT8 **)(v45 + 8) == v42 + 24 )
{
*((_QWORD *)v5 + 1) = v44;
v46 = a2 + 88;
*(_QWORD *)v5 = v45;
*(_QWORD *)(v45 + 8) = v5;
*v44 = v5;
v47 = v5;
v48 = *(_QWORD *)v46;
v5 = 0i64;
v49 = v47 + 16;
if( *(_QWORD *)(*(_QWORD *)v46 + 8i64) == v46 )
{
*v49 = v48;
v49[1] = v46;
*(_QWORD *)(v48 + 8) = v49;
*(_QWORD *)v46 = v49;
KxReleaseSpinLock(v37);
KxReleaseSpinLock((UINT64 *)(v2 + 24));
__writecr8(CurrentIrql);
v7 = 0i64;
goto LABEL_3;
}
}
LABEL_44:
__fastfail(3u);
}
LABEL_2:
v12 = -1073741670;
LABEL_3:
KxReleaseSpinLock((UINT64 *)&CmpDummyThreadEvent + 518);
__writecr8(v52);
if( v11 )
HalpMmAllocCtxFree(v13, v11);
if( v5 )
{
v50 = (VOID *)*((_QWORD *)v5 + 1544);
if( v50 )
HalpMmAllocCtxFree(v13, v50);
HalpMmAllocCtxFree(v13, v5);
}
if( v7 )
HalpMmAllocCtxFree(v13, v7);
return v12;
}Referenced by:
No references.