HalpInterruptInitializeLocalUnit

NTSTATUS __stdcall HalpInterruptInitializeLocalUnit(_REGISTERED_INTERRUPT_CONTROLLER *Controller){
  __int64 v1; 
  int v3; 
  int v4; 
  PROCESSOR_NUMBER *v5; 
  int v6; 
  __int64 v7; 
  int(__fastcall *SetLogicalId)(void *, _INTERRUPT_TARGET *); 
  int v9; 
  INT64 v10; 
  char v12; 
  int(__fastcall *v13)(void *, _INTERRUPT_TARGET *); 
  int v14; 
  int v15; 
  unsigned int v16; 
  __int64 v17; 
  __int64 v18; 
  int(__fastcall *ConvertId)(void *, unsigned int *, _INTERRUPT_TARGET *, unsigned __int8); 
  PVOID v20; 
  NTSTATUS v21; 
  UINT64 SourceLine; 
  __int128 v23; 
  __int64 v24; 
  int v25; 
  UINT64 LocalUnitIdentifier; 

  LODWORD(LocalUnitIdentifier) = 0;
  v23 = 0i64;
  v24 = 0i64;
  LODWORD(v1) = KeGetPcr()->Prcb.Number;
  _disable();
  v3 = v25 & 0x200;
  v4 = ((__int64(__fastcall *)(void *, _QWORD, __int64))Controller->FunctionTable.InitializeLocalUnit)(
         Controller->InternalData,
         (unsigned int)v1,
         223i64);
  v6 = v4;
  if( v4 < 0 )
  {
    *(&CmpDummyThreadEvent + 1789) = 4;
    Controller->ProblemSourceFile = "minkernel\\hals\\lib\\interrupts\\common\\intsup.c";
    Controller->Problem = InterruptProblemInitializeLocalUnitFailed;
    Controller->ProblemStatus = v4;
    Controller->ProblemSourceLine = 571;
    goto LABEL_13;
  }
  if( !KeGetPcr()->Prcb.Number )
    *(&CmpDummyThreadEvent + 1766) = LocalUnitIdentifier;
  HalpInterruptMarkProcessorStarted((unsigned int)LocalUnitIdentifier, v5);
  if( *(_DWORD *)(qword_140C50630 + 24 * v1) )
  {
    if( !*(&stru_140CF2E80 + 6616) )
    {
      SetLogicalId = Controller->FunctionTable.SetLogicalId;
      if( SetLogicalId )
      {
        v9 = ((__int64(__fastcall *)(void *))SetLogicalId)(Controller->InternalData);
        if( v9 < 0 )
        {
          LODWORD(SourceLine) = 782;
          HalpInterruptSetProblemEx(
            Controller,
            InterruptProblemSetLogicalIdFailed,
            v9,
            "minkernel\\hals\\lib\\interrupts\\common\\intsup.c",
            SourceLine);
          KeBugCheckEx(0x5Cu, (PVOID)0x200, (PVOID)*(&CmpDummyThreadEvent + 1789), Controller, v20);
        }
      }
    }
    goto LABEL_8;
  }
  v12 = 0;
  if( *(&stru_140CF2E80 + 6616) )
    goto LABEL_34;
  if( !HalpInterruptClusterModeForced
    && !*(&CmpDummyThreadEvent + 7160)
    && (!HalpInterruptMaxClusterSize || (unsigned int)qword_140C50640 <= HalpInterruptLogicalFlatLimit) )
  {
    LODWORD(v23) = 5;
    DWORD2(v23) = 1 << v1;
    goto LABEL_22;
  }
  if( *(&CmpDummyThreadEvent + 1764) >= (unsigned int)HalpInterruptMaxCluster || (Controller->Capabilities & 8) == 0 )
  {
LABEL_34:
    DWORD2(v23) = LocalUnitIdentifier;
    LODWORD(v23) = 4;
    if( *(&stru_140CF2E80 + 6616) )
      goto LABEL_35;
  }
  else
  {
    v12 = 1;
    DWORD2(v23) = *(&CmpDummyThreadEvent + 1764);
    HIDWORD(v23) = 1 << *(&CmpDummyThreadEvent + 7088);
    LODWORD(v23) = 6;
  }
LABEL_22:
  v13 = Controller->FunctionTable.SetLogicalId;
  if( v13 )
  {
    v14 = v13(Controller->InternalData, (_INTERRUPT_TARGET *)&v23);
    v15 = v23;
LABEL_24:
    v16 = DWORD2(v23);
    goto LABEL_25;
  }
  ConvertId = Controller->FunctionTable.ConvertId;
  if( !ConvertId )
    goto LABEL_35;
  LOBYTE(v7) = 1;
  v12 = 0;
  v14 = ConvertId(Controller->InternalData, (unsigned int *)&LocalUnitIdentifier, (_INTERRUPT_TARGET *)&v23, v7);
  v15 = v23;
  if( (_DWORD)v23 != 6 )
    goto LABEL_24;
  v16 = DWORD2(v23);
  if( DWORD2(v23) >= (unsigned int)HalpInterruptMaxCluster )
  {
    v16 = LocalUnitIdentifier;
    v15 = 4;
    LODWORD(v23) = 4;
    v14 = -1073741823;
    DWORD2(v23) = LocalUnitIdentifier;
  }
LABEL_25:
  if( v14 >= 0 )
  {
    *(&CmpDummyThreadEvent + 7152) = 1;
    if( v15 == 6 )
    {
      *(&CmpDummyThreadEvent + 7160) = 1;
      if( v16 > *(&CmpDummyThreadEvent + 1764) )
        *(&CmpDummyThreadEvent + 1764) = v16;
    }
    if( v12 )
    {
      if( ++*(&CmpDummyThreadEvent + 1772) >= (unsigned int)HalpInterruptMaxClusterSize )
      {
        *(&CmpDummyThreadEvent + 1772) = 0;
        ++*(&CmpDummyThreadEvent + 1764);
      }
    }
    v17 = qword_140C50630;
    *(_OWORD *)(qword_140C50630 + 24 * v1) = v23;
    *(_QWORD *)(v17 + 24 * v1 + 16) = v24;
    if( (_DWORD)v23 != 4 )
      goto LABEL_8;
    goto LABEL_36;
  }
LABEL_35:
  v18 = qword_140C50630;
  *(_DWORD *)(qword_140C50630 + 24 * v1) = 4;
  *(_DWORD *)(v18 + 24 * v1 + 8) = LocalUnitIdentifier;
LABEL_36:
  KeAddProcessorAffinityEx(&dword_140C4B7A0.Count, (unsigned int)v1);
LABEL_8:
  v6 = HalpInitializeCmciVector(Controller, (unsigned int)LocalUnitIdentifier);
  if( v6 < 0 )
  {
    Controller->ProblemStatus = v6;
    *(&CmpDummyThreadEvent + 1789) = 10;
    Controller->Problem = InterruptProblemCmciSetupFailed;
    Controller->ProblemSourceFile = "minkernel\\hals\\lib\\interrupts\\common\\intsup.c";
    Controller->ProblemSourceLine = 803;
  }
  else
  {
    v6 = HalpInitializeDeferredErrorVector(Controller, (unsigned int)LocalUnitIdentifier);
    if( v6 < 0 )
    {
      Controller->ProblemStatus = v6;
      *(&CmpDummyThreadEvent + 1789) = 38;
      Controller->Problem = InterruptProblemDeferredErrorSetupFailed;
      Controller->ProblemSourceFile = "minkernel\\hals\\lib\\interrupts\\common\\intsup.c";
      Controller->ProblemSourceLine = 816;
    }
    else
    {
      if( (Controller->Capabilities & 2) != 0 )
        Controller->FunctionTable.SetPriority(Controller->InternalData, 0);
      if( (unsigned int)(Controller->KnownType - 3) <= 1 && (Controller->Flags & 1) != 0 )
      {
        LOBYTE(v10) = 1;
        v21 = HalpInterruptRestoreController(Controller, v10);
        v6 = v21;
        if( v21 < 0 )
          KeBugCheckEx(0x5Cu, (PVOID)0x200, (PVOID)*(&CmpDummyThreadEvent + 1789), (PVOID)4, (PVOID)v21);
      }
    }
  }
LABEL_13:
  if( v3 )
    _enable();
  return v6;
}

Referenced by:

HalpInterruptInitializeController
HalpInterruptReinitializeThisProcessor
HalpInterruptResetThisProcessor