HalpInterruptReinitialize

VOID __stdcall HalpInterruptReinitialize(CONTEXT *uINT){
  INT64 v1; 
  DOUBLE v2; 
  ULONG_PTR *v3; 
  int started; 
  int v5; 
  ULONG_PTR *v6; 
  int v7; 
  int v8; 
  ULONG_PTR BugCheckParameter4; 
  int v10; 
  unsigned int v11; 
  unsigned int v12; 
  __int64 v13; 
  const void *v14; 
  ULONG_PTR v15; 
  unsigned int v16; 
  unsigned int v17; 
  __int64 v18; 
  ULONG_PTR v20; 
  unsigned int ProcessorIndexFromNumber; 
  unsigned int v22; 
  ULONG_PTR v23; 
  __int16 v24; 
  UINT64 Id; 
  LODWORD(Id) = 0;
  v3 = (ULONG_PTR *)HalpRegisteredInterruptControllers;
  started = 0;
  v5 = (int)uINT;
  while( v3 != &HalpRegisteredInterruptControllers )
  {
    v6 = v3;
    v3 = (ULONG_PTR *)*v3;
    v7 = *((_DWORD *)v6 + 56);
    if( (v7 & 1) != 0 )
    {
      *((_DWORD *)v6 + 56) = v7 & 0xFFFFFFFE;
      v8 = HalpInterruptInitializeController(v6, v2);
      BugCheckParameter4 = v8;
      if( v8 < 0 )
      {
        if( HalpInterruptControllerInUse((__int64)v6) )
          KeBugCheckEx(0x5Cu, 0x200ui64, HalpInterruptLastProblem, (ULONG_PTR)v6, BugCheckParameter4);
      }
    }
  }
  v10 = HalpIommuInitializeAll(1, 0i64, v1);
  if( v10 < 0 )
    KeBugCheckEx(0x5Cu, 0x500ui64, v10, 0i64, 0i64);
  KeGetCurrentIrql();
  __writecr8(0xFui64);
  _disable();
  if( (v5 & 0x10000) != 0 )
  {
    v11 = *(_DWORD *)HalpInterruptProcessorsStarted - HalpInterruptDynamicProcessorCount;
    if( HalpInterruptBlockedProcessors )
      HalpInterruptStartBlockedProcessors(0i64);
    v12 = 1;
    if( v11 > 1 )
    {
      v13 = 8i64;
      do
      {
        v14 = (const void *)(HalpHiberProcState + 1472i64 * v12);
        CurTiledCr3LowPart = *(_DWORD *)(HalpTiledCr3Addresses + v13 + 4);
        v15 = HalpInterruptProcessorState + ((unsigned __int64)v12 << 6);
        if( (int)HalGetProcessorIdByNtNumber(v12, &Id) >= 0 )
          started = HalStartNextProcessor(v14, v12, Id);
        if( started != 4 )
          KeBugCheckEx(0x5Cu, 0x2001ui64, v12, (unsigned int)HalpInterruptProcessorCount, v15);
        ++v12;
        v13 += 8i64;
      }
      while( v12 < v11 );
    }
    v16 = HalpInterruptDynamicProcessorCount;
    v17 = 0;
    if( HalpInterruptDynamicProcessorCount )
    {
      v18 = 0i64;
      do
      {
        v20 = HalpInterruptDynamicProcessorState + (v18 << 6);
        ProcessorIndexFromNumber = KeGetProcessorIndexFromNumber((_PROCESSOR_NUMBER *)(v20 + 16));
        v22 = *(_DWORD *)v20;
        v23 = ProcessorIndexFromNumber;
        CurTiledCr3LowPart = *(_DWORD *)(HalpTiledCr3Addresses + 8i64 * ProcessorIndexFromNumber + 4);
        if( (unsigned int)HalStartDynamicProcessor(
                             (const void *)(HalpHiberProcState + 1472i64 * ProcessorIndexFromNumber),
                             ProcessorIndexFromNumber,
                             v22,
                             0xFFFFu) != 4 )
          KeBugCheckEx(0x5Cu, 0x2001ui64, v23, (unsigned int)HalpInterruptProcessorCount, v20);
        ++v17;
        ++v18;
      }
      while( v17 < v16 );
    }
    HalpInterruptProcessorRestarting = 0;
  }
  HalpInterruptPicStateIntact = 0;
  if( (v24 & 0x200) != 0 )
    _enable();
}

Referenced by:

HalpAcpiPostSleep