HalpIrtAllocateDeviceAperture

__int64 __fastcall HalpIrtAllocateDeviceAperture(int a1, int a2, int a3, int a4, _DWORD *a5){
  int v9; 
  NTSTATUS v10; 
  __int64 *i; 
  __int64 v12; 
  __int64 v13; 

  v9 = 0;
  v10 = 0;
  ExAcquireFastMutex((PFAST_MUTEX)((char *)&CmpDummyThreadEvent + 7776));
  i = (__int64 *)*(&CmpDummyThreadEvent + 980);
  if( *(&CmpDummyThreadEvent + 980) && (a4 != 3 || *(&CmpDummyThreadEvent + 1936) == 1) )
  {
LABEL_4:
    *((_DWORD *)i + 5) += a3;
  }
  else
  {
    while( 1 )
    {
      for( i = (__int64 *)*(&CmpDummyThreadEvent + 896);
            i != (__int64 *)((char *)&CmpDummyThreadEvent + 7168);
            i = (__int64 *)*i )
      {
        if( *((_DWORD *)i + 6) == a1 && *((_DWORD *)i + 7) == a2 )
          goto LABEL_4;
      }
      i = (__int64 *)*(&CmpDummyThreadEvent + 966);
      if( (_UNKNOWN *)*(&CmpDummyThreadEvent + 966) != (_UNKNOWN *)((char *)&CmpDummyThreadEvent + 7728) )
        break;
      KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&CmpDummyThreadEvent + 7776));
      if( v9 )
        v10 = -1073741670;
      else
        v10 = HalpIrtExtendApertureRange();
      if( v10 < 0 )
        return(unsigned int)v10;
      ++v9;
      ExAcquireFastMutex((PFAST_MUTEX)((char *)&CmpDummyThreadEvent + 7776));
    }
    v12 = **(&CmpDummyThreadEvent + 966);
    if( *(_UNKNOWN **)(*(&CmpDummyThreadEvent + 966) + 8i64) != (_UNKNOWN *)((char *)&CmpDummyThreadEvent + 7728)
      || *(_QWORD *)(v12 + 8) != *(&CmpDummyThreadEvent + 966)
      || (*(&CmpDummyThreadEvent + 966) = **(&CmpDummyThreadEvent + 966),
          *(_QWORD *)(v12 + 8) = (char *)&CmpDummyThreadEvent + 7728,
          *((_DWORD *)i + 6) = a1,
          *((_DWORD *)i + 7) = a2,
          *((_DWORD *)i + 5) = a3,
          v13 = *(&CmpDummyThreadEvent + 896),
          *(_UNKNOWN **)(*(&CmpDummyThreadEvent + 896) + 8i64) != (_UNKNOWN *)((char *)&CmpDummyThreadEvent + 7168)) )
    {
      __fastfail(3u);
    }
    *i = *(&CmpDummyThreadEvent + 896);
    i[1] = (__int64)&CmpDummyThreadEvent + 7168;
    *(_QWORD *)(v13 + 8) = i;
    *(&CmpDummyThreadEvent + 896) = i;
  }
  KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&CmpDummyThreadEvent + 7776));
  *a5 = *((_DWORD *)i + 4);
  return(unsigned int)v10;
}

Referenced by:

HalpIrtAllocateIndex
HalpIrtInitializeDeviceApertures