HalpIrtAllocateIndex

NTSTATUS __stdcall HalpIrtAllocateIndex(UINT64 *IrtIndex, INT64 Count){
  int v2; 
  int v3; 
  UINT64 v4; 
  unsigned int v5; 
  NTSTATUS RemappingTableEntry; 
  UINT32 v7; 
  int v9; 
  unsigned int v10; 
  UINT8 *v11; 
  __int64 v12; 
  _RTL_BITMAP *v13; 
  UINT32 ClearBitsAndSet; 
  UINT64 v15; 
  UINT32 v16; 
  unsigned int NextForwardRunClear; 
  UINT64 v18; 
  VOID *NodeOrParent; 
  _TABLE_SEARCH_RESULT v21; 
  char v22; 
  unsigned int v23; 
  unsigned int v24; 
  unsigned int v25; 
  unsigned int v26; 
  INT64 v27; 
  CHAR v28; 
  UINT64 StartingRunIndex; 

  v26 = v3;
  v25 = v2;
  v4 = StartingRunIndex;
  v5 = 0;
  RemappingTableEntry = 0;
  v22 = 0;
  v23 = 0;
  v7 = Count;
  if( StartingRunIndex )
    v9 = *(_DWORD *)StartingRunIndex;
  else
    v9 = 0;
  if( !*(&CmpDummyThreadEvent + 1958) )
  {
    *(_DWORD *)IrtIndex = 0;
    return RemappingTableEntry;
  }
  if( (*(&CmpDummyThreadEvent + 7712) & 4) != 0 )
  {
    RemappingTableEntry = HalpIrtAllocateDeviceAperture(v2, v3, Count, v9, &v23);
    if( RemappingTableEntry < 0 )
      return RemappingTableEntry;
    v5 = v23;
    v22 = 1;
  }
  v10 = v5 / *(&CmpDummyThreadEvent + 1796);
  v24 = v5 / *(&CmpDummyThreadEvent + 1796);
  ExAcquireFastMutex((PFAST_MUTEX)((char *)&CmpDummyThreadEvent + 7776));
  v12 = 2i64 * v10;
  if( !*((_QWORD *)&CmpDummyThreadEvent + 2 * v10 + 901) )
  {
    KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&CmpDummyThreadEvent + 7776));
    RemappingTableEntry = HalpIrtExtendRemappingRange(v10);
    if( RemappingTableEntry < 0 )
      goto LABEL_30;
    ExAcquireFastMutex((PFAST_MUTEX)((char *)&CmpDummyThreadEvent + 7776));
  }
  v13 = (_RTL_BITMAP *)((char *)&CmpDummyThreadEvent + 8 * v12 + 7200);
  if( (*(&CmpDummyThreadEvent + 7712) & 1) != 0 )
  {
    v15 = v5 * *(&CmpDummyThreadEvent + 1938) % *(&CmpDummyThreadEvent + 1937);
    v23 = v15 + *(&CmpDummyThreadEvent + 1938) - 1;
    ClearBitsAndSet = -1;
    while( 1 )
    {
      LODWORD(StartingRunIndex) = v15;
      NextForwardRunClear = RtlFindNextForwardRunClear((INT64)v13, v15, &StartingRunIndex);
      if( !NextForwardRunClear )
        break;
      if( NextForwardRunClear >= v7 )
      {
        v16 = -v7 & (v7 + StartingRunIndex - 1);
        if( v16 - (unsigned int)StartingRunIndex < NextForwardRunClear
          && NextForwardRunClear + (_DWORD)StartingRunIndex - v16 >= v7 )
        {
          if( v16 + v7 - 1 <= v23 )
          {
            RtlSetBits(v13, v16, v7);
            ClearBitsAndSet = v16;
          }
          break;
        }
        v15 = (unsigned int)StartingRunIndex + NextForwardRunClear;
      }
      else
      {
        v15 = (unsigned int)StartingRunIndex + NextForwardRunClear;
      }
    }
  }
  else
  {
    ClearBitsAndSet = (unsigned int)RtlFindClearBitsAndSet(
                                      (_RTL_AVL_TABLE *)v13,
                                      (VOID *)v7,
                                      0i64,
                                      v11,
                                      NodeOrParent,
                                      v21);
  }
  KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&CmpDummyThreadEvent + 7776));
  if( ClearBitsAndSet == -1 )
  {
    RemappingTableEntry = -1073741670;
  }
  else
  {
    RemappingTableEntry = 0;
    v18 = ClearBitsAndSet + v24 * *(&CmpDummyThreadEvent + 1937);
    *(_DWORD *)IrtIndex = v18;
    if( v9 != 3 )
      return RemappingTableEntry;
    if( (*(&CmpDummyThreadEvent + 7712) & 2) == 0 )
      return RemappingTableEntry;
    LODWORD(NodeOrParent) = *(_DWORD *)(v4 + 56);
    RemappingTableEntry = HalpIommuAllocateRemappingTableEntry(v18, v7, v25, v26, (INT64)NodeOrParent, v27, v28);
    if( RemappingTableEntry >= 0 )
      return RemappingTableEntry;
    ExAcquireFastMutex((PFAST_MUTEX)((char *)&CmpDummyThreadEvent + 7776));
    RtlClearBits(v13, ClearBitsAndSet, v7);
    KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&CmpDummyThreadEvent + 7776));
    *(_DWORD *)IrtIndex = -1;
  }
LABEL_30:
  if( v22 )
    HalpIrtReleaseDeviceAperture(v5, v7);
  return RemappingTableEntry;
}

Referenced by:

HalpInterruptRemap
HalpInterruptRemapFixedLines