HalpInterruptReinitialize

VOID __stdcall HalpInterruptReinitialize(_CONTEXT *uINT){
  __int64 v1; 
  PVOID *v2; 
  NTSTATUS started; 
  int v4; 
  _REGISTERED_INTERRUPT_CONTROLLER *v5; 
  unsigned int Flags; 
  NTSTATUS v7; 
  void *BugCheckParameter4; 
  int v9; 
  unsigned int v10; 
  unsigned int v11; 
  __int64 v12; 
  char *v13; 
  char *v14; 
  unsigned int v15; 
  unsigned int v16; 
  __int64 v17; 
  char v18; 
  UINT16 *v19; 
  unsigned int ProcessorIndexFromNumber; 
  UINT64 v21; 
  void *v22; 
  __int16 v23; 
  UINT64 Id; 

  LODWORD(Id) = 0;
  v2 = (PVOID *)qword_140C4B850;
  started = 0;
  v4 = (int)uINT;
  while( v2 != &qword_140C4B850 )
  {
    v5 = (_REGISTERED_INTERRUPT_CONTROLLER *)v2;
    v2 = (PVOID *)*v2;
    Flags = v5->Flags;
    if( (Flags & 1) != 0 )
    {
      v5->Flags = Flags & 0xFFFFFFFE;
      v7 = HalpInterruptInitializeController(v5);
      BugCheckParameter4 = (void *)v7;
      if( v7 < 0 )
      {
        HalpInterruptControllerInUse(v5);
        if( v18 )
          KeBugCheckEx(0x5Cu, (PVOID)0x200, (PVOID)*(&CmpDummyThreadEvent + 1789), v5, BugCheckParameter4);
      }
    }
  }
  v9 = HalpIommuInitializeAll(1, 0i64, v1);
  if( v9 < 0 )
    KeBugCheckEx(0x5Cu, (PVOID)0x500, (PVOID)v9, 0i64, 0i64);
  KeGetCurrentIrql();
  __writecr8(0xFui64);
  _disable();
  if( (v4 & 0x10000) != 0 )
  {
    v10 = (_DWORD)HalpInterruptProcessorsStarted - HalpInterruptDynamicProcessorCount;
    if( *(&CmpDummyThreadEvent + 1780) )
      HalpInterruptStartBlockedProcessors(0i64);
    v11 = 1;
    if( v10 > 1 )
    {
      v12 = 8i64;
      do
      {
        v13 = (char *)Memory + 1472 * v11;
        dword_140C49D18 = *(_DWORD *)((char *)qword_140C49D10 + v12 + 4);
        v14 = (char *)HalpInterruptProcessorState + 64 * (unsigned __int64)v11;
        if( (int)HalGetProcessorIdByNtNumber(v11, &Id) >= 0 )
          started = HalStartNextProcessor(v13, v11, (_MEMORY_CACHING_TYPE_ORIG)Id);
        if( started != 4 )
          KeBugCheckEx(0x5Cu, (PVOID)0x2001, (PVOID)v11, (PVOID)(unsigned int)qword_140C50640, v14);
        ++v11;
        v12 += 8i64;
      }
      while( v11 < v10 );
    }
    v15 = HalpInterruptDynamicProcessorCount;
    v16 = 0;
    if( HalpInterruptDynamicProcessorCount )
    {
      v17 = 0i64;
      do
      {
        v19 = (UINT16 *)(HalpInterruptDynamicProcessorState + (v17 << 6));
        ProcessorIndexFromNumber = KeGetProcessorIndexFromNumber(v19 + 8);
        v21 = *(unsigned int *)v19;
        v22 = (void *)ProcessorIndexFromNumber;
        dword_140C49D18 = *((_DWORD *)qword_140C49D10 + 2 * ProcessorIndexFromNumber + 1);
        if( HalStartDynamicProcessor(
               (INT8 *)Memory + 1472 * ProcessorIndexFromNumber,
               ProcessorIndexFromNumber,
               v21,
               0xFFFFu) != 4 )
          KeBugCheckEx(0x5Cu, (PVOID)0x2001, v22, (PVOID)(unsigned int)qword_140C50640, v19);
        ++v16;
        ++v17;
      }
      while( v16 < v15 );
    }
    HalpInterruptProcessorRestarting = 0;
  }
  byte_140C50380 = 0;
  if( (v23 & 0x200) != 0 )
    _enable();
}

Referenced by:

HalpAcpiPostSleep