HalpCmcPollProcessor
VOID __stdcall HalpCmcPollProcessor(INT64 a1, CHAR a2, INT64 a3, INT64 a4){
unsigned int v4;
INT64 v5;
unsigned int v6;
unsigned __int8 CurrentIrql;
char v10;
char v11;
int v12;
__int64 v13;
unsigned __int64 v14;
INT64 v15;
INT64 v16;
INT64 v17;
INT64 v18;
INT64 v19;
INT64 v20;
INT16 PageIrql[4];
INT64 v22[2];
UINT64 v23;
INT64 v24;
INT64 v25;
INT64 v26;
INT64 v27;
HIDWORD(v20) = 0;
*(_QWORD *)PageIrql = a1;
v4 = 0;
v5 = 0i64;
LOBYTE(v20) = a2;
v6 = 0;
LODWORD(v23) = 0;
CurrentIrql = 0;
*(_OWORD *)v22 = 0i64;
while( HalpMcaReadErrorPresence(v5, a3) >= 0 )
{
v10 = 0;
v11 = 0;
if( !(_BYTE)v20 )
goto LABEL_12;
v10 = 1;
if( KeGetCurrentIrql() < 2u )
{
v11 = 1;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
}
if( _InterlockedCompareExchange((_DWORD *)&stru_140CF2E80 + 1975, 1, 0) )
{
if( v11 )
__writecr8(CurrentIrql);
}
else
{
LABEL_12:
HalpMcaReadError(
1i64,
*(_QWORD *)PageIrql + 80i64,
(INT64)&v20 + 4,
0i64,
a3,
v19,
v20,
PageIrql[0],
v22[0],
(_MMSUPPORT_INSTANCE *)v22[1],
v23);
if( v12 < 0 )
{
if( (_BYTE)v20 )
{
if( v10 )
_InterlockedExchange((_DWORD *)&stru_140CF2E80 + 1975, 0);
if( v11 )
__writecr8(CurrentIrql);
}
break;
}
v13 = *(_QWORD *)PageIrql;
v14 = *(_QWORD *)(*(_QWORD *)PageIrql + 120i64);
v15 = *(_QWORD *)PageIrql + 80i64;
*(_DWORD *)(*(_QWORD *)PageIrql + 12i64) = 0;
v4 += (v14 >> 38) & 0x7FFF;
*(_DWORD *)(v13 + 20) = HIDWORD(v20);
HalpMcaReportError((_WHEA_ERROR_PACKET_V2 *)v13, v15, a3);
HalpMcaClearError(*(_QWORD *)PageIrql + 80i64, a3);
if( (_BYTE)v20 )
{
if( v10 )
_InterlockedExchange((_DWORD *)&stru_140CF2E80 + 1975, 0);
if( v11 )
__writecr8(CurrentIrql);
}
++v6;
if( HalpCmcPollCount != -1 && HalpCmcPollCount && v6 >= HalpCmcPollCount )
break;
}
v5 = 2i64;
if( KeGetCurrentIrql() >= 2u )
{
*(_OWORD *)v22 = 0i64;
LODWORD(v23) = 0;
if( !KeQueryDpcWatchdogInformation((_KDPC_WATCHDOG_INFORMATION *)v22) )
{
if( HalpCmcIsDpcTimeRunningLow(v22) )
{
HalpCmcLogPollingTimeoutEvent(
(INT64)v22,
v6,
v16,
v17,
v18,
v19,
v20,
PageIrql[0],
v22[0],
v22[1],
v23,
v24,
v25,
v26,
v27);
break;
}
}
}
}
*(_DWORD *)(a4 + 156) = v4;
if( v4 > *(_DWORD *)(a4 + 160) )
*(_DWORD *)(a4 + 160) = v4;
}Referenced by:
HalpCmcWorkerRoutine
HalpCmciPollProcessor