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