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; 
  _DEVICE_OBJECT *v10; 
  _BYTE *v11; 
  __int64 v12; 
  _UNICODE_STRING *v13; 
  _BYTE *v14; 

  p_ErrorRecord = &Wrapper->ErrorRecord;
  if( (unsigned int)PshedDoPfa(&Wrapper->ErrorRecord) != 1
    && !WheapPolicyDisableOffline
    && *(&WheapErrorSourceTable + 60)
    && 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 = (_DEVICE_OBJECT *)((char *)p_ErrorRecord + v7->SectionOffset);
      if( (*(_BYTE *)&v9.0 & 4) != 0 )
      {
        if( (*(_BYTE *)&v9.0 & 8) != 0 && (v10->Type & 2) != 0 )
          WheaAttemptPhysicalPageOffline((unsigned __int64)v10->NextDevice >> 12, 1u, 0);
      }
      else
      {
        v11 = KeAbPreAcquire((char *)&stru_140CF2E80 + 6400, 0i64, 0i64);
        v14 = v11;
        if( _interlockedbittestandset64((volatile signed __int32 *)&stru_140CF2E80 + 1600, 0i64) )
          ExfAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&stru_140CF2E80 + 800, v11, (char *)&stru_140CF2E80 + 6400);
        if( v14 )
          v14[26] |= 1u;
        WheapPfaMemoryCheck(v12, v10, v13);
        if( (_InterlockedExchangeAdd64((_QWORD *)&stru_140CF2E80 + 800, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
          ExfTryToWakePushLock((_EX_PUSH_LOCK *)&stru_140CF2E80 + 800);
        KeAbPostRelease((char *)&stru_140CF2E80 + 6400);
      }
    }
  }
}

Referenced by:

WheapProcessWorkQueueItem