diff --git a/indra/llcommon/llcoros.cpp b/indra/llcommon/llcoros.cpp
index 3ffce4810a830aa4134510dee2e53d8892fd5279..934f04287d6aed9ffe885d87df888da1e6c53d24 100644
--- a/indra/llcommon/llcoros.cpp
+++ b/indra/llcommon/llcoros.cpp
@@ -40,6 +40,10 @@
 #include "stringize.h"
 #include "llexception.h"
 
+#if LL_WINDOWS
+#include <excpt.h>
+#endif
+
 namespace {
 void no_op() {}
 } // anonymous namespace
@@ -272,6 +276,43 @@ void LLCoros::setStackSize(S32 stacksize)
     mStackSize = stacksize;
 }
 
+#if LL_WINDOWS
+
+static const U32 STATUS_MSC_EXCEPTION = 0xE06D7363; // compiler specific
+
+U32 exception_filter(U32 code, struct _EXCEPTION_POINTERS *exception_infop)
+{
+    if (code == STATUS_MSC_EXCEPTION)
+    {
+        // C++ exception, go on
+        return EXCEPTION_CONTINUE_SEARCH;
+    }
+    else
+    {
+        // handle it
+        return EXCEPTION_EXECUTE_HANDLER;
+    }
+}
+
+void LLCoros::winlevel(const callable_t& callable)
+{
+    __try
+    {
+        callable();
+    }
+    __except (exception_filter(GetExceptionCode(), GetExceptionInformation()))
+    {
+        // convert to C++ styled exception
+        // Note: it might be better to use _se_set_translator
+        // if you want exception to inherit full callstack
+        char integer_string[32];
+        sprintf(integer_string, "SEH, code: %lu\n", GetExceptionCode());
+        throw std::exception(integer_string);
+    }
+}
+
+#endif
+
 // Top-level wrapper around caller's coroutine callable. This function accepts
 // the coroutine library's implicit coro::self& parameter and saves it, but
 // does not pass it down to the caller's callable.
@@ -282,7 +323,11 @@ void LLCoros::toplevel(coro::self& self, CoroData* data, const callable_t& calla
     // run the code the caller actually wants in the coroutine
     try
     {
+#if LL_WINDOWS
+        winlevel(callable);
+#else
         callable();
+#endif
     }
     catch (const LLContinueError&)
     {
diff --git a/indra/llcommon/llcoros.h b/indra/llcommon/llcoros.h
index bbe2d22af4e1b09609ff52ea93dee84002267116..884d6b159c5a3fc21b70ef6e80da618555225c76 100644
--- a/indra/llcommon/llcoros.h
+++ b/indra/llcommon/llcoros.h
@@ -182,6 +182,9 @@ class LL_COMMON_API LLCoros: public LLSingleton<LLCoros>
     bool cleanup(const LLSD&);
     struct CoroData;
     static void no_cleanup(CoroData*);
+#if LL_WINDOWS
+    static void winlevel(const callable_t& callable);
+#endif
     static void toplevel(coro::self& self, CoroData* data, const callable_t& callable);
     static CoroData& get_CoroData(const std::string& caller);