HalpInterruptInitializeController

NTSTATUS __stdcall HalpInterruptInitializeController(_REGISTERED_INTERRUPT_CONTROLLER *Controller){
  unsigned int Capabilities; 
  int v3; 
  unsigned int Flags; 
  unsigned int v5; 
  int v7; 
  _INTERRUPT_PROBLEM v8; 

  if( (Controller->Flags & 1) != 0 )
    return 0;
  Capabilities = Controller->Capabilities;
  if( (Capabilities & 1) == 0 )
    goto LABEL_3;
  if( !HalpInterruptMaxClusterSize || HalpInterruptMaxClusterSize > Controller->MaxClusterSize )
    HalpInterruptMaxClusterSize = Controller->MaxClusterSize;
  if( !(_DWORD)HalpInterruptMaxCluster || (unsigned int)HalpInterruptMaxCluster > Controller->MaxClusters )
    LODWORD(HalpInterruptMaxCluster) = Controller->MaxClusters;
  v7 = Capabilities & 0x400;
  if( *(&CmpDummyThreadEvent + 7080) )
  {
    if( !v7 )
    {
      if( !*(&CmpDummyThreadEvent + 7094) )
        goto LABEL_14;
LABEL_20:
      v3 = -1073741811;
      Controller->ProblemSourceLine = 472;
      v8 = InterruptProblemClusterNotFullyReplaced;
LABEL_22:
      *(&CmpDummyThreadEvent + 1789) = v8;
      Controller->Problem = v8;
      Controller->ProblemSourceFile = "minkernel\\hals\\lib\\interrupts\\common\\intsup.c";
      Controller->ProblemStatus = v3;
      goto LABEL_4;
    }
    if( !*(&CmpDummyThreadEvent + 7094) )
      goto LABEL_20;
  }
LABEL_14:
  v3 = HalpInterruptInitializeLocalUnit(Controller);
  if( v3 < 0 )
    goto LABEL_4;
LABEL_3:
  v3 = Controller->FunctionTable.InitializeIoUnit(Controller->InternalData);
  if( v3 < 0 )
  {
    v8 = InterruptProblemInitializeIoUnitFailed;
    Controller->ProblemSourceLine = 497;
    goto LABEL_22;
  }
LABEL_4:
  Flags = Controller->Flags;
  if( v3 < 0 )
    v5 = Flags & 0xFFFFFFFC | 2;
  else
    v5 = Flags & 0xFFFFFFFC | 1;
  Controller->Flags = v5;
  return v3;
}

Referenced by:

HalpInitializeInterrupts
HalpInterruptPowerChange
HalpInterruptReinitialize
HalpInterruptResetThisProcessor
HalpInterruptSelectController