HalpInterruptInitializeIpis

NTSTATUS __stdcall HalpInterruptInitializeIpis(){
  NTSTATUS result; 
  __int64 v1; 
  _QWORD *v2; 
  _DWORD *v3; 
  int v4; 
  int v5; 
  unsigned int v6; 
  PSTR MemoryInternal; 
  _DWORD *v8; 
  _DWORD *v9; 
  unsigned int v10; 
  _DWORD *v11; 
  int *v12; 
  int v13; 
  unsigned __int64 v14; 
  unsigned __int16 Group; 
  __int64 v16; 
  __int64 v17; 
  _PROCESSOR_NUMBER ProcNumber; 

  ProcNumber = 0;
  if( qword_140C50700 )
    goto LABEL_2;
  v1 = 0i64;
  v2 = *(_QWORD **)(Controller + 240);
  while( v2 != (_QWORD *)(Controller + 240) )
  {
    v3 = v2;
    v2 = (_QWORD *)*v2;
    v4 = v3[6] - v3[5];
    v5 = v3[8];
    if( v5 == 5 && v4 )
    {
      qword_140C50700 = (__int64)v3;
      goto LABEL_2;
    }
    if( v5 == 4 && v4 && !v1 )
      v1 = (__int64)v3;
  }
  qword_140C50700 = v1;
  if( v1 )
  {
LABEL_2:
    if( *(&CmpDummyThreadEvent + 7160) )
    {
      if( !*(&stru_140CF2E80 + 808) )
      {
        v6 = HIDWORD(qword_140C50640);
        if( (_DWORD)HalpInterruptMaxCluster
          && (unsigned int)(20 * (_DWORD)HalpInterruptMaxCluster) < HIDWORD(qword_140C50640) )
        {
          v6 = 20 * (_DWORD)HalpInterruptMaxCluster;
        }
        MemoryInternal = HalpMmAllocateMemoryInternal(24 * v6, MmCached);
        *(&stru_140CF2E80 + 808) = MemoryInternal;
        v8 = MemoryInternal;
        if( !MemoryInternal )
          return -1073741801;
        memset(MemoryInternal, 0i64, 24 * v6);
        v9 = &v8[6 * v6];
        while( v8 < v9 )
        {
          *v8 = -1;
          v8 += 6;
        }
        *(&stru_140CF2E80 + 809) = *(&stru_140CF2E80 + 808);
        HalpInterruptClusterDataLimit = *(&stru_140CF2E80 + 808) + 24i64 * v6;
      }
      v10 = 0;
      if( (_DWORD)qword_140C50640 )
      {
        v11 = (_DWORD *)qword_140C50630;
        v12 = KiProcessorIndexToNumberMappingTable;
        do
        {
          if( *v11 == 6 )
          {
            result = KeGetProcessorNumberFromIndex(v10, &ProcNumber);
            if( result < 0 )
              return result;
            v13 = v11[2];
            v14 = *(&stru_140CF2E80 + 808);
            Group = ProcNumber.Group;
            while( v14 < *(&stru_140CF2E80 + 809)
                 && (*(_WORD *)(v14 + 16) != ProcNumber.Group || *(_DWORD *)v14 != v13) )
              v14 += 24i64;
            if( v14 == *(&stru_140CF2E80 + 809) )
            {
              if( v14 >= HalpInterruptClusterDataLimit )
                KeBugCheckEx(
                  0x5Cu,
                  (PVOID)0x201,
                  0i64,
                  (PVOID)0xFFFFFFFF80000005i64,
                  (PVOID)(unsigned int)HalpInterruptMaxCluster);
              ++HalpInterruptClusterDataCount;
              v16 = *(&stru_140CF2E80 + 809) + 24i64;
              *(_DWORD *)v14 = v13;
              *(&stru_140CF2E80 + 809) = 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)qword_140C50640 );
      }
    }
  }
  else
  {
    HIDWORD(qword_140C50640) = 1;
  }
  return 0;
}

Referenced by:

HalpInitializeInterrupts
HalpInitializeInterruptsPn