HalpNmiReboot
VOID __fastcall HalpNmiReboot(_ETHREAD *Thread, _KPRCB *Prcb, INT64 a3, INT64 a4){
DOUBLE v4;
struct _KPRCB *CurrentPrcb;
int v6;
INT64 result[22];
memset((INT64)result, 0i64);
CurrentPrcb = KeGetCurrentPrcb();
if( (*((_WORD *)CurrentPrcb + 33) & 0xFF00 | (*((unsigned __int8 *)CurrentPrcb + 64) << 16)) > 0x50100u )
{
v6 = *(_DWORD *)HalpInterruptProcessorsStarted;
HalpInterruptNmiRebootInProgress = 1;
KeCopyAffinityEx((__int64)result, &KeActiveProcessors.Count);
KeRemoveProcessorAffinityEx((unsigned __int16 *)result, *((_DWORD *)CurrentPrcb + 9));
HalSendNMI((__int64)result);
KeStallExecutionProcessor(0x1F4u);
if( (unsigned __int8)HalpIsHvPresent() )
{
while( *(int *)HalpInterruptProcessorsStarted > 1 )
_mm_pause();
}
if( *(_DWORD *)HalpInterruptProcessorsStarted != v6 )
HalpInterruptRebootService(0i64, v4);
}
}Referenced by:
HalpInterruptResetAllProcessors