WheapPredictiveFailureAnalysis
VOID __stdcall WheapPredictiveFailureAnalysis(_WHEAP_ERROR_RECORD_WRAPPER *Wrapper){
_WHEA_ERROR_RECORD *p_ErrorRecord;
char v3;
unsigned int v4;
_WHEA_ERROR_RECORD_SECTION_DESCRIPTOR *SectionDescriptor;
_WHEA_ERROR_RECORD_SECTION_DESCRIPTOR *v6;
_WHEA_ERROR_RECORD_SECTION_DESCRIPTOR *v7;
__int64 v8;
_WHEAP_ERROR_RECORD_WRAPPER_FLAGS v9;
INT64 v10;
_BYTE *v11;
LARGE_INTEGER v12;
_BYTE *v13;
p_ErrorRecord = &Wrapper->ErrorRecord;
if( (unsigned int)PshedDoPfa(&Wrapper->ErrorRecord) != 1
&& !WheapPolicyDisableOffline
&& WheapPfaInitialized
&& p_ErrorRecord->Header.SectionCount
&& p_ErrorRecord->Header.Severity == WheaErrSevCorrected
&& (*(_BYTE *)&p_ErrorRecord->Header.Flags.0 & 1) == 0 )
{
v3 = 0;
v4 = 0;
SectionDescriptor = p_ErrorRecord->SectionDescriptor;
while( 1 )
{
v6 = SectionDescriptor;
if( (*(_BYTE *)&SectionDescriptor->Flags.0 & 1) != 0 )
break;
++v4;
++SectionDescriptor;
if( v4 >= p_ErrorRecord->Header.SectionCount )
goto LABEL_13;
}
v3 = 1;
LABEL_13:
v7 = p_ErrorRecord->SectionDescriptor;
if( v3 )
v7 = v6;
v8 = *(_QWORD *)&v7->SectionType.Data1 - *(_QWORD *)&MEMORY_ERROR_SECTION_GUID.Data1;
if( !v8 )
v8 = *(_QWORD *)v7->SectionType.Data4 - *(_QWORD *)MEMORY_ERROR_SECTION_GUID.Data4;
if( !v8 )
{
v9.0 = ($978CB274F65821CF87196E7A5560085B)Wrapper->Flags;
v10 = (INT64)p_ErrorRecord + v7->SectionOffset;
if( (*(_BYTE *)&v9.0 & 4) != 0 )
{
if( (*(_BYTE *)&v9.0 & 8) != 0 && (*(_BYTE *)v10 & 2) != 0 )
WheaAttemptPhysicalPageOffline(*(_QWORD *)(v10 + 16) >> 12, 1u, 0);
}
else
{
LODWORD(v11) = KeAbPreAcquire(&WheapPfaLock, 0i64, 0i64);
v13 = v11;
if( _interlockedbittestandset64((volatile signed __int32 *)&WheapPfaLock, 0i64) )
ExfAcquirePushLockExclusiveEx(&WheapPfaLock, v11, &WheapPfaLock);
if( v13 )
v13[26] |= 1u;
WheapPfaMemoryCheck(v12, v10);
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&WheapPfaLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)&WheapPfaLock);
KeAbPostRelease(&WheapPfaLock);
}
}
}
}Referenced by:
WheapProcessWorkQueueItem