Por que SetUnhandledExceptionFilter não pode capturar alguma exceção, mas AddVectoredExceptionHandler pode fazer

Eu tenho experimentado um problema que a função que eu passei para oSetUnhandledExceptionFilter não foi chamado quando o código de exceção c0000374 aumentando. Mas funciona bem com o código de exceção c0000005. Então eu tentei usar oAddVectoredExceptionHandler em vez disso, e não tem o problema, a função de manipulador é chamada corretamente.

É o bug da API? Posso usar o AddVectoredExceptionHandler em vez de SetUnhandledExceptionFilter em todos os lugares?

Ambas as funções funcionam corretamente

// Exception code c0000005
int* p1 = NULL;
*p1 = 99;

Apenas AddVectoredExceptionHandler pode capturar essa exceção. (Para provar que não depende da biblioteca de tempo de execução, eu levanto a exceção manualmente e ela resulta da mesma forma.)

// Exception code c0000374
RaiseException(0xc0000374, 0, 0, NULL);

Programa de teste.

#include <tchar.h>
#include <fstream>
#include <Windows.h>

LONG WINAPI VectoredExceptionHandler(PEXCEPTION_POINTERS pExceptionInfo)
{
    std::ofstream f;
    f.open("VectoredExceptionHandler.txt", std::ios::out | std::ios::trunc);
    f << std::hex << pExceptionInfo->ExceptionRecord->ExceptionCode << std::endl;
    f.close();

    return EXCEPTION_CONTINUE_SEARCH;
}

LONG WINAPI TopLevelExceptionHandler(PEXCEPTION_POINTERS pExceptionInfo)
{
    std::ofstream f;
    f.open("TopLevelExceptionHandler.txt", std::ios::out | std::ios::trunc);
    f << std::hex << pExceptionInfo->ExceptionRecord->ExceptionCode << std::endl;
    f.close();

    return EXCEPTION_CONTINUE_SEARCH;
}


int _tmain(int argc, _TCHAR* argv[])
{
    AddVectoredExceptionHandler(1, VectoredExceptionHandler);
    SetUnhandledExceptionFilter(TopLevelExceptionHandler);

    // Exception code c0000374
    RaiseException(0xc0000374, 0, 0, NULL);     

    // Exception code c0000005
    // int* p1 = NULL;
    // *p1 = 99;        


    return 0;
}

questionAnswers(2)

yourAnswerToTheQuestion