Erich E. Hoover : krnl386: Invalid console handles should translate into real handles when creating a new process.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Apr 24 08:48:51 CDT 2015
Module: wine
Branch: master
Commit: bc68b30d208209d749522eaba79b0e124956bdde
URL: http://source.winehq.org/git/wine.git/?a=commit;h=bc68b30d208209d749522eaba79b0e124956bdde
Author: Erich E. Hoover <erich.e.hoover at wine-staging.com>
Date: Sun Mar 15 15:30:51 2015 -0600
krnl386: Invalid console handles should translate into real handles when creating a new process.
---
dlls/krnl386.exe16/file.c | 25 +++++++++++++++----------
1 file changed, 15 insertions(+), 10 deletions(-)
diff --git a/dlls/krnl386.exe16/file.c b/dlls/krnl386.exe16/file.c
index 1584340..6c3cef3 100644
--- a/dlls/krnl386.exe16/file.c
+++ b/dlls/krnl386.exe16/file.c
@@ -53,21 +53,26 @@ static HANDLE dos_handles[DOS_TABLE_SIZE];
*/
static void FILE_InitProcessDosHandles( void )
{
+ HANDLE hStdInput, hStdOutput, hStdError, hNull;
static BOOL init_done /* = FALSE */;
HANDLE cp = GetCurrentProcess();
if (init_done) return;
init_done = TRUE;
- DuplicateHandle(cp, GetStdHandle(STD_INPUT_HANDLE), cp, &dos_handles[0],
- 0, TRUE, DUPLICATE_SAME_ACCESS);
- DuplicateHandle(cp, GetStdHandle(STD_OUTPUT_HANDLE), cp, &dos_handles[1],
- 0, TRUE, DUPLICATE_SAME_ACCESS);
- DuplicateHandle(cp, GetStdHandle(STD_ERROR_HANDLE), cp, &dos_handles[2],
- 0, TRUE, DUPLICATE_SAME_ACCESS);
- DuplicateHandle(cp, GetStdHandle(STD_ERROR_HANDLE), cp, &dos_handles[3],
- 0, TRUE, DUPLICATE_SAME_ACCESS);
- DuplicateHandle(cp, GetStdHandle(STD_ERROR_HANDLE), cp, &dos_handles[4],
- 0, TRUE, DUPLICATE_SAME_ACCESS);
+ hStdInput = GetStdHandle(STD_INPUT_HANDLE);
+ hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
+ hStdError = GetStdHandle(STD_ERROR_HANDLE);
+ hNull = CreateFileA("NUL", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);
+ /* Invalid console handles need to translate to real DOS handles in a new process */
+ if (!hStdInput) hStdInput = hNull;
+ if (!hStdOutput) hStdOutput = hNull;
+ if (!hStdError) hStdError = hNull;
+ DuplicateHandle(cp, hStdInput, cp, &dos_handles[0], 0, TRUE, DUPLICATE_SAME_ACCESS);
+ DuplicateHandle(cp, hStdOutput, cp, &dos_handles[1], 0, TRUE, DUPLICATE_SAME_ACCESS);
+ DuplicateHandle(cp, hStdError, cp, &dos_handles[2], 0, TRUE, DUPLICATE_SAME_ACCESS);
+ DuplicateHandle(cp, hStdError, cp, &dos_handles[3], 0, TRUE, DUPLICATE_SAME_ACCESS);
+ DuplicateHandle(cp, hStdError, cp, &dos_handles[4], 0, TRUE, DUPLICATE_SAME_ACCESS);
+ CloseHandle(hNull);
}
/***********************************************************************
More information about the wine-cvs
mailing list