summaryrefslogtreecommitdiff
path: root/vere/pkg/noun/platform/windows/veh_handler.c
diff options
context:
space:
mode:
authorpolwex <polwex@sortug.com>2025-10-05 21:56:51 +0700
committerpolwex <polwex@sortug.com>2025-10-05 21:56:51 +0700
commitfcedfddf00b3f994e4f4e40332ac7fc192c63244 (patch)
tree51d38e62c7bdfcc5f9a5e9435fe820c93cfc9a3d /vere/pkg/noun/platform/windows/veh_handler.c
claude is gud
Diffstat (limited to 'vere/pkg/noun/platform/windows/veh_handler.c')
-rw-r--r--vere/pkg/noun/platform/windows/veh_handler.c26
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;
+}