diff --git a/ChangeLog b/ChangeLog
index b63d98ec5b..2e268b8d81 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Fri Aug 29 04:47:49 2008  NAKAMURA Usaku  <usa@ruby-lang.org>
+
+	* win32/win32.c (rb_w32_read, rb_w32_write): more accurate handling
+	  of wait result.
+
 Fri Aug 29 02:59:35 2008  Tanaka Akira  <akr@fsij.org>
 
 	* transcode.c (econv_finish): new method.
diff --git a/win32/win32.c b/win32/win32.c
index 7d5fbda63a..ece432f0b0 100644
--- a/win32/win32.c
+++ b/win32/win32.c
@@ -4367,7 +4367,9 @@ rb_w32_read(int fd, void *buf, size_t size)
 	if (pol) {
 	    wait = rb_w32_wait_events_blocking(&ol.hEvent, 1, INFINITE);
 	    if (wait != WAIT_OBJECT_0) {
-		if (errno != EINTR)
+		if (wait == WAIT_OBJECT_0 + 1)
+		    errno = EINTR;
+		else
 		    errno = map_errno(GetLastError());
 		CloseHandle(ol.hEvent);
 		cancel_io((HANDLE)_osfhnd(fd));
@@ -4471,7 +4473,9 @@ rb_w32_write(int fd, const void *buf, size_t size)
 	if (pol) {
 	    wait = rb_w32_wait_events_blocking(&ol.hEvent, 1, INFINITE);
 	    if (wait != WAIT_OBJECT_0) {
-		if (errno != EINTR)
+		if (wait == WAIT_OBJECT_0 + 1)
+		    errno = EINTR;
+		else
 		    errno = map_errno(GetLastError());
 		CloseHandle(ol.hEvent);
 		cancel_io((HANDLE)_osfhnd(fd));