HalpInitializeInterrupts

NTSTATUS __stdcall HalpInitializeInterrupts(_LOADER_PARAMETER_BLOCK *LoaderBlock){
  int v2; 
  size_t v3; 
  PSTR MemoryInternal; 
  size_t v5; 
  PSTR v6; 
  PSTR v7; 
  size_t v8; 
  UINT64 *v9; 
  INT64 v10; 
  INT64 v11; 
  INT64 v12; 
  INT64 v13; 
  INT64 v14; 
  INT64 v15; 
  INT64 v16; 
  INT64 v17; 
  _REGISTERED_INTERRUPT_CONTROLLER *i; 
  _REGISTERED_INTERRUPT_CONTROLLER *v19; 
  unsigned int Capabilities; 
  _DWORD *v21; 
  unsigned int v22; 
  int v23; 
  _REGISTERED_INTERRUPT_CONTROLLER *PrimaryController; 

  PrimaryController = 0i64;
  *(&CmpDummyThreadEvent + 891) = 0i64;
  *(&CmpDummyThreadEvent + 845) = 0i64;
  *(&CmpDummyThreadEvent + 889) = (char *)&CmpDummyThreadEvent + 7104;
  *(&CmpDummyThreadEvent + 888) = (char *)&CmpDummyThreadEvent + 7104;
  *(_DWORD *)&dword_140C4B7A0.Count = 1310721;
  memset(&unk_140C4B7A4, 0i64, 0xA4u);
  v2 = HalpInterruptParseAcpiTables(LoaderBlock, 0i64);
  if( v2 < 0 )
    goto LABEL_32;
  HIDWORD(qword_140C50640) = HalQueryMaximumProcessorCount();
  v3 = 24 * HIDWORD(qword_140C50640);
  MemoryInternal = HalpMmAllocateMemoryInternal((unsigned int)(24 * HIDWORD(qword_140C50640)), MmCached);
  qword_140C50630 = (__int64)MemoryInternal;
  if( !MemoryInternal )
    goto LABEL_31;
  memset(MemoryInternal, 0i64, v3);
  v5 = HIDWORD(qword_140C50640) << 6;
  v6 = HalpMmAllocateMemoryInternal((unsigned int)(HIDWORD(qword_140C50640) << 6), MmCached);
  HalpInterruptProcessorState = v6;
  if( !v6
    || (memset(v6, 0i64, v5),
        v7 = HalpMmAllocateMemoryInternal(v5, MmCached),
        (HalpInterruptDynamicProcessorState = (__int64)v7) == 0)
    || (memset(v7, 0i64, v5),
        v8 = 8 * HIDWORD(qword_140C50640),
        v9 = (UINT64 *)HalpMmAllocateMemoryInternal((unsigned int)(8 * HIDWORD(qword_140C50640)), MmCached),
        (qword_140C49C38 = v9) == 0i64) )
  {
LABEL_31:
    v2 = -1073741801;
    goto LABEL_32;
  }
  memset(v9, 0i64, v8);
  *qword_140C49C38 = (UINT64)KeGetPcr();
  v2 = HalpApicDiscover();
  if( v2 >= 0 )
    v2 = HalpPicDiscover();
  if( v2 < 0 )
  {
    *(&CmpDummyThreadEvent + 1789) = 3;
    goto LABEL_29;
  }
  HalpInterruptSetIdtEntry(0x35ui64, HalpInterruptDeferredErrorService, 5, v10, (UINT64 *)0xFFFFFFFFFFFFFFFFi64);
  HalpInterruptSetIdtEntry(0xE3ui64, HalpInterruptDeferredRecoveryService, 14, v11, (UINT64 *)0xFFFFFFFFFFFFFFFFi64);
  HalpInterruptSetIdtEntry(0x36ui64, HalpInterruptDeferredErrorService, 5, v12, (UINT64 *)0xFFFFFFFFFFFFFFFFi64);
  HalpInterruptSetIdtEntry(0xDFui64, HalpInterruptSpuriousService, 15, v13, (UINT64 *)0xFFFFFFFFFFFFFFFEi64);
  HalpInterruptSetIdtEntry(0xD8ui64, HalpInterruptStubService, 15, v14, (UINT64 *)0xFFFFFFFFFFFFFFFFi64);
  HalpInterruptSetIdtEntry(0xE2ui64, HalpInterruptLocalErrorService, 15, v15, (UINT64 *)0xFFFFFFFFFFFFFFFFi64);
  HalpInterruptSetIdtEntry(0xD7ui64, HalpInterruptRebootService, 15, v16, (UINT64 *)0xFFFFFFFFFFFFFFFFi64);
  HalpInterruptSetIdtEntry(0xFEui64, HalpPerfInterrupt, 15, v17, (UINT64 *)0xFFFFFFFFFFFFFFFDi64);
  byte_140D57962 = 17;
  byte_140D57D6A = 15;
  dword_140D57D6B = 2;
  byte_140D57A3F = 17;
  byte_140D581BB = 15;
  dword_140D581BC = 223;
  v2 = HalpInterruptSelectController(&PrimaryController);
  if( v2 < 0 )
    goto LABEL_32;
  for( i = (_REGISTERED_INTERRUPT_CONTROLLER *)qword_140C4B850;
        i != (_REGISTERED_INTERRUPT_CONTROLLER *)&qword_140C4B850;
        i = (_REGISTERED_INTERRUPT_CONTROLLER *)i->ListEntry.Flink )
  {
    v2 = HalpInterruptInitializeController(i);
    if( v2 < 0 )
      goto LABEL_32;
  }
  v2 = HalpInterruptParseAcpiTables(LoaderBlock, 1ui64);
  if( v2 < 0 )
    goto LABEL_32;
  v19 = PrimaryController;
  *(&CmpDummyThreadEvent + 440) = _mm_load_si128((const __m128i *)&_xmm_ffffffffffffffffffffffffffffffff);
  *(&CmpDummyThreadEvent + 3520) = 256;
  Capabilities = PrimaryController->Capabilities;
  *(_WORD *)((char *)&CmpDummyThreadEvent + 7053) = 3597;
  *(&CmpDummyThreadEvent + 7052) = 12;
  *(&CmpDummyThreadEvent + 7055) = 15;
  *(&CmpDummyThreadEvent + 7042) = 2;
  if( (Capabilities & 1) == 0 )
  {
    v21 = (_DWORD *)qword_140C50630;
    LODWORD(qword_140C50640) = 1;
    *(_DWORD *)(qword_140C50630 + 8) = 0;
    *v21 = 4;
    Capabilities = v19->Capabilities;
  }
  if( !(_DWORD)qword_140C50640 )
    LODWORD(qword_140C50640) = 1;
  if( (Capabilities & 4) == 0 )
    HalpInterruptLogicalFlatLimit = 0;
  Controller = (INT64)v19;
  v2 = HalpInterruptInitializeIpis();
  if( v2 < 0 )
LABEL_32:
    KeBugCheckEx(0x5Cu, (PVOID)0x200, (PVOID)0x5250631, (PVOID)*(&CmpDummyThreadEvent + 1789), (PVOID)v2);
  if( (*(_DWORD *)(Controller + 220) & 0x100) != 0 )
  {
    if( KeGetCurrentPrcb()->CpuVendor == 1 )
    {
      v23 = 0x200000;
    }
    else
    {
      v22 = 240 * HalQueryMaximumProcessorCount();
      v23 = 0x10000;
      if( v22 <= 0x10000 )
      {
        _BitScanReverse(&v22, 2 * v22 - 1);
        v23 = 1 << v22;
      }
    }
    *(&CmpDummyThreadEvent + 1958) = v23;
  }
LABEL_29:
  if( v2 < 0 )
    goto LABEL_32;
  return v2;
}

Referenced by:

HalpInterruptInitDiscard