HalpMceHandlerWithRendezvous
INT64 __fastcall HalpMceHandlerWithRendezvous(INT64 a1){
unsigned int ActiveProcessorCount;
INT64 result;
int v4[10];
ULONG_PTR BugCheckParameter1;
HIDWORD(BugCheckParameter1) = 0;
while( HalpMceRendezvousInProgress )
_mm_pause();
ActiveProcessorCount = KeQueryActiveProcessorCountEx(0xFFFFu);
if( _InterlockedIncrement(&HalpMceProcessorCount) == ActiveProcessorCount )
HalpMceRendezvousInProgress = 1;
if( HalpMcaRecoverySupported )
{
if( HalpMceHandler(a1, 1) )
HalpMceErrorFound = 1;
if( _InterlockedIncrement(&HalpMceRendezvousSrarOnlyCount) == 1 )
{
if( !HalpMceBarrierWait(&HalpMceRendezvousSrarOnlyCount, ActiveProcessorCount, 5000i64) )
{
BugCheckParameter1 = 2147483650i64;
HalpMcaReportError(0i64, 0i64, 0x80000002ui64);
}
_InterlockedAdd(&HalpMceRendezvousSrarOnlyCount, 1u);
}
else
{
HalpMceBarrierWait(&HalpMceRendezvousSrarOnlyCount, ActiveProcessorCount + 1, 0i64);
}
}
if( HalpMceHandler(a1, 0) )
HalpMceErrorFound = 1;
if( _InterlockedIncrement(&HalpMceRendezvousCount) == 1 )
{
if( !HalpMceBarrierWait(&HalpMceRendezvousCount, ActiveProcessorCount, 5000i64) || !HalpMceErrorFound )
{
LODWORD(BugCheckParameter1) = -2147483647;
HalpMcaReportError(0i64, 0i64, BugCheckParameter1);
}
_InterlockedAdd(&HalpMceRendezvousCount, 1u);
}
else
{
HalpMceBarrierWait(&HalpMceRendezvousCount, ActiveProcessorCount + 1, 0i64);
}
result = (unsigned int)_InterlockedExchangeAdd(&HalpMceProcessorCount, 0xFFFFFFFF);
if( (_DWORD)result == 1 )
{
HalpMceErrorFound = 0;
HalpMceRendezvousSrarOnlyCount = 0;
HalpMceRendezvousCount = 0;
_InterlockedOr(v4, 0);
HalpMceRendezvousInProgress = 0;
}
return result;
}Referenced by:
HalpHandleMachineCheck