WheapApplyThresholdChecks
NTSTATUS __fastcall WheapApplyThresholdChecks(_WHEAP_ERROR_SOURCE *ErrorSource, _WHEA_ERROR_PACKET_V2 *ErrorPacket){
unsigned __int64 v3;
char *v4;
unsigned int v5;
unsigned __int64 v6;
_LARGE_INTEGER TickCountQuad;
signed __int64 v8;
++ErrorSource->TotalErrors;
LODWORD(v3) = ErrorSource->Descriptor.Type;
if( (_DWORD)v3 == 1 )
{
v3 = 144i64;
}
else
{
if( (_DWORD)v3 == 2 || (_DWORD)v3 == 4 || (_DWORD)v3 != 5 && (_DWORD)v3 != 8 && ((int)v3 <= 11 || (int)v3 > 13) )
goto LABEL_22;
v3 = 160i64;
}
v4 = (char *)ErrorSource + v3;
if( (_WHEAP_ERROR_SOURCE *)((char *)ErrorSource + v3)
&& (*v4 == 1 || *v4 == 2 || *v4 == 3 || *v4 == 4 || *v4 == 8 || *v4 == 9 || *v4 == 10) )
{
v5 = *((_DWORD *)v4 + 5);
v6 = *((unsigned int *)v4 + 6);
if( v5 > 1 )
{
TickCountQuad = (_LARGE_INTEGER)KUSER_SHARED_DATA.TickCountQuad;
if( (_DWORD)v6
&& (v8 = (unsigned int)KeMaximumIncrement
* (KUSER_SHARED_DATA.TickCountQuad - ErrorSource->TickCountAtLastError.QuadPart),
v3 = (unsigned __int64)(v8 + ((unsigned __int128)(v8 * (__int128)(__int64)0xD6BF94D5E57A42BDui64) >> 64)) >> 63,
v8 / 10000000 > v6) )
{
ErrorSource->AccumulatedErrors = 1;
ErrorSource->TickCountAtLastError = TickCountQuad;
}
else if( ++ErrorSource->AccumulatedErrors >= v5 )
{
ErrorSource->AccumulatedErrors = 0;
LOBYTE(v3) = 1;
return v3;
}
}
}
LABEL_22:
LOBYTE(v3) = 0;
return v3;
}Referenced by:
WheaReportHwError