Стоит задача написать простенькое логирование необрабатываемых исключений в программе. Попробовал векторную обработку исключений, и тут сразу же вопрос возник - а как правильно сделать обработку толлько тех исключений, которые не смогла обработать SEH? Если просто сделать AddVectoredExceptionHandler(1,VectoredExceptionHandler); то ко мне пойдут все исключения.
1. Стековая маршрутизация из VEH. 2. Замена последнего сех на совй в цепи. 3. UEF легальный механизм.
sergegers Первый аргумент указывает где сделать запись в LIST_ENTRY, тоесть в начале списка или в его конце. От этого зависит очерёдность вызова вектора, но это не имеет никакого отношения к сех - вначале выполняются все VEH, затем все SEH. Последний из них(который в kernel32) вызывает UnhandlerExceptionFilter(). sn0w После отработки последнего сех управление возвращается в системный диспетчер, где будет сгенерин повторно фолт. Это событие можно словить - из RtlDispatchException() возвращается результат отката фолта - если будет ноль, значит фолт не обработанный: Код (Text): .data g_pStub2ndf PVOID ? .code Msg$ CHAR "UNHANDLED XCPT: Ip = 0x%p, Code = 0x%X", 13, 10, 0 XcptStub proc C .if !al mov eax,EXCEPTION_POINTERS.ExceptionRecord[esp] invoke DbgPrint, addr Msg$, EXCEPTION_RECORD.ExceptionAddress[eax], EXCEPTION_RECORD.ExceptionCode[eax] xor eax,eax .endif jmp g_pStub2ndf XcptStub endp VEH proc uses ebx ExceptionPointers:PEXCEPTION_POINTERS mov ecx,ExceptionPointers mov edx,offset XcptStub mov ecx,EXCEPTION_POINTERS.ExceptionRecord[ecx] xchg dword ptr [ecx - 4*(4 + 1)],edx ; 2 аргумента передаёт ядро, копия их передаётся в диспетчер. xor eax,eax mov g_pStub2ndf,edx ret VEH endp