Index: /trunk/src/kmk/kmkbuiltin.h
===================================================================
--- /trunk/src/kmk/kmkbuiltin.h	(revision 3223)
+++ /trunk/src/kmk/kmkbuiltin.h	(revision 3224)
@@ -150,5 +150,5 @@
 #ifdef KBUILD_OS_WINDOWS
 extern int kmk_builtin_kSubmit(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx, struct child *pChild, pid_t *pPidSpawned);
-extern int kSubmitSubProcGetResult(intptr_t pvUser, int *prcExit, int *piSigNo);
+extern int kSubmitSubProcGetResult(intptr_t pvUser, int fBlock, int *prcExit, int *piSigNo);
 extern int kSubmitSubProcKill(intptr_t pvUser, int iSignal);
 extern void kSubmitSubProcCleanup(intptr_t pvUser);
Index: /trunk/src/kmk/kmkbuiltin/kSubmit.c
===================================================================
--- /trunk/src/kmk/kmkbuiltin/kSubmit.c	(revision 3223)
+++ /trunk/src/kmk/kmkbuiltin/kSubmit.c	(revision 3224)
@@ -1196,8 +1196,9 @@
  * @returns 0 on success, -1 if ReadFile was restarted.
  * @param   pvUser              The worker instance.
+ * @param   fBlock              if we're to block waiting for the result or not.
  * @param   prcExit             Where to return the exit code.
  * @param   piSigNo             Where to return the signal number.
  */
-int kSubmitSubProcGetResult(intptr_t pvUser, int *prcExit, int *piSigNo)
+int kSubmitSubProcGetResult(intptr_t pvUser, int fBlock, int *prcExit, int *piSigNo)
 {
     PWORKERINSTANCE pWorker = (PWORKERINSTANCE)pvUser;
@@ -1210,5 +1211,5 @@
      */
     DWORD cbRead = 0;
-    if (GetOverlappedResult(pWorker->hPipe, &pWorker->OverlappedRead, &cbRead, TRUE))
+    if (GetOverlappedResult(pWorker->hPipe, &pWorker->OverlappedRead, &cbRead, fBlock ? TRUE : FALSE))
     {
         pWorker->cbResultRead += cbRead;
@@ -1228,4 +1229,6 @@
     {
         DWORD dwErr = GetLastError();
+        if (dwErr == ERROR_IO_INCOMPLETE && !fBlock)
+            return -1;
         kSubmitWinReadFailed(pCtx, pWorker, dwErr, "kSubmitSubProcGetResult/result");
     }
Index: /trunk/src/kmk/w32/winchildren.c
===================================================================
--- /trunk/src/kmk/w32/winchildren.c	(revision 3223)
+++ /trunk/src/kmk/w32/winchildren.c	(revision 3224)
@@ -2334,7 +2334,7 @@
         assert(pChild->u.Submit.pStdErr);
         pChild->u.Submit.pStdOut->fHaveWrittenOut = FALSE;
-        ahHandles[cHandles++] = pChild->u.Submit.pStdOut->hPipeMine;
+        ahHandles[cHandles++] = pChild->u.Submit.pStdOut->hEvent;
         pChild->u.Submit.pStdErr->fHaveWrittenOut = FALSE;
-        ahHandles[cHandles++] = pChild->u.Submit.pStdErr->hPipeMine;
+        ahHandles[cHandles++] = pChild->u.Submit.pStdErr->hEvent;
     }
 
@@ -2347,5 +2347,5 @@
         int   iSignal   = -1;
         DWORD dwStatus;
-        if (cHandles == 0)
+        if (cHandles == 1)
             dwStatus = WaitForSingleObject(ahHandles[0], INFINITE);
         else
@@ -2358,5 +2358,5 @@
                 mkWinChildcareWorkerCatchOutput(pChild, pChild->u.Submit.pStdErr, FALSE /*fDraining*/);
         }
-        if (kSubmitSubProcGetResult((intptr_t)pvSubmitWorker, &iExitCode, &iSignal) == 0)
+        if (kSubmitSubProcGetResult((intptr_t)pvSubmitWorker, dwStatus == WAIT_OBJECT_0 /*fBlock*/, &iExitCode, &iSignal) == 0)
         {
             if (pChild->u.Submit.pStdOut)
