diff --git a/ruapu.h b/ruapu.h
index a1a4488..0b5ff35 100644
--- a/ruapu.h
+++ b/ruapu.h
@@ -38,11 +38,28 @@ static int ruapu_detect_isa(const void* some_inst)
     return 0;
 }
 #else // WINAPI_FAMILY == WINAPI_FAMILY_APP
+typedef const void* ruapu_some_inst;
+#if defined (_MSC_VER) // MSVC
+static int ruapu_detect_isa(const void* some_inst)
+{
+    int g_ruapu_sigill_caught = 0;
+
+    __try
+    {
+        ((void (*)())some_inst)();
+    }
+    __except (GetExceptionCode() == EXCEPTION_ILLEGAL_INSTRUCTION ?
+        EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
+    {
+        g_ruapu_sigill_caught = 1;
+    }
+
+    return g_ruapu_sigill_caught ? 0 : 1;
+}
+#else
 static int g_ruapu_sigill_caught = 0;
 static jmp_buf g_ruapu_jmpbuf;
 
-typedef const void* ruapu_some_inst;
-
 static LONG CALLBACK ruapu_catch_sigill(struct _EXCEPTION_POINTERS* ExceptionInfo)
 {
     if (ExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_ILLEGAL_INSTRUCTION)
@@ -69,6 +86,7 @@ static int ruapu_detect_isa(const void* some_inst)
 
     return g_ruapu_sigill_caught ? 0 : 1;
 }
+#endif
 #endif // WINAPI_FAMILY == WINAPI_FAMILY_APP
 
 #elif defined __ANDROID__ || defined __linux__ || defined __APPLE__ || defined __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__ || defined __DragonFly__ || defined __sun__
@@ -111,7 +129,7 @@ static int ruapu_detect_isa(ruapu_some_inst some_inst)
     return g_ruapu_sigill_caught ? 0 : 1;
 }
 
-#elif defined __SYTERKIT__ 
+#elif defined __SYTERKIT__
 
 typedef void (*ruapu_some_inst)();
 #include <mmu.h>
@@ -519,7 +537,7 @@ void ruapu_init()
     g_ruapu_isa_supported[j] = 0;
 #elif defined __openrisc__
     ruapu_detect_openrisc_isa();
-#else 
+#else
     // initialize g_ruapu_isa_map for baremetal here, default all zero
     // there is still ruapu_some_XYZ() functions available
     // but you have to work out your own signal handling