diff --git a/src/poll.c b/src/poll.c
index 8f4a0764..37f32d78 100644
--- a/src/poll.c
+++ b/src/poll.c
@@ -236,7 +236,16 @@ static int bsd_poll(ssh_pollfd_t *fds, nfds_t nfds, int timeout) {
         }
 
         if (FD_ISSET(fds[i].fd, &exceptfds)) {
+#ifdef _WIN32
+          int err = 0;
+          int len = sizeof(err);
+          int gso = getsockopt(fds[i].fd, SOL_SOCKET, SO_ERROR, &err, &len);
+          errno = err;
+          fds[i].revents |= POLLHUP;
+          rc = -1;
+#else
             fds[i].revents |= fds[i].events & (POLLPRI | POLLRDBAND);
+#endif
         }
 
         if (fds[i].revents & ~POLLHUP) {
diff --git a/src/session.c b/src/session.c
index d25c52cb..1517d141 100644
--- a/src/session.c
+++ b/src/session.c
@@ -23,6 +23,7 @@
 
 #include "config.h"
 
+#include <errno.h>
 #include <string.h>
 #include <stdlib.h>
 
@@ -628,7 +629,18 @@ int ssh_handle_packets(ssh_session session, int timeout) {
     }
     rc = ssh_poll_ctx_dopoll(ctx, tm);
     if (rc == SSH_ERROR) {
-        session->session_state = SSH_SESSION_STATE_ERROR;
+#ifdef _WIN32
+      CHAR buffer[512];
+      FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, errno, 0, buffer, sizeof(buffer), 0);
+      ssh_set_error(session,
+        SSH_FATAL,
+        buffer);
+#else
+      ssh_set_error(session,
+        SSH_FATAL,
+        "Failed to poll context: %s", strerror(errno));
+#endif
+      session->session_state = SSH_SESSION_STATE_ERROR;
     }
 
     return rc;
