diff --git a/programs/wineconsole/winecon_private.h b/programs/wineconsole/winecon_private.h index 2178dd00052..5608f99ef68 100644 --- a/programs/wineconsole/winecon_private.h +++ b/programs/wineconsole/winecon_private.h @@ -59,6 +59,7 @@ struct inner_data { HANDLE hConIn; /* console input handle */ HANDLE hConOut; /* screen buffer handle: has to be changed when active sb changes */ HANDLE hSynchro; /* waitable handle signalled by server when something in server has been modified */ + HANDLE hProcess; /* handle to the child process or NULL */ HWND hWnd; /* handle of 'user' window or NULL for 'curses' */ INT nCmdShow; /* argument of WinMain */ BOOL in_set_config; /* to handle re-entrant calls to WINECON_SetConfig */ diff --git a/programs/wineconsole/wineconsole.c b/programs/wineconsole/wineconsole.c index b8b517a4f07..e1ee55b8476 100644 --- a/programs/wineconsole/wineconsole.c +++ b/programs/wineconsole/wineconsole.c @@ -541,6 +541,7 @@ static void WINECON_Delete(struct inner_data* data) if (data->hConIn) CloseHandle(data->hConIn); if (data->hConOut) CloseHandle(data->hConOut); if (data->hSynchro) CloseHandle(data->hSynchro); + if (data->hProcess) CloseHandle(data->hProcess); HeapFree(GetProcessHeap(), 0, data->curcfg.registry); HeapFree(GetProcessHeap(), 0, data->cells); HeapFree(GetProcessHeap(), 0, data); @@ -749,7 +750,7 @@ static int WINECON_Spawn(struct inner_data* data, LPWSTR cmdLine) done = CreateProcessW(NULL, cmdLine, NULL, NULL, TRUE, 0L, NULL, NULL, &startup, &info); if (done) { - CloseHandle(info.hProcess); + data->hProcess = info.hProcess; CloseHandle(info.hThread); } @@ -892,8 +893,18 @@ int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, INT nCmdSh if (!ret) { - WINE_TRACE("calling MainLoop.\n"); - ret = data->fnMainLoop(data); + DWORD exitcode; + + WINE_TRACE("calling MainLoop.\n"); + ret = data->fnMainLoop(data); + + if (!ret && data->hProcess && + WaitForSingleObject(data->hProcess, INFINITE) == WAIT_OBJECT_0 && + GetExitCodeProcess(data->hProcess, &exitcode)) + { + WINE_TRACE("forwarding exitcode %u from child process\n", exitcode); + ret = exitcode; + } } WINECON_Delete(data);