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