Index: dll/win32/crtdll/dllmain.c
===================================================================
--- dll/win32/crtdll/dllmain.c	(Revision 75349)
+++ dll/win32/crtdll/dllmain.c	(Arbeitskopie)
@@ -161,6 +161,7 @@
         /* Deinit of the WINE code */
         msvcrt_free_io();
         if (reserved) break;
+        msvcrt_free_popen_data();
         msvcrt_free_mt_locks();
         //msvcrt_free_console();
         //msvcrt_free_args();
Index: dll/win32/msvcrt/dllmain.c
===================================================================
--- dll/win32/msvcrt/dllmain.c	(Revision 75349)
+++ dll/win32/msvcrt/dllmain.c	(Arbeitskopie)
@@ -98,6 +98,7 @@
         /* Deinit of the WINE code */
         msvcrt_free_io();
         if (reserved) break;
+        msvcrt_free_popen_data();
         msvcrt_free_mt_locks();
         //msvcrt_free_console();
         //msvcrt_free_args();
Index: dll/win32/msvcrt20/msvcrt20.c
===================================================================
--- dll/win32/msvcrt20/msvcrt20.c	(Revision 75349)
+++ dll/win32/msvcrt20/msvcrt20.c	(Arbeitskopie)
@@ -117,6 +117,7 @@
         /* Deinit of the WINE code */
         msvcrt_free_io();
         if (reserved) break;
+        msvcrt_free_popen_data();
         msvcrt_free_mt_locks();
         //msvcrt_free_console();
         //msvcrt_free_args();
Index: dll/win32/msvcrt40/msvcrt40.c
===================================================================
--- dll/win32/msvcrt40/msvcrt40.c	(Revision 75349)
+++ dll/win32/msvcrt40/msvcrt40.c	(Arbeitskopie)
@@ -113,6 +113,7 @@
         /* Deinit of the WINE code */
         msvcrt_free_io();
         if (reserved) break;
+        msvcrt_free_popen_data();
         msvcrt_free_mt_locks();
         //msvcrt_free_console();
         //msvcrt_free_args();
Index: sdk/lib/crt/include/internal/popen.h
===================================================================
--- sdk/lib/crt/include/internal/popen.h	(nicht existent)
+++ sdk/lib/crt/include/internal/popen.h	(Arbeitskopie)
@@ -0,0 +1,7 @@
+
+struct popen_handle {
+    FILE *f;
+    HANDLE proc;
+};
+extern struct popen_handle *popen_handles;
+extern DWORD popen_handles_size;
Index: sdk/lib/crt/include/internal/wine/msvcrt.h
===================================================================
--- sdk/lib/crt/include/internal/wine/msvcrt.h	(Revision 75349)
+++ sdk/lib/crt/include/internal/wine/msvcrt.h	(Arbeitskopie)
@@ -95,6 +95,7 @@
 extern void msvcrt_free_args(void);
 extern void msvcrt_init_signals(void);
 extern void msvcrt_free_signals(void);
+extern void msvcrt_free_popen_data(void);
 
 extern unsigned create_io_inherit_block(WORD*, BYTE**);
 
Index: sdk/lib/crt/precomp.h
===================================================================
--- sdk/lib/crt/precomp.h	(Revision 75349)
+++ sdk/lib/crt/precomp.h	(Arbeitskopie)
@@ -73,6 +73,7 @@
 #include <internal/mbstring.h>
 #include <internal/misc.h>
 #include <internal/mtdll.h>
+#include <internal/popen.h>
 #include <internal/rterror.h>
 #include <internal/safecrt.h>
 #include <internal/time.h>
Index: sdk/lib/crt/stdio/popen.c
===================================================================
--- sdk/lib/crt/stdio/popen.c	(Revision 75349)
+++ sdk/lib/crt/stdio/popen.c	(Arbeitskopie)
@@ -22,11 +22,13 @@
 unsigned split_oflags(unsigned oflags); //FIXME: Remove
 
 #ifndef _UNICODE
-static struct popen_handle {
-    FILE *f;
-    HANDLE proc;
-} *popen_handles;
-static DWORD popen_handles_size;
+struct popen_handle *popen_handles = NULL;
+DWORD popen_handles_size = 0;
+
+void msvcrt_free_popen_data(void)
+{
+    free(popen_handles);
+}
 #endif
 
 /*
@@ -37,12 +39,14 @@
     _TCHAR *szCmdLine=NULL;
     _TCHAR *szComSpec=NULL;
     _TCHAR *s;
-    FILE *pf;
+    FILE *ret;
     HANDLE hReadPipe, hWritePipe;
     BOOL result;
     STARTUPINFO StartupInfo;
     PROCESS_INFORMATION ProcessInformation;
     SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE};
+    struct popen_handle *container;
+    DWORD i;
 
     TRACE(MK_STR(_tpopen)"('%"sT"', '%"sT"')\n", cm, md);
 
@@ -80,6 +84,7 @@
         return NULL;
     }
 
+    memset(&ProcessInformation, 0, sizeof(ProcessInformation));
     memset(&StartupInfo, 0, sizeof(STARTUPINFO));
     StartupInfo.cb = sizeof(STARTUPINFO);
 
@@ -117,20 +122,47 @@
     }
 
     CloseHandle(ProcessInformation.hThread);
-    CloseHandle(ProcessInformation.hProcess);
 
+    _mlock(_POPEN_LOCK);
+    for(i=0; i<popen_handles_size; i++)
+    {
+        if (!popen_handles[i].f)
+        break;
+    }
+    if (i==popen_handles_size)
+    {
+        i = (popen_handles_size ? popen_handles_size*2 : 8);
+        container = realloc(popen_handles, i*sizeof(*container));
+        if (!container) goto error;
+        popen_handles = container;
+        container = popen_handles+popen_handles_size;
+        memset(container, 0, (i-popen_handles_size)*sizeof(*container));
+        popen_handles_size = i;
+    }
+    else container = popen_handles+i;
+
     if ( *md == 'r' )
     {
-        pf = _tfdopen(msvcrt_alloc_fd(hReadPipe,  split_oflags(_fmode)) , _T("r"));
+        ret = _tfdopen(msvcrt_alloc_fd(hReadPipe,  split_oflags(_fmode)) , _T("r"));
         CloseHandle(hWritePipe);
     }
     else
     {
-        pf = _tfdopen( msvcrt_alloc_fd(hWritePipe, split_oflags(_fmode)) , _T("w"));
+        ret = _tfdopen( msvcrt_alloc_fd(hWritePipe, split_oflags(_fmode)) , _T("w"));
         CloseHandle(hReadPipe);
     }
 
-    return( pf );
+    container->f = ret;
+    container->proc = ProcessInformation.hProcess;
+    _munlock(_POPEN_LOCK);
+
+
+    return ret;
+
+error:
+    if (ProcessInformation.hProcess != 0)
+        CloseHandle(ProcessInformation.hProcess);
+    return NULL;
 }
 
 #ifndef _UNICODE
