TommyTam made a patch to handle stdin redirection for win32.
diff --git a/lib/telnet.c b/lib/telnet.c
index aea7749..c133b5f 100644
--- a/lib/telnet.c
+++ b/lib/telnet.c
@@ -1089,7 +1089,9 @@
   WSAEVENT event_handle;
   WSANETWORKEVENTS events;
   HANDLE stdin_handle;
-  HANDLE objs[2];
+  HANDLE objs[2];         
+  DWORD  obj_count;
+  DWORD  wait_timeout;
   DWORD waitret;
   DWORD readfile_read;
 #else
@@ -1181,8 +1183,8 @@
   stdin_handle = GetStdHandle(STD_INPUT_HANDLE);
 
   /* Create the list of objects to wait for */
-  objs[0] = stdin_handle;
-  objs[1] = event_handle;
+  objs[0] = event_handle;
+  objs[1] = stdin_handle;
 
   /* Tell winsock what events we want to listen to */
   if(event_select_func(sockfd, event_handle, FD_READ|FD_CLOSE) == SOCKET_ERROR) {
@@ -1190,12 +1192,60 @@
     FreeLibrary(wsock2);
     return 0;
   }
-
+                                   
+  /* If stdin_handle is a pipe, use PeekNamedPipe() method to check it, 
+     else use the old WaitForMultipleObjects() way */         
+  if(GetFileType(stdin_handle) == FILE_TYPE_PIPE) {
+    /* Don't wait for stdin_handle, just wait for event_handle */
+    obj_count = 1;      
+    /* Check stdin_handle per 100 milliseconds */
+    wait_timeout = 100;  
+  } else {
+    obj_count = 2;
+    wait_timeout = INFINITE;
+  }
+  
   /* Keep on listening and act on events */
   while(keepon) {
-    waitret = WaitForMultipleObjects(2, objs, FALSE, INFINITE);
-    switch(waitret - WAIT_OBJECT_0) {
-    case 0:
+    waitret = WaitForMultipleObjects(obj_count, objs, FALSE, wait_timeout);
+    switch(waitret) {
+    case WAIT_TIMEOUT:
+    {
+      unsigned char outbuf[2];
+      int out_count = 0;
+      ssize_t bytes_written;
+      char *buffer = buf;
+
+      for(;;) {
+        if(!PeekNamedPipe(stdin_handle,NULL,0,NULL,&nread,NULL)) {
+          keepon = FALSE;
+          break;
+        }
+        
+        if(!nread)
+          break;
+          
+        if(!ReadFile(stdin_handle, buf, sizeof(data->state.buffer),
+                     &readfile_read, NULL)) {
+          keepon = FALSE;
+          break;
+        }
+        nread = readfile_read;
+        
+        while(nread--) {
+          outbuf[0] = *buffer++;
+          out_count = 1;
+          if(outbuf[0] == CURL_IAC)
+            outbuf[out_count++] = CURL_IAC;
+            
+          Curl_write(conn, conn->sock[FIRSTSOCKET], outbuf,
+                     out_count, &bytes_written);
+        }
+      }
+    }      
+    break;
+    
+    case WAIT_OBJECT_0 + 1:
     {
       unsigned char outbuf[2];
       int out_count = 0;
@@ -1221,7 +1271,7 @@
     }
     break;
       
-    case 1:
+    case WAIT_OBJECT_0:
       if(enum_netevents_func(sockfd, event_handle, &events)
          != SOCKET_ERROR) {
         if(events.lNetworkEvents & FD_READ) {