diff options
Diffstat (limited to 'vere/pkg/noun/platform/windows/veh_handler.c')
-rw-r--r-- | vere/pkg/noun/platform/windows/veh_handler.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/vere/pkg/noun/platform/windows/veh_handler.c b/vere/pkg/noun/platform/windows/veh_handler.c new file mode 100644 index 0000000..d2a035c --- /dev/null +++ b/vere/pkg/noun/platform/windows/veh_handler.c @@ -0,0 +1,26 @@ +#include "noun.h" +#include "rsignal.h" + +c3_i +u3m_fault(void* adr_v, c3_i ser_i); + +/* _windows_exception_filter: replaces libsigsegv on windows + using vectored exception handling + */ +LONG WINAPI +_windows_exception_filter(struct _EXCEPTION_POINTERS *ExceptionInfo) +{ + EXCEPTION_RECORD ExceptionRecord = *ExceptionInfo->ExceptionRecord; + if (ExceptionRecord.ExceptionCode == EXCEPTION_ACCESS_VIOLATION && + ExceptionRecord.ExceptionInformation[0] == 1 && + u3m_fault((void*)ExceptionRecord.ExceptionInformation[1], 1)) + { + return EXCEPTION_CONTINUE_EXECUTION; + } + + if (ExceptionRecord.ExceptionCode == EXCEPTION_STACK_OVERFLOW) { + rsignal_raise(SIGSTK); + } + + return EXCEPTION_CONTINUE_SEARCH; +} |