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