HalpInterruptStartProcessor
BOOL __stdcall HalpInterruptStartProcessor(
UINT64 NtNumber,
UINT64 ProcessorId,
UINT64 Flags,
_KPROCESSOR_STATE *ProcessorState){
char v5;
NTSTATUS v6;
UINT64 *p_MemoryMap;
NTSTATUS NextProcessorLocalId;
_KPROCESSOR_STATE *v9;
CHAR started;
INT64 v11;
PKINTERRUPT_ROUTINE **v12;
UINT32 v13;
PKINTERRUPT_ROUTINE *v14;
bool v15;
INT64 v16;
NTSTATUS v17;
char v19;
UINT64 SourceLine;
_TILED_MEMORY_MAP MemoryMap;
int v22;
UINT64 LocalId;
LODWORD(LocalId) = ProcessorId;
v5 = Flags;
MemoryMap.PageDirectoryPhysical.QuadPart = 0i64;
LOBYTE(v6) = 0;
MemoryMap.PageDirectory = 0i64;
p_MemoryMap = 0i64;
if( *(&stru_140CF2E80 + 1859) && (unsigned int)HalpInterruptProcessorsStarted >= *(&stru_140CF2E80 + 1859) )
return 2;
NextProcessorLocalId = HalpInterruptGetNextProcessorLocalId((unsigned int)Flags, &LocalId);
if( byte_140C4A108 || (v5 & 2) != 0 )
{
HalpInterruptProcessorRestarting = 1;
if( NextProcessorLocalId == -1073740024 )
NextProcessorLocalId = 0;
}
else
{
HalpInterruptProcessorRestarting = 0;
}
if( NextProcessorLocalId < 0 )
return 2;
HalpInterruptProcessorHidden = (v5 & 4) != 0;
started = HalpHvVpStartEnabled();
v11 = qword_140C49E98;
MemoryMap.PageTable = (void *)qword_140C49E98;
if( !HalpInterruptProcessorRestarting && !HalpInterruptProcessorHidden )
{
if( HalpMmBuildTiledMemoryMap(&MemoryMap, v9) >= 0 )
{
p_MemoryMap = (UINT64 *)&MemoryMap;
goto LABEL_10;
}
return 2;
}
LABEL_10:
HalpInterruptBuildStartupStub(
&MemoryMap.PageTable,
(PHYSICAL_ADDRESS **)&MemoryMap.PageDirectoryPhysical,
ProcessorState,
(__int64)p_MemoryMap);
v15 = 0;
if( !started )
{
_disable();
v15 = (v22 & 0x200) != 0;
}
*(_BYTE *)(v11 + 4) = 0;
if( (HalSystemVectorDispatchEntry(v13, v12, v14) & 0x80000000) != 0 )
goto LABEL_22;
if( started )
{
v17 = HalpHvStartProcessor((unsigned int)LocalId, v16, v11);
}
else
{
v17 = -1073741823;
if( !*(_QWORD *)(Controller + 128) )
goto LABEL_33;
v17 = (*(__int64(__fastcall **)(_QWORD, _QWORD, INT64, _QWORD))(Controller + 128))(
*(_QWORD *)(Controller + 16),
(unsigned int)LocalId,
v11,
MemoryMap.PageDirectoryPhysical.anonymous_0.LowPart);
}
if( v17 >= 0 )
{
v6 = HalpInterruptWaitForProcessorStartUp((_BYTE *)(v11 + 4), started);
if( v6 != 4 )
{
LODWORD(SourceLine) = 1191;
HalpInterruptSetProblemEx(
(_REGISTERED_INTERRUPT_CONTROLLER *)Controller,
InterruptProblemProcessorNotAlive,
0i64,
"minkernel\\hals\\lib\\interrupts\\common\\start.c",
SourceLine);
}
goto LABEL_19;
}
LABEL_33:
LODWORD(SourceLine) = 1197;
HalpInterruptSetProblemEx(
(_REGISTERED_INTERRUPT_CONTROLLER *)Controller,
InterruptProblemStartProcessorFailed,
(unsigned int)v17,
"minkernel\\hals\\lib\\interrupts\\common\\start.c",
SourceLine);
LOBYTE(v6) = v19 - 11;
LABEL_19:
if( !started && v15 )
_enable();
LABEL_22:
if( !HalpInterruptProcessorRestarting && !HalpInterruptProcessorHidden )
{
if( p_MemoryMap )
HalpMmFreeTiledMemoryMap(p_MemoryMap);
}
HalpInterruptProcessorHidden = 0;
return v6;
}Referenced by:
HalStartDynamicProcessor
HalStartNextProcessor
HalpBlkStartBlockedProcessor
HalpDpStartProcessor