+ DWORD id = mono_thread_info_get_tid (info);
+ HANDLE handle;
+ DWORD result;
+
+ handle = OpenThread (THREAD_ALL_ACCESS, FALSE, id);
+ g_assert (handle);
+
+ if (info->async_target) {
+ MonoContext ctx;
+ CONTEXT context;
+ gboolean res;
+
+ ctx = info->suspend_state.ctx;
+ mono_threads_get_runtime_callbacks ()->setup_async_callback (&ctx, info->async_target, info->user_data);
+ info->async_target = info->user_data = NULL;
+
+ context.ContextFlags = CONTEXT_INTEGER | CONTEXT_CONTROL;
+
+ if (!GetThreadContext (handle, &context)) {
+ CloseHandle (handle);
+ return FALSE;
+ }
+
+ g_assert (context.ContextFlags & CONTEXT_INTEGER);
+ g_assert (context.ContextFlags & CONTEXT_CONTROL);
+
+ mono_monoctx_to_sigctx (&ctx, &context);
+
+ context.ContextFlags = CONTEXT_INTEGER | CONTEXT_CONTROL;
+ res = SetThreadContext (handle, &context);
+ g_assert (res);
+ }
+
+ result = ResumeThread (handle);
+ g_assert (result != (DWORD)-1);
+
+ CloseHandle (handle);
+
+ return result != (DWORD)-1;