IommupGetSystemContext

VOID **__fastcall IommupGetSystemContext(UINT64 a1){
  unsigned int v1; 
  PVOID *v2; 
  unsigned __int8 CurrentIrql; 
  PVOID *i; 
  __int64 v5; 
  __int64 v6; 
  _DWORD *v7; 
  unsigned __int8 v8; 
  PVOID *v9; 
  _QWORD *v10; 
  __int64 v12; 
  int v13; 
  v1 = a1;
  v2 = 0i64;
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(0xFui64);
  KxAcquireSpinLock(&IommupSystemContextListLock);
  for( i = (PVOID *)IommupSystemContextListHead; i != &IommupSystemContextListHead; i = (PVOID *)*i )
  {
    v2 = i;
    if( *((_DWORD *)i + 4) == v1 )
      break;
  }
  KxReleaseSpinLock(&IommupSystemContextListLock);
  __writecr8(CurrentIrql);
  if( v2 && *((_DWORD *)v2 + 4) == v1 )
    return v2;
  v6 = HalpMmAllocCtxAlloc(v5, 64i64);
  v7 = (_DWORD *)v6;
  if( v6 )
  {
    memset(v6, 0i64);
    v7[4] = v1;
    *((_QWORD *)v7 + 5) = v7 + 8;
    *((_QWORD *)v7 + 4) = v7 + 8;
    *((_QWORD *)v7 + 7) = v7 + 12;
    *((_QWORD *)v7 + 6) = v7 + 12;
    *((_QWORD *)v7 + 3) = 0i64;
    v8 = KeGetCurrentIrql();
    __writecr8(0xFui64);
    KxAcquireSpinLock(&IommupSystemContextListLock);
    v9 = (PVOID *)IommupSystemContextListHead;
    if( IommupSystemContextListHead == &IommupSystemContextListHead )
    {
LABEL_6:
      if( HalpHvIommu
        && (!IommupHvSvmEnabled
         || (int)((__int64(__fastcall *)(_QWORD, _QWORD))qword_140C4A228)(v1, (unsigned int)IommupHvMaximumAsids) < 0) )
      {
        KxReleaseSpinLock(&IommupSystemContextListLock);
        __writecr8(v8);
        HalpMmAllocCtxFree(v12, (__int64)v7);
        return 0i64;
      }
      v10 = IommupSystemContextListHead;
      if( *((PVOID **)IommupSystemContextListHead + 1) != &IommupSystemContextListHead )
        __fastfail(3u);
      *(_QWORD *)v7 = IommupSystemContextListHead;
      v2 = (PVOID *)v7;
      *((_QWORD *)v7 + 1) = &IommupSystemContextListHead;
      v10[1] = v7;
      IommupSystemContextListHead = v7;
      v7 = 0i64;
    }
    else
    {
      while( 1 )
      {
        v13 = *((_DWORD *)v9 + 4);
        v2 = v9;
        if( v13 == v1 )
          break;
        v9 = (PVOID *)*v9;
        if( v9 == &IommupSystemContextListHead )
        {
          if( v13 == v1 )
            break;
          goto LABEL_6;
        }
      }
    }
    KxReleaseSpinLock(&IommupSystemContextListLock);
    __writecr8(v8);
    if( v7 )
      HalpMmAllocCtxFree(v8, (__int64)v7);
    return v2;
  }
  return 0i64;
}

Referenced by:

IommuGetConfiguration
IommuGetLibraryContext
IommuHvGetConfiguration