WheaConfigureErrorSource

NTSTATUS __stdcall WheaConfigureErrorSource(
        _WHEA_ERROR_SOURCE_TYPE SourceType,
        _WHEA_ERROR_SOURCE_CONFIGURATION *Configuration,
        INT64 a3,
        INT64 a4){
  __int64 v4; 
  volatile signed __int32 *v6; 
  NTSTATUS v7; 
  _BYTE *v8; 
  _BYTE *v9; 
  _BYTE *v10; 
  int(__fastcall *Correct)(_WHEA_ERROR_SOURCE_DESCRIPTOR *, unsigned int *); 
  int(__fastcall *Initialize)(unsigned int, _WHEA_ERROR_SOURCE_DESCRIPTOR *, void *); 
  int(__fastcall *CreateRecord)(_WHEA_ERROR_SOURCE_DESCRIPTOR *, _WHEA_ERROR_PACKET_V2 *, _WHEA_ERROR_RECORD *, unsigned int, void *); 
  void *Recover; 
  __int64 v15; 
  char v16; 
  int v18[18]; 

  v4 = SourceType;
  if( (unsigned int)SourceType > WheaErrSrcTypeDeviceDriver )
    return -1073741811;
  v6 = (volatile signed __int32 *)((char *)&stru_140CF2E80 + 64 * (__int64)(int)SourceType + 5312);
  v7 = -1073741823;
  v8 = KeAbPreAcquire((char *)&WheapDeferredInternalLogsEventLock + 192, 0i64, 0i64);
  if( _InterlockedCompareExchange64((_QWORD *)&WheapDeferredInternalLogsEventLock + 24, 17i64, 0i64) )
    ExfAcquirePushLockSharedEx(
      (_EX_PUSH_LOCK *)&WheapDeferredInternalLogsEventLock + 24,
      v8,
      (char *)&WheapDeferredInternalLogsEventLock + 192);
  if( v8 )
    v8[26] |= 1u;
  v9 = KeAbPreAcquire((char *)&stru_140CF2E80 + 64 * v4 + 5312, 0i64, 0i64);
  v10 = v9;
  if( _interlockedbittestandset64(v6, 0i64) )
    ExfAcquirePushLockExclusiveEx(
      (_EX_PUSH_LOCK *)&stru_140CF2E80 + 8 * v4 + 664,
      v9,
      (char *)&stru_140CF2E80 + 64 * v4 + 5312);
  if( v10 )
    v10[26] |= 1u;
  if( !*((_BYTE *)v6 + 8) )
  {
    *((_DWORD *)v6 + 3) = Configuration->Flags;
    Correct = Configuration->Correct;
    if( Correct )
      *((_QWORD *)v6 + 2) = Correct;
    Initialize = Configuration->Initialize;
    if( Initialize )
      *((_QWORD *)v6 + 3) = Initialize;
    CreateRecord = Configuration->CreateRecord;
    if( CreateRecord )
      *((_QWORD *)v6 + 4) = CreateRecord;
    Recover = Configuration->Recover;
    if( !Recover )
    {
      if( (int)v4 <= 11 || (_DWORD)v4 == 14 )
        goto LABEL_22;
      Recover = WheapGenericErrSrcRecover;
    }
    *((_QWORD *)v6 + 5) = Recover;
LABEL_22:
    v15 = *(_QWORD *)&Configuration[1].Flags;
    if( v15 )
      *((_QWORD *)v6 + 6) = v15;
    _InterlockedOr(v18, 0);
    *((_BYTE *)v6 + 8) = 1;
    if( WheapInitializationComplete )
      v7 = WheapInitializeDeferredErrorSources((_WHEA_ERROR_SOURCE_TYPE)v4);
  }
  v16 = _InterlockedExchangeAdd64((volatile signed __int64 *)v6, 0xFFFFFFFFFFFFFFFFui64);
  if( (v16 & 2) != 0 && (v16 & 4) == 0 )
    ExfTryToWakePushLock((_EX_PUSH_LOCK *)&stru_140CF2E80 + 8 * v4 + 664);
  KeAbPostRelease((char *)&stru_140CF2E80 + 64 * v4 + 5312);
  if( _InterlockedCompareExchange64((_QWORD *)&WheapDeferredInternalLogsEventLock + 24, 0i64, 17i64) != 17 )
    ExfReleasePushLockShared((_EX_PUSH_LOCK *)&WheapDeferredInternalLogsEventLock + 24);
  KeAbPostRelease((char *)&WheapDeferredInternalLogsEventLock + 192);
  return v7;
}

Referenced by:

HalpWheaInitDiscard
WheaAddErrorSourceDeviceDriver