IommupGetSystemContext
VOID **__fastcall IommupGetSystemContext(UINT64 a1){
unsigned int v1;
UINT8 *v2;
unsigned __int8 CurrentIrql;
UINT8 *i;
_HALP_ALLOC_CONTEXT *v5;
UINT8 *v6;
UINT8 *v7;
unsigned __int8 v8;
__int64 *v9;
__int64 v10;
_HALP_ALLOC_CONTEXT *v12;
int v13;
v1 = a1;
v2 = 0i64;
CurrentIrql = KeGetCurrentIrql();
__writecr8(0xFui64);
KxAcquireSpinLock((UINT64 *)&CmpDummyThreadEvent + 519);
for( i = (UINT8 *)*(&CmpDummyThreadEvent + 520); i != (UINT8 *)((char *)&CmpDummyThreadEvent + 4160); i = *(UINT8 **)i )
{
v2 = i;
if( *((_DWORD *)i + 4) == v1 )
break;
}
KxReleaseSpinLock((UINT64 *)&CmpDummyThreadEvent + 519);
__writecr8(CurrentIrql);
if( v2 && *((_DWORD *)v2 + 4) == v1 )
return(VOID **)v2;
v6 = HalpMmAllocCtxAlloc(v5, 0x40ui64);
v7 = v6;
if( v6 )
{
memset(v6, 0i64, 0x40u);
*((_DWORD *)v7 + 4) = v1;
*((_QWORD *)v7 + 5) = v7 + 32;
*((_QWORD *)v7 + 4) = v7 + 32;
*((_QWORD *)v7 + 7) = v7 + 48;
*((_QWORD *)v7 + 6) = v7 + 48;
*((_QWORD *)v7 + 3) = 0i64;
v8 = KeGetCurrentIrql();
__writecr8(0xFui64);
KxAcquireSpinLock((UINT64 *)&CmpDummyThreadEvent + 519);
v9 = (__int64 *)*(&CmpDummyThreadEvent + 520);
if( (_UNKNOWN *)*(&CmpDummyThreadEvent + 520) == (_UNKNOWN *)((char *)&CmpDummyThreadEvent + 4160) )
{
LABEL_6:
if( byte_140C49B2C
&& (!*(&CmpDummyThreadEvent + 4121)
|| (int)((__int64(__fastcall *)(_QWORD, _QWORD))qword_140C4A228)(v1, *(&CmpDummyThreadEvent + 1032)) < 0) )
{
KxReleaseSpinLock((UINT64 *)&CmpDummyThreadEvent + 519);
__writecr8(v8);
HalpMmAllocCtxFree(v12, v7);
return 0i64;
}
v10 = *(&CmpDummyThreadEvent + 520);
if( *(_UNKNOWN **)(*(&CmpDummyThreadEvent + 520) + 8i64) != (_UNKNOWN *)((char *)&CmpDummyThreadEvent + 4160) )
__fastfail(3u);
*(_QWORD *)v7 = *(&CmpDummyThreadEvent + 520);
v2 = v7;
*((_QWORD *)v7 + 1) = (char *)&CmpDummyThreadEvent + 4160;
*(_QWORD *)(v10 + 8) = v7;
*(&CmpDummyThreadEvent + 520) = v7;
v7 = 0i64;
}
else
{
while( 1 )
{
v13 = *((_DWORD *)v9 + 4);
v2 = (UINT8 *)v9;
if( v13 == v1 )
break;
v9 = (__int64 *)*v9;
if( v9 == (__int64 *)((char *)&CmpDummyThreadEvent + 4160) )
{
if( v13 == v1 )
break;
goto LABEL_6;
}
}
}
KxReleaseSpinLock((UINT64 *)&CmpDummyThreadEvent + 519);
__writecr8(v8);
if( v7 )
HalpMmAllocCtxFree((_HALP_ALLOC_CONTEXT *)v8, v7);
return(VOID **)v2;
}
return 0i64;
}Referenced by:
IommuGetConfiguration
IommuGetLibraryContext
IommuHvGetConfiguration