diff --git a/reactos/dll/win32/crtdll/dllmain.c b/reactos/dll/win32/crtdll/dllmain.c index f5023e66bea..41e481da858 100644 --- a/reactos/dll/win32/crtdll/dllmain.c +++ b/reactos/dll/win32/crtdll/dllmain.c @@ -161,6 +161,7 @@ DllMain(PVOID hinstDll, ULONG dwReason, PVOID reserved) /* 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(); diff --git a/reactos/dll/win32/msvcrt/dllmain.c b/reactos/dll/win32/msvcrt/dllmain.c index 8b277d109cc..d48d0d31e49 100644 --- a/reactos/dll/win32/msvcrt/dllmain.c +++ b/reactos/dll/win32/msvcrt/dllmain.c @@ -98,6 +98,7 @@ DllMain(PVOID hinstDll, ULONG dwReason, PVOID reserved) /* 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(); diff --git a/reactos/dll/win32/msvcrt20/msvcrt20.c b/reactos/dll/win32/msvcrt20/msvcrt20.c index 1390cab5f3b..0bda9aa8172 100644 --- a/reactos/dll/win32/msvcrt20/msvcrt20.c +++ b/reactos/dll/win32/msvcrt20/msvcrt20.c @@ -117,6 +117,7 @@ DllMain(PVOID hinstDll, ULONG dwReason, PVOID reserved) /* 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(); diff --git a/reactos/dll/win32/msvcrt40/msvcrt40.c b/reactos/dll/win32/msvcrt40/msvcrt40.c index 76cfffd5eec..1509cf3cd4a 100644 --- a/reactos/dll/win32/msvcrt40/msvcrt40.c +++ b/reactos/dll/win32/msvcrt40/msvcrt40.c @@ -113,6 +113,7 @@ DllMain(PVOID hinstDll, ULONG dwReason, PVOID reserved) /* 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(); diff --git a/reactos/sdk/lib/crt/include/internal/popen.h b/reactos/sdk/lib/crt/include/internal/popen.h new file mode 100644 index 00000000000..f91f4e26be8 --- /dev/null +++ b/reactos/sdk/lib/crt/include/internal/popen.h @@ -0,0 +1,15 @@ +#ifndef __CRT_INTERNAL_POPEN_H +#define __CRT_INTERNAL_POPEN_H + +#ifndef _CRT_PRECOMP_H +#error DO NOT INCLUDE THIS HEADER DIRECTLY +#endif + +struct popen_handle { + FILE *f; + HANDLE proc; +}; +extern struct popen_handle *popen_handles; +extern DWORD popen_handles_size; + +#endif diff --git a/reactos/sdk/lib/crt/include/internal/wine/msvcrt.h b/reactos/sdk/lib/crt/include/internal/wine/msvcrt.h index 319075a597f..5dc3a37395d 100644 --- a/reactos/sdk/lib/crt/include/internal/wine/msvcrt.h +++ b/reactos/sdk/lib/crt/include/internal/wine/msvcrt.h @@ -95,6 +95,7 @@ extern void msvcrt_init_args(void); 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**); diff --git a/reactos/sdk/lib/crt/precomp.h b/reactos/sdk/lib/crt/precomp.h index 95e29d647c1..10f6edffdb8 100644 --- a/reactos/sdk/lib/crt/precomp.h +++ b/reactos/sdk/lib/crt/precomp.h @@ -73,6 +73,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(msvcrt); #include #include #include +#include #include #include #include diff --git a/reactos/sdk/lib/crt/stdio/popen.c b/reactos/sdk/lib/crt/stdio/popen.c index b9f45b05aa5..56fb18af320 100644 --- a/reactos/sdk/lib/crt/stdio/popen.c +++ b/reactos/sdk/lib/crt/stdio/popen.c @@ -1,11 +1,12 @@ /* -* COPYRIGHT: See COPYING in the top level directory -* PROJECT: ReactOS C runtime library -* FILE: lib/sdk/crt/stdio/popen.c -* PURPOSE: Pipe Functions -* PROGRAMERS: Eric Kohl - Hartmut Birr -*/ + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS C runtime library + * FILE: lib/sdk/crt/stdio/popen.c + * PURPOSE: Pipe Functions + * PROGRAMMERS: Eric Kohl + * Hartmut Birr + * Also adapted from Wine team code by Andreas Maier. + */ #include #include @@ -22,11 +23,13 @@ int msvcrt_alloc_fd(HANDLE hand, int flag); //FIXME: Remove 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 +40,14 @@ FILE *_tpopen (const _TCHAR *cm, const _TCHAR *md) /* program name, pipe mode */ _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 +85,7 @@ FILE *_tpopen (const _TCHAR *cm, const _TCHAR *md) /* program name, pipe mode */ return NULL; } + memset(&ProcessInformation, 0, sizeof(ProcessInformation)); memset(&StartupInfo, 0, sizeof(STARTUPINFO)); StartupInfo.cb = sizeof(STARTUPINFO); @@ -117,20 +123,47 @@ FILE *_tpopen (const _TCHAR *cm, const _TCHAR *md) /* program name, pipe mode */ } CloseHandle(ProcessInformation.hThread); - CloseHandle(ProcessInformation.hProcess); + + _mlock(_POPEN_LOCK); + for(i=0; if = ret; + container->proc = ProcessInformation.hProcess; + _munlock(_POPEN_LOCK); + + return ret; + +error: + if (ProcessInformation.hProcess != 0) + CloseHandle(ProcessInformation.hProcess); + return NULL; } #ifndef _UNICODE