HalpInterruptInitializeIpis

INT64 __stdcall HalpInterruptInitializeIpis(){
  INT64 result; 
  __int64 v1; 
  _QWORD *v2; 
  _DWORD *v3; 
  int v4; 
  int v5; 
  unsigned int v6; 
  PSTR MemoryInternal; 
  _DWORD *v8; 
  _DWORD *v9; 
  ULONG v10; 
  _DWORD *v11; 
  int *v12; 
  int v13; 
  unsigned __int64 v14; 
  unsigned __int16 Group; 
  __int64 v16; 
  __int64 v17; 
  struct _PROCESSOR_NUMBER ProcNumber; 
  ProcNumber = 0;
  if( HalpInterruptIpiLines )
    goto LABEL_2;
  v1 = 0i64;
  v2 = *(_QWORD **)(HalpInterruptController + 240);
  while( v2 != (_QWORD *)(HalpInterruptController + 240) )
  {
    v3 = v2;
    v2 = (_QWORD *)*v2;
    v4 = v3[6] - v3[5];
    v5 = v3[8];
    if( v5 == 5 && v4 )
    {
      HalpInterruptIpiLines = (__int64)v3;
      goto LABEL_2;
    }
    if( v5 == 4 && v4 && !v1 )
      v1 = (__int64)v3;
  }
  HalpInterruptIpiLines = v1;
  if( v1 )
  {
LABEL_2:
    if( HalpInterruptClusterModeEnabled )
    {
      if( !HalpInterruptClusterData )
      {
        v6 = HalpInterruptMaxProcessors;
        if( (_DWORD)HalpInterruptMaxCluster
          && 20 * (int)HalpInterruptMaxCluster < (unsigned int)HalpInterruptMaxProcessors )
        {
          v6 = 20 * HalpInterruptMaxCluster;
        }
        MemoryInternal = HalpMmAllocateMemoryInternal(24 * v6, MmCached);
        HalpInterruptClusterData = (__int64)MemoryInternal;
        v8 = MemoryInternal;
        if( !MemoryInternal )
          return 3221225495i64;
        memset((INT64)MemoryInternal, 0i64);
        v9 = &v8[6 * v6];
        while( v8 < v9 )
        {
          *v8 = -1;
          v8 += 6;
        }
        HalpInterruptClusterDataEnd = HalpInterruptClusterData;
        HalpInterruptClusterDataLimit = HalpInterruptClusterData + 24i64 * v6;
      }
      v10 = 0;
      if( (_DWORD)HalpInterruptProcessorCount )
      {
        v11 = (_DWORD *)HalpInterruptTargets;
        v12 = KiProcessorIndexToNumberMappingTable;
        do
        {
          if( *v11 == 6 )
          {
            LODWORD(result) = KeGetProcessorNumberFromIndex(v10, &ProcNumber);
            if( (int)result < 0 )
              return result;
            v13 = v11[2];
            v14 = HalpInterruptClusterData;
            Group = ProcNumber.Group;
            while( v14 < HalpInterruptClusterDataEnd
                 && (*(_WORD *)(v14 + 16) != ProcNumber.Group || *(_DWORD *)v14 != v13) )
              v14 += 24i64;
            if( v14 == HalpInterruptClusterDataEnd )
            {
              if( v14 >= HalpInterruptClusterDataLimit )
                KeBugCheckEx(0x5Cu, 0x201ui64, 0i64, 0xFFFFFFFF80000005ui64, (unsigned int)HalpInterruptMaxCluster);
              ++HalpInterruptClusterDataCount;
              v16 = HalpInterruptClusterDataEnd + 24;
              *(_DWORD *)v14 = v13;
              HalpInterruptClusterDataEnd = v16;
              *(_WORD *)(v14 + 16) = Group;
            }
            v17 = *(_QWORD *)(v14 + 8);
            _bittestandset64(&v17, *v12 & 0x3F);
            *(_QWORD *)(v14 + 8) = v17;
          }
          ++v10;
          v11 += 6;
          ++v12;
        }
        while( v10 < (unsigned int)HalpInterruptProcessorCount );
      }
    }
  }
  else
  {
    HalpInterruptMaxProcessors = 1;
  }
  return 0i64;
}

Referenced by:

HalpInitializeInterrupts
HalpInitializeInterruptsPn