HalpInitializeInterrupts

NTSTATUS __stdcall HalpInitializeInterrupts(_LOADER_PARAMETER_BLOCK *LoaderBlock){
  DOUBLE v1; 
  NTSTATUS v3; 
  PSTR MemoryInternal; 
  unsigned int v5; 
  PSTR v6; 
  PSTR v7; 
  PSTR v8; 
  INT64 v9; 
  INT64 v10; 
  INT64 v11; 
  INT64 v12; 
  INT64 v13; 
  INT64 v14; 
  INT64 v15; 
  INT64 v16; 
  ULONG_PTR *i; 
  ULONG_PTR v18; 
  int v19; 
  _DWORD *v20; 
  unsigned int v21; 
  int v22; 
  ULONG_PTR v24; 
  v24 = 0i64;
  HalpInterruptOverridesLock = 0i64;
  HalpInterruptLocalUnitErrorLock = 0i64;
  qword_140C49608 = (__int64)&HalpInterruptOverrides;
  HalpInterruptOverrides = (__int64)&HalpInterruptOverrides;
  HalpInterruptPhysicalTargets = 1310721;
  memset((INT64)&dword_140C4B7A4, 0i64);
  v3 = HalpInterruptParseAcpiTables(LoaderBlock, 0i64);
  if( v3 < 0 )
    goto LABEL_32;
  HalpInterruptMaxProcessors = HalQueryMaximumProcessorCount();
  MemoryInternal = HalpMmAllocateMemoryInternal((unsigned int)(24 * HalpInterruptMaxProcessors), MmCached);
  HalpInterruptTargets = (__int64)MemoryInternal;
  if( !MemoryInternal )
    goto LABEL_31;
  memset((INT64)MemoryInternal, 0i64);
  v5 = HalpInterruptMaxProcessors << 6;
  v6 = HalpMmAllocateMemoryInternal((unsigned int)(HalpInterruptMaxProcessors << 6), MmCached);
  HalpInterruptProcessorState = (ULONG_PTR)v6;
  if( !v6
    || (memset((INT64)v6, 0i64),
        v7 = HalpMmAllocateMemoryInternal(v5, MmCached),
        (HalpInterruptDynamicProcessorState = (__int64)v7) == 0)
    || (memset((INT64)v7, 0i64),
        v8 = HalpMmAllocateMemoryInternal((unsigned int)(8 * HalpInterruptMaxProcessors), MmCached),
        (HalpInterruptProcessorPcr = (__int64)v8) == 0) )
  {
LABEL_31:
    v3 = -1073741801;
    goto LABEL_32;
  }
  memset((INT64)v8, 0i64);
  *(_QWORD *)HalpInterruptProcessorPcr = KeGetPcr();
  v3 = HalpApicDiscover();
  if( v3 >= 0 )
    v3 = HalpPicDiscover();
  if( v3 < 0 )
  {
    HalpInterruptLastProblem = 3;
    goto LABEL_29;
  }
  HalpInterruptSetIdtEntry(0x35ui64, HalpInterruptDeferredErrorService, 5, v9, (UINT64 *)0xFFFFFFFFFFFFFFFFi64);
  HalpInterruptSetIdtEntry(0xE3ui64, HalpInterruptDeferredRecoveryService, 14, v10, (UINT64 *)0xFFFFFFFFFFFFFFFFi64);
  HalpInterruptSetIdtEntry(0x36ui64, HalpInterruptDeferredErrorService, 5, v11, (UINT64 *)0xFFFFFFFFFFFFFFFFi64);
  HalpInterruptSetIdtEntry(0xDFui64, HalpInterruptSpuriousService, 15, v12, (UINT64 *)0xFFFFFFFFFFFFFFFEi64);
  HalpInterruptSetIdtEntry(0xD8ui64, HalpInterruptStubService, 15, v13, (UINT64 *)0xFFFFFFFFFFFFFFFFi64);
  HalpInterruptSetIdtEntry(0xE2ui64, HalpInterruptLocalErrorService, 15, v14, (UINT64 *)0xFFFFFFFFFFFFFFFFi64);
  HalpInterruptSetIdtEntry(0xD7ui64, HalpInterruptRebootService, 15, v15, (UINT64 *)0xFFFFFFFFFFFFFFFFi64);
  HalpInterruptSetIdtEntry(0xFEui64, HalpPerfInterrupt, 15, v16, (UINT64 *)0xFFFFFFFFFFFFFFFDi64);
  byte_140D57962 = 17;
  byte_140D57D6A = 15;
  dword_140D57D6B = 2;
  byte_140D57A3F = 17;
  byte_140D581BB = 15;
  dword_140D581BC = 223;
  v3 = HalpInterruptSelectController((__int64)&v24, v1);
  if( v3 < 0 )
    goto LABEL_32;
  for( i = (ULONG_PTR *)HalpRegisteredInterruptControllers; i != &HalpRegisteredInterruptControllers; i = (ULONG_PTR *)*i )
  {
    v3 = HalpInterruptInitializeController(i, v1);
    if( v3 < 0 )
      goto LABEL_32;
  }
  v3 = HalpInterruptParseAcpiTables(LoaderBlock, 1ui64);
  if( v3 < 0 )
    goto LABEL_32;
  v18 = v24;
  HalpHwToSwIrqlMap = (__int128)_mm_load_si128((const __m128i *)&_xmm_ffffffffffffffffffffffffffffffff);
  LOWORD(HalpHwToSwIrqlMap) = 256;
  v19 = *(_DWORD *)(v24 + 220);
  *(_WORD *)((char *)&HalpHwToSwIrqlMap + 13) = 3597;
  BYTE12(HalpHwToSwIrqlMap) = 12;
  HIBYTE(HalpHwToSwIrqlMap) = 15;
  BYTE2(HalpHwToSwIrqlMap) = 2;
  if( (v19 & 1) == 0 )
  {
    v20 = (_DWORD *)HalpInterruptTargets;
    LODWORD(HalpInterruptProcessorCount) = 1;
    *(_DWORD *)(HalpInterruptTargets + 8) = 0;
    *v20 = 4;
    v19 = *(_DWORD *)(v18 + 220);
  }
  if( !(_DWORD)HalpInterruptProcessorCount )
    LODWORD(HalpInterruptProcessorCount) = 1;
  if( (v19 & 4) == 0 )
    HalpInterruptLogicalFlatLimit = 0;
  HalpInterruptController = v18;
  v3 = HalpInterruptInitializeIpis();
  if( v3 < 0 )
LABEL_32:
    KeBugCheckEx(0x5Cu, 0x200ui64, 0x5250631ui64, HalpInterruptLastProblem, v3);
  if( (*(_DWORD *)(HalpInterruptController + 220) & 0x100) != 0 )
  {
    if( *((_BYTE *)KeGetCurrentPrcb() + 141) == 1 )
    {
      v22 = 0x200000;
    }
    else
    {
      v21 = 240 * HalQueryMaximumProcessorCount();
      v22 = 0x10000;
      if( v21 <= 0x10000 )
      {
        _BitScanReverse(&v21, 2 * v21 - 1);
        v22 = 1 << v21;
      }
    }
    HalpIrtTotalEntries = v22;
  }
LABEL_29:
  if( v3 < 0 )
    goto LABEL_32;
  return v3;
}

Referenced by:

HalpInterruptInitDiscard