HalpConnectThermalInterrupt
NTSTATUS __stdcall HalpConnectThermalInterrupt(ULONG_PTR BugCheckParameter4){
INT64 v1;
void *v2;
INT64 v3;
NTSTATUS result;
_REGISTERED_INTERRUPT_CONTROLLER *v5;
INT64 v6;
KPCR *Pcr;
PVOID v8;
UINT64 SourceLine;
_INTERRUPT_LINE_STATE LineState;
INT64 v11;
_INTERRUPT_LINE Line;
*(_DWORD *)&LineState.EmulateActiveBoth = 0;
*((_DWORD *)&LineState.ProcessorTarget.Target + 1) = 0;
v2 = *(void **)&BugCheckParameter4;
*(_QWORD *)(&LineState.ProcessorTarget.ClusterId + 1) = 0i64;
HIDWORD(LineState.ProcessorTarget.HypervisorTarget.InterruptData) = 0;
LODWORD(v3) = KeGetPcr()->Prcb.Number;
LODWORD(v11) = 0;
result = HalpInterruptGetIdentifiers(v3, (INT64)&v11, 0i64, v1);
if( result >= 0 )
{
v5 = (_REGISTERED_INTERRUPT_CONTROLLER *)Controller;
Line.UnitId = *(_DWORD *)(Controller + 232);
Line.Line = -2;
if( *(_DWORD *)(Controller + 216) == 2 && HalpInterruptFindLines((unsigned int *)&Line) )
{
Pcr = KeGetPcr();
if( !BYTE1(Pcr->HalReserved[5]) )
{
if( *(&CmpDummyThreadEvent + 844) )
{
if( (void *)*(&CmpDummyThreadEvent + 844) != v2 )
{
LODWORD(SourceLine) = 3391;
HalpInterruptSetProblemEx(
0i64,
InterruptProblemMismatchedThermalLvtIsr,
0i64,
"minkernel\\hals\\lib\\interrupts\\common\\intsup.c",
SourceLine);
KeBugCheckEx(0x5Cu, (PVOID)0x200, (PVOID)*(&CmpDummyThreadEvent + 1789), v8, v2);
}
}
else
{
*(&CmpDummyThreadEvent + 844) = v2;
}
HalpInterruptSetIdtEntry(0xCDui64, HalpInterruptThermalService, 12, v6, (UINT64 *)0xFFFFFFFFFFFFFFFFi64);
BYTE1(Pcr->HalReserved[5]) = 1;
goto LABEL_8;
}
if( (void *)*(&CmpDummyThreadEvent + 844) == v2 )
{
LABEL_8:
*(_DWORD *)&LineState.EmulateActiveBoth = 0;
*((_DWORD *)&LineState.ProcessorTarget.Target + 1) = 0;
*(_QWORD *)(&LineState.ProcessorTarget.ClusterId + 1) = 0i64;
HIDWORD(LineState.ProcessorTarget.HypervisorTarget.InterruptData) = 0;
LineState.Routing.UnitId = -1;
LineState.ProcessorTarget.PhysicalTarget = v11;
LineState.Polarity = InterruptActiveHigh;
LineState.TriggerMode = Latched;
LineState.Flags = 16;
LineState.Routing.Line = 1;
LineState.ProcessorTarget.Target = InterruptTargetPhysical;
LineState.Vector = 205;
LineState.Priority = HalpInterruptGetPriority((INT64)v5, 0xCDu);
return HalpInterruptSetLineStateInternal(v5, &Line, &LineState);
}
LODWORD(SourceLine) = 3421;
HalpInterruptSetProblemEx(
0i64,
InterruptProblemMismatchedThermalLvtIsr,
0i64,
"minkernel\\hals\\lib\\interrupts\\common\\intsup.c",
SourceLine);
return -1073741275;
}
else
{
return -1073741637;
}
}
return result;
}Referenced by:
No references.