/******************************************************************* * UnhandledExceptionFilter (KERNEL32.@) */ LONG WINAPI UnhandledExceptionFilter(PEXCEPTION_POINTERS epointers) { const EXCEPTION_RECORD *rec = epointers->ExceptionRecord; LOG(LOG_FILE, 0, 0, "\n"); if (rec->ExceptionCode == EXCEPTION_ACCESS_VIOLATION && rec->NumberParameters >= 2) { switch(rec->ExceptionInformation[0]) { case EXCEPTION_WRITE_FAULT: if (check_resource_write( (void *)rec->ExceptionInformation[1] )) return EXCEPTION_CONTINUE_EXECUTION; break; } } if (!NtCurrentTeb()->Peb->BeingDebugged) { if (rec->ExceptionCode == CONTROL_C_EXIT) { /* do not launch the debugger on ^C, simply terminate the process */ TerminateProcess( GetCurrentProcess(), 1 ); } if (top_filter) { LONG ret = top_filter( epointers ); if (ret != EXCEPTION_CONTINUE_SEARCH) return ret; } /* FIXME: Should check the current error mode */ #if 0 if (!start_debugger_atomic( epointers ) || !NtCurrentTeb()->Peb->BeingDebugged) return EXCEPTION_EXECUTE_HANDLER; #else fprintf(stderr,"%s:code %x addr %x\n",__FUNCTION__,rec->ExceptionCode,rec->ExceptionAddress); return EXCEPTION_EXECUTE_HANDLER; #endif } return EXCEPTION_CONTINUE_SEARCH; }
/******************************************************************* * UnhandledExceptionFilter (KERNEL32.@) */ DWORD WINAPI UnhandledExceptionFilter(PEXCEPTION_POINTERS epointers) { const EXCEPTION_RECORD *rec = epointers->ExceptionRecord; if (rec->ExceptionCode == EXCEPTION_ACCESS_VIOLATION && rec->NumberParameters >= 2) { switch(rec->ExceptionInformation[0]) { case 1: /* write access */ if (check_resource_write( (void *)rec->ExceptionInformation[1] )) return EXCEPTION_CONTINUE_EXECUTION; break; case 8: /* execute access */ if (check_no_exec( (void *)rec->ExceptionInformation[1] )) return EXCEPTION_CONTINUE_EXECUTION; break; } } if (!NtCurrentTeb()->Peb->BeingDebugged) { if (rec->ExceptionCode == CONTROL_C_EXIT) { /* do not launch the debugger on ^C, simply terminate the process */ TerminateProcess( GetCurrentProcess(), 1 ); } if (top_filter) { DWORD ret = top_filter( epointers ); if (ret != EXCEPTION_CONTINUE_SEARCH) return ret; } /* FIXME: Should check the current error mode */ if (!start_debugger_atomic( epointers ) || !NtCurrentTeb()->Peb->BeingDebugged) return EXCEPTION_EXECUTE_HANDLER; } return EXCEPTION_CONTINUE_SEARCH; }