HalpCmcPollProcessor
VOID __fastcall HalpCmcPollProcessor(INT64 a1, CHAR a2, INT64 a3, INT64 a4){
unsigned int v4;
INT64 v5;
unsigned int v6;
unsigned __int8 CurrentIrql;
char v10;
char v11;
__int64 v12;
unsigned __int64 v13;
INT64 v14;
char v16[12];
struct _KDPC_WATCHDOG_INFORMATION WatchdogInformation;
*(_DWORD *)v16 = 0;
*(_QWORD *)&v16[4] = a1;
v4 = 0;
v5 = 0i64;
v6 = 0;
CurrentIrql = 0;
memset(&WatchdogInformation, 0, sizeof(WatchdogInformation));
while( (int)HalpMcaReadErrorPresence(v5, a3) >= 0 )
{
v10 = 0;
v11 = 0;
if( !a2 )
goto LABEL_12;
v10 = 1;
if( KeGetCurrentIrql() < 2u )
{
v11 = 1;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
}
if( _InterlockedCompareExchange(&HalpCmcLock, 1, 0) )
{
if( v11 )
__writecr8(CurrentIrql);
}
else
{
LABEL_12:
if( (int)HalpMcaReadError(1i64, *(_QWORD *)&v16[4] + 80i64, (INT64 *)v16, 0i64, a3) < 0 )
{
if( a2 )
{
if( v10 )
_InterlockedExchange(&HalpCmcLock, 0);
if( v11 )
__writecr8(CurrentIrql);
}
break;
}
v12 = *(_QWORD *)&v16[4];
v13 = *(_QWORD *)(*(_QWORD *)&v16[4] + 120i64);
v14 = *(_QWORD *)&v16[4] + 80i64;
*(_DWORD *)(*(_QWORD *)&v16[4] + 12i64) = 0;
v4 += (v13 >> 38) & 0x7FFF;
*(_DWORD *)(v12 + 20) = *(_DWORD *)v16;
HalpMcaReportError((_WHEA_ERROR_PACKET_V2 *)v12, v14, a3);
HalpMcaClearError(*(_QWORD *)&v16[4] + 80i64, a3);
if( a2 )
{
if( v10 )
_InterlockedExchange(&HalpCmcLock, 0);
if( v11 )
__writecr8(CurrentIrql);
}
++v6;
if( HalpCmcPollCount != -1 && HalpCmcPollCount && v6 >= HalpCmcPollCount )
break;
}
v5 = 2i64;
if( KeGetCurrentIrql() >= 2u )
{
memset(&WatchdogInformation, 0, sizeof(WatchdogInformation));
if( !KeQueryDpcWatchdogInformation(&WatchdogInformation) )
{
if( HalpCmcIsDpcTimeRunningLow((INT64 *)&WatchdogInformation) )
{
HalpCmcLogPollingTimeoutEvent((INT64)&WatchdogInformation, v6);
break;
}
}
}
}
*(_DWORD *)(a4 + 156) = v4;
if( v4 > *(_DWORD *)(a4 + 160) )
*(_DWORD *)(a4 + 160) = v4;
}Referenced by:
HalpCmcWorkerRoutine
HalpCmciPollProcessor