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