I have experienced a problem that the function I passed to the SetUnhandledExceptionFilter didn\'t get called when the exception code c0000374 raising. But it works fine wit
The exception is actually caught directly at its source, in RtlReportCriticalFailure
, called by the heap manager once heap corruption is detected. The SEH handler registered in this function calls RtlReportException
, quickly followed by NtTerminateProcess
.
I can only conclude that SEH handlers are avoided on purpose -- with the heap corrupted, the stack contents (and therefore SEH registrations) are suspect too; and the application can't reasonably recover from heap corruption anyway.
It happens because of this code in MSVC CRT startup:
/*
* Enable app termination when heap corruption is detected on
* Windows Vista and above. This is a no-op on down-level OS's
* and enabled by default for 64-bit processes.
*/
if (!_NoHeapEnableTerminationOnCorruption)
{
HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0);
}
If you want to disable it (not recommended), link nohetoc.obj
to your program.