Subject: Eliminate a lot of dead code (for Windows 95/98/ME only). Eliminate all usage of TclWinSetInterfaces(), which does exactly the same as TclpSetInterfaces(), but keep exported symbol and stub entry.

From: "jan.nijtmans" <[email-masked]>
Date: Wed, 19 Jun 2013 12:53:53 +0000

---
 win/tclWin32Dll.c |  28 +---
 win/tclWinFCmd.c  |  43 -----
 win/tclWinFile.c  | 464 ++++++++++++++++++------------------------------------
 win/tclWinInit.c  |   9 +-
 win/tclWinPipe.c  |  13 +-
 5 files changed, 164 insertions(+), 393 deletions(-)

diff --git a/win/tclWin32Dll.c b/win/tclWin32Dll.c
index 019d76f..0d3b683 100644
--- a/win/tclWin32Dll.c
+++ b/win/tclWin32Dll.c
@@ -281,16 +281,9 @@ TclWinNoBackslash(
 /*
  *---------------------------------------------------------------------------
  *
- * TclWinSetInterfaces --
+ * TclpSetInterfaces --
  *
- *	A helper proc that allows the test library to change the tclWinProcs
- *	structure to dispatch to either the wide-character or multi-byte
- *	versions of the operating system calls, depending on whether Unicode
- *	is the system encoding.
- *
- *	As well as this, we can also try to load in some additional procs
- *	which may/may not be present depending on the current Windows version
- *	(e.g. Win95 will not have the procs below).
+ *	A helper proc that initializes winTCharEncoding.
  *
  * Results:
  *	None.
@@ -302,15 +295,10 @@ TclWinNoBackslash(
  */
 
 void
-TclWinSetInterfaces(
-    int wide)			/* Non-zero to use wide interfaces, 0
-				 * otherwise. */
+TclpSetInterfaces(void)
 {
-	TclWinResetInterfaces();
-
-    if (wide) {
-	winTCharEncoding = Tcl_GetEncoding(NULL, "unicode");
-    }
+    TclWinResetInterfaces();
+    winTCharEncoding = Tcl_GetEncoding(NULL, "unicode");
 }
 
 /*
@@ -318,9 +306,7 @@ TclWinSetInterfaces(
  *
  * TclWinEncodingsCleanup --
  *
- *	Called during finalization to free up any encodings we use. The
- *	tclWinProcs-> look up table is still ok to use after this call,
- *	provided no encoding conversion is required.
+ *	Called during finalization to free up any encodings we use.
  *
  *	We also clean up any memory allocated in our mount point map which is
  *	used to follow certain kinds of symlinks. That code should never be
@@ -363,8 +349,6 @@ TclWinEncodingsCleanup(void)
  * TclWinResetInterfaces --
  *
  *	Called during finalization to reset us to a safe state for reuse.
- *	After this call, it is best not to use the tclWinProcs-> look up table
- *	since it is likely to be different to what is expected.
  *
  * Results:
  *	None.
diff --git a/win/tclWinFCmd.c b/win/tclWinFCmd.c
index ac88861..0476915 100644
--- a/win/tclWinFCmd.c
+++ b/win/tclWinFCmd.c
@@ -1105,49 +1105,6 @@ DoRemoveJustDirectory(
 		SetFileAttributes(nativePath,
 			attr | FILE_ATTRIBUTE_READONLY);
 	    }
-
-	    /*
-	     * Windows 95 reports removing a non-empty directory as
-	     * EACCES, not EEXIST. If the directory is not empty, change errno
-	     * so caller knows what's going on.
-	     */
-
-	    if (TclWinGetPlatformId() == VER_PLATFORM_WIN32_WINDOWS) {
-		const char *path, *find;
-		HANDLE handle;
-		WIN32_FIND_DATAA data;
-		Tcl_DString buffer;
-		int len;
-
-		path = (const char *) nativePath;
-
-		Tcl_DStringInit(&buffer);
-		len = strlen(path);
-		find = Tcl_DStringAppend(&buffer, path, len);
-		if ((len > 0) && (find[len - 1] != '\\')) {
-		    TclDStringAppendLiteral(&buffer, "\\");
-		}
-		find = TclDStringAppendLiteral(&buffer, "*.*");
-		handle = FindFirstFileA(find, &data);
-		if (handle != INVALID_HANDLE_VALUE) {
-		    while (1) {
-			if ((strcmp(data.cFileName, ".") != 0)
-				&& (strcmp(data.cFileName, "..") != 0)) {
-			    /*
-			     * Found something in this directory.
-			     */
-
-			    Tcl_SetErrno(EEXIST);
-			    break;
-			}
-			if (FindNextFileA(handle, &data) == FALSE) {
-			    break;
-			}
-		    }
-		    FindClose(handle);
-		}
-		Tcl_DStringFree(&buffer);
-	    }
 	}
     }
 
diff --git a/win/tclWinFile.c b/win/tclWinFile.c
index 1d9f93a..f69ad23 100644
--- a/win/tclWinFile.c
+++ b/win/tclWinFile.c
@@ -2415,373 +2415,213 @@ TclpObjNormalizePath(
     Tcl_DStringInit(&dsNorm);
     path = Tcl_GetString(pathPtr);
 
-    if (TclWinGetPlatformId() == VER_PLATFORM_WIN32_WINDOWS) {
-	/*
-	 * We're on Win95, 98 or ME. There are two assumptions in this block
-	 * of code. First that the native (NULL) encoding is basically ascii,
-	 * and second that symbolic links are not possible. Both of these
-	 * assumptions appear to be true of these operating systems.
-	 *
-	 * FIXME: This code branch may be derelict as those are not supported
-	 * platforms any more.
-	 */
-
-	currentPathEndPosition = path + nextCheckpoint;
-	if (*currentPathEndPosition == '/') {
-	    currentPathEndPosition++;
-	}
-
-	while (1) {
-	    char cur = *currentPathEndPosition;
+    currentPathEndPosition = path + nextCheckpoint;
+    if (*currentPathEndPosition == '/') {
+	currentPathEndPosition++;
+    }
+    while (1) {
+	char cur = *currentPathEndPosition;
 
-	    if ((cur=='/' || cur==0) && (path != currentPathEndPosition)) {
-		/*
-		 * Reached directory separator, or end of string.
-		 */
+	if ((cur=='/' || cur==0) && (path != currentPathEndPosition)) {
+	    /*
+	     * Reached directory separator, or end of string.
+	     */
 
-		const char *nativePath = Tcl_UtfToExternalDString(NULL, path,
-			currentPathEndPosition - path, &ds);
+	    WIN32_FILE_ATTRIBUTE_DATA data;
+	    const TCHAR *nativePath = Tcl_WinUtfToTChar(path,
+		    currentPathEndPosition - path, &ds);
 
+	    if (GetFileAttributesEx(nativePath,
+		    GetFileExInfoStandard, &data) != TRUE) {
 		/*
-		 * Now we convert the tail of the current path to its 'long
-		 * form', and append it to 'dsNorm' which holds the current
-		 * normalized path, if the file exists.
+		 * File doesn't exist.
 		 */
 
 		if (isDrive) {
-		    if (GetFileAttributesA(nativePath)
-			    == INVALID_FILE_ATTRIBUTES) {
-			/*
-			 * File doesn't exist.
-			 */
-
-			if (isDrive) {
-			    int len = WinIsReserved(path);
-
-			    if (len > 0) {
-				/*
-				 * Actually it does exist - COM1, etc.
-				 */
-
-				int i;
-
-				for (i=0 ; i<len ; i++) {
-				    if (nativePath[i] >= 'a') {
-					((char *) nativePath)[i] -= ('a'-'A');
-				    }
-				}
-				Tcl_DStringAppend(&dsNorm, nativePath, len);
-				lastValidPathEnd = currentPathEndPosition;
-			    } else if (nextCheckpoint == 0) {
-				/* Path starts with a drive designation
-				 * that's not actually on the system.
-				 * We still must normalize up past the
-				 * first separator.  [Bug 3603434] */
-				currentPathEndPosition++;
-			    }
-			}
-			Tcl_DStringFree(&ds);
-			break;
-		    }
-		    if (nativePath[0] >= 'a') {
-			((char *) nativePath)[0] -= ('a' - 'A');
-		    }
-		    Tcl_DStringAppend(&dsNorm, nativePath,
-			    Tcl_DStringLength(&ds));
-		} else {
-		    char *checkDots = NULL;
-
-		    if (lastValidPathEnd[1] == '.') {
-			checkDots = lastValidPathEnd + 1;
-			while (checkDots < currentPathEndPosition) {
-			    if (*checkDots != '.') {
-				checkDots = NULL;
-				break;
-			    }
-			    checkDots++;
-			}
-		    }
-		    if (checkDots != NULL) {
-			int dotLen = currentPathEndPosition-lastValidPathEnd;
+		    int len = WinIsReserved(path);
 
+		    if (len > 0) {
 			/*
-			 * Path is just dots. We shouldn't really ever see a
-			 * path like that. However, to be nice we at least
-			 * don't mangle the path - we just add the dots as a
-			 * path segment and continue
+			 * Actually it does exist - COM1, etc.
 			 */
 
-			Tcl_DStringAppend(&dsNorm, (const char *)
-				(nativePath + Tcl_DStringLength(&ds)-dotLen),
-				dotLen);
-		    } else {
-			/*
-			 * Normal path.
-			 */
+			int i;
 
-			WIN32_FIND_DATAA fData;
-			HANDLE handle;
+			for (i=0 ; i<len ; i++) {
+			    WCHAR wc = ((WCHAR *) nativePath)[i];
 
-			handle = FindFirstFileA(nativePath, &fData);
-			if (handle == INVALID_HANDLE_VALUE) {
-			    if (GetFileAttributesA(nativePath)
-				    == INVALID_FILE_ATTRIBUTES) {
-				/*
-				 * File doesn't exist.
-				 */
-
-				Tcl_DStringFree(&ds);
-				break;
+			    if (wc >= L'a') {
+				wc -= (L'a' - L'A');
+				((WCHAR *) nativePath)[i] = wc;
 			    }
-
-			    /*
-			     * This is usually the '/' in 'c:/' at end of
-			     * string.
-			     */
-
-			    TclDStringAppendLiteral(&dsNorm, "/");
-			} else {
-			    char *nativeName;
-
-			    if (fData.cFileName[0] != '\0') {
-				nativeName = fData.cFileName;
-			    } else {
-				nativeName = fData.cAlternateFileName;
-			    }
-			    FindClose(handle);
-			    TclDStringAppendLiteral(&dsNorm, "/");
-			    Tcl_DStringAppend(&dsNorm, nativeName, -1);
 			}
+			Tcl_DStringAppend(&dsNorm,
+				(const char *)nativePath,
+				(int)(sizeof(WCHAR) * len));
+			lastValidPathEnd = currentPathEndPosition;
+		    } else if (nextCheckpoint == 0) {
+			/* Path starts with a drive designation
+			 * that's not actually on the system.
+			 * We still must normalize up past the
+			 * first separator.  [Bug 3603434] */
+			currentPathEndPosition++;
 		    }
 		}
 		Tcl_DStringFree(&ds);
-		lastValidPathEnd = currentPathEndPosition;
-		if (cur == 0) {
-		    break;
-		}
-
-		/*
-		 * If we get here, we've got past one directory delimiter, so
-		 * we know it is no longer a drive.
-		 */
-
-		isDrive = 0;
+		break;
 	    }
-	    currentPathEndPosition++;
-	}
-    } else {
-	/*
-	 * We're on WinNT (or 2000 or XP; something with an NT core).
-	 */
 
-	currentPathEndPosition = path + nextCheckpoint;
-	if (*currentPathEndPosition == '/') {
-	    currentPathEndPosition++;
-	}
-	while (1) {
-	    char cur = *currentPathEndPosition;
+	    /*
+	     * File 'nativePath' does exist if we get here. We now want to
+	     * check if it is a symlink and otherwise continue with the
+	     * rest of the path.
+	     */
 
-	    if ((cur=='/' || cur==0) && (path != currentPathEndPosition)) {
-		/*
-		 * Reached directory separator, or end of string.
-		 */
+	    /*
+	     * Check for symlinks, except at last component of path (we
+	     * don't follow final symlinks). Also a drive (C:/) for
+	     * example, may sometimes have the reparse flag set for some
+	     * reason I don't understand. We therefore don't perform this
+	     * check for drives.
+	     */
 
-		WIN32_FILE_ATTRIBUTE_DATA data;
-		const TCHAR *nativePath = Tcl_WinUtfToTChar(path,
-			currentPathEndPosition - path, &ds);
+	    if (cur != 0 && !isDrive &&
+		    data.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT){
+		Tcl_Obj *to = WinReadLinkDirectory(nativePath);
 
-		if (GetFileAttributesEx(nativePath,
-			GetFileExInfoStandard, &data) != TRUE) {
+		if (to != NULL) {
 		    /*
-		     * File doesn't exist.
+		     * Read the reparse point ok. Now, reparse points need
+		     * not be normalized, otherwise we could use:
+		     *
+		     * Tcl_GetStringFromObj(to, &pathLen);
+		     * nextCheckpoint = pathLen;
+		     *
+		     * So, instead we have to start from the beginning.
 		     */
 
-		    if (isDrive) {
-			int len = WinIsReserved(path);
-
-			if (len > 0) {
-			    /*
-			     * Actually it does exist - COM1, etc.
-			     */
-
-			    int i;
+		    nextCheckpoint = 0;
+		    Tcl_AppendToObj(to, currentPathEndPosition, -1);
 
-			    for (i=0 ; i<len ; i++) {
-				WCHAR wc = ((WCHAR *) nativePath)[i];
+		    /*
+		     * Convert link to forward slashes.
+		     */
 
-				if (wc >= L'a') {
-				    wc -= (L'a' - L'A');
-				    ((WCHAR *) nativePath)[i] = wc;
-				}
-			    }
-			    Tcl_DStringAppend(&dsNorm,
-				    (const char *)nativePath,
-				    (int)(sizeof(WCHAR) * len));
-			    lastValidPathEnd = currentPathEndPosition;
-			} else if (nextCheckpoint == 0) {
-			    /* Path starts with a drive designation
-			     * that's not actually on the system.
-			     * We still must normalize up past the
-			     * first separator.  [Bug 3603434] */
-			    currentPathEndPosition++;
+		    for (path = Tcl_GetString(to); *path != 0; path++) {
+			if (*path == '\\') {
+			    *path = '/';
 			}
 		    }
-		    Tcl_DStringFree(&ds);
-		    break;
-		}
-
-		/*
-		 * File 'nativePath' does exist if we get here. We now want to
-		 * check if it is a symlink and otherwise continue with the
-		 * rest of the path.
-		 */
-
-		/*
-		 * Check for symlinks, except at last component of path (we
-		 * don't follow final symlinks). Also a drive (C:/) for
-		 * example, may sometimes have the reparse flag set for some
-		 * reason I don't understand. We therefore don't perform this
-		 * check for drives.
-		 */
+		    path = Tcl_GetString(to);
+		    currentPathEndPosition = path + nextCheckpoint;
+		    if (temp != NULL) {
+			Tcl_DecrRefCount(temp);
+		    }
+		    temp = to;
 
-		if (cur != 0 && !isDrive &&
-			data.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT){
-		    Tcl_Obj *to = WinReadLinkDirectory(nativePath);
+		    /*
+		     * Reset variables so we can restart normalization.
+		     */
 
-		    if (to != NULL) {
-			/*
-			 * Read the reparse point ok. Now, reparse points need
-			 * not be normalized, otherwise we could use:
-			 *
-			 * Tcl_GetStringFromObj(to, &pathLen);
-			 * nextCheckpoint = pathLen;
-			 *
-			 * So, instead we have to start from the beginning.
-			 */
+		    isDrive = 1;
+		    Tcl_DStringFree(&dsNorm);
+		    Tcl_DStringFree(&ds);
+		    continue;
+		}
+	    }
 
-			nextCheckpoint = 0;
-			Tcl_AppendToObj(to, currentPathEndPosition, -1);
+#ifndef TclNORM_LONG_PATH
+	    /*
+	     * Now we convert the tail of the current path to its 'long
+	     * form', and append it to 'dsNorm' which holds the current
+	     * normalized path
+	     */
 
-			/*
-			 * Convert link to forward slashes.
-			 */
+	    if (isDrive) {
+		WCHAR drive = ((WCHAR *) nativePath)[0];
 
-			for (path = Tcl_GetString(to); *path != 0; path++) {
-			    if (*path == '\\') {
-				*path = '/';
-			    }
-			}
-			path = Tcl_GetString(to);
-			currentPathEndPosition = path + nextCheckpoint;
-			if (temp != NULL) {
-			    Tcl_DecrRefCount(temp);
+		if (drive >= L'a') {
+		    drive -= (L'a' - L'A');
+		    ((WCHAR *) nativePath)[0] = drive;
+		}
+		Tcl_DStringAppend(&dsNorm, (const char *)nativePath,
+			Tcl_DStringLength(&ds));
+	    } else {
+		char *checkDots = NULL;
+
+		if (lastValidPathEnd[1] == '.') {
+		    checkDots = lastValidPathEnd + 1;
+		    while (checkDots < currentPathEndPosition) {
+			if (*checkDots != '.') {
+			    checkDots = NULL;
+			    break;
 			}
-			temp = to;
-
-			/*
-			 * Reset variables so we can restart normalization.
-			 */
-
-			isDrive = 1;
-			Tcl_DStringFree(&dsNorm);
-			Tcl_DStringFree(&ds);
-			continue;
+			checkDots++;
 		    }
 		}
+		if (checkDots != NULL) {
+		    int dotLen = currentPathEndPosition-lastValidPathEnd;
 
-#ifndef TclNORM_LONG_PATH
-		/*
-		 * Now we convert the tail of the current path to its 'long
-		 * form', and append it to 'dsNorm' which holds the current
-		 * normalized path
-		 */
-
-		if (isDrive) {
-		    WCHAR drive = ((WCHAR *) nativePath)[0];
+		    /*
+		     * Path is just dots. We shouldn't really ever see a
+		     * path like that. However, to be nice we at least
+		     * don't mangle the path - we just add the dots as a
+		     * path segment and continue.
+		     */
 
-		    if (drive >= L'a') {
-			drive -= (L'a' - L'A');
-			((WCHAR *) nativePath)[0] = drive;
-		    }
-		    Tcl_DStringAppend(&dsNorm, (const char *)nativePath,
-			    Tcl_DStringLength(&ds));
+		    Tcl_DStringAppend(&dsNorm, ((const char *)nativePath)
+			    + Tcl_DStringLength(&ds)
+			    - (dotLen * sizeof(TCHAR)),
+			    (int)(dotLen * sizeof(TCHAR)));
 		} else {
-		    char *checkDots = NULL;
-
-		    if (lastValidPathEnd[1] == '.') {
-			checkDots = lastValidPathEnd + 1;
-			while (checkDots < currentPathEndPosition) {
-			    if (*checkDots != '.') {
-				checkDots = NULL;
-				break;
-			    }
-			    checkDots++;
-			}
-		    }
-		    if (checkDots != NULL) {
-			int dotLen = currentPathEndPosition-lastValidPathEnd;
+		    /*
+		     * Normal path.
+		     */
 
-			/*
-			 * Path is just dots. We shouldn't really ever see a
-			 * path like that. However, to be nice we at least
-			 * don't mangle the path - we just add the dots as a
-			 * path segment and continue.
-			 */
+		    WIN32_FIND_DATAW fData;
+		    HANDLE handle;
 
-			Tcl_DStringAppend(&dsNorm, ((const char *)nativePath)
-				+ Tcl_DStringLength(&ds)
-				- (dotLen * sizeof(TCHAR)),
-				(int)(dotLen * sizeof(TCHAR)));
-		    } else {
+		    handle = FindFirstFileW((WCHAR *) nativePath, &fData);
+		    if (handle == INVALID_HANDLE_VALUE) {
 			/*
-			 * Normal path.
+			 * This is usually the '/' in 'c:/' at end of
+			 * string.
 			 */
 
-			WIN32_FIND_DATAW fData;
-			HANDLE handle;
-
-			handle = FindFirstFileW((WCHAR *) nativePath, &fData);
-			if (handle == INVALID_HANDLE_VALUE) {
-			    /*
-			     * This is usually the '/' in 'c:/' at end of
-			     * string.
-			     */
+			Tcl_DStringAppend(&dsNorm, (const char *) L"/",
+				sizeof(WCHAR));
+		    } else {
+			WCHAR *nativeName;
 
-			    Tcl_DStringAppend(&dsNorm, (const char *) L"/",
-				    sizeof(WCHAR));
+			if (fData.cFileName[0] != '\0') {
+			    nativeName = fData.cFileName;
 			} else {
-			    WCHAR *nativeName;
-
-			    if (fData.cFileName[0] != '\0') {
-				nativeName = fData.cFileName;
-			    } else {
-				nativeName = fData.cAlternateFileName;
-			    }
-			    FindClose(handle);
-			    Tcl_DStringAppend(&dsNorm, (const char *) L"/",
-				    sizeof(WCHAR));
-			    Tcl_DStringAppend(&dsNorm,
-				    (const char *) nativeName,
-				    (int) (wcslen(nativeName)*sizeof(WCHAR)));
+			    nativeName = fData.cAlternateFileName;
 			}
+			FindClose(handle);
+			Tcl_DStringAppend(&dsNorm, (const char *) L"/",
+				sizeof(WCHAR));
+			Tcl_DStringAppend(&dsNorm,
+				(const char *) nativeName,
+				(int) (wcslen(nativeName)*sizeof(WCHAR)));
 		    }
 		}
+	    }
 #endif /* !TclNORM_LONG_PATH */
-		Tcl_DStringFree(&ds);
-		lastValidPathEnd = currentPathEndPosition;
-		if (cur == 0) {
-		    break;
-		}
+	    Tcl_DStringFree(&ds);
+	    lastValidPathEnd = currentPathEndPosition;
+	    if (cur == 0) {
+		break;
+	    }
 
-		/*
-		 * If we get here, we've got past one directory delimiter, so
-		 * we know it is no longer a drive.
-		 */
+	    /*
+	     * If we get here, we've got past one directory delimiter, so
+	     * we know it is no longer a drive.
+	     */
 
-		isDrive = 0;
-	    }
-	    currentPathEndPosition++;
+	    isDrive = 0;
 	}
+	currentPathEndPosition++;
 
 #ifdef TclNORM_LONG_PATH
 	/*
diff --git a/win/tclWinInit.c b/win/tclWinInit.c
index f552e2c..d82944e 100644
--- a/win/tclWinInit.c
+++ b/win/tclWinInit.c
@@ -486,13 +486,10 @@ TclpSetInitialEncodings(void)
     Tcl_DStringFree(&encodingName);
 }
 
-void
-TclpSetInterfaces(void)
+void TclWinSetInterfaces(
+    int dummy)			/* Not used. */
 {
-    int useWide;
-
-    useWide = (TclWinGetPlatformId() != VER_PLATFORM_WIN32_WINDOWS);
-    TclWinSetInterfaces(useWide);
+    TclpSetInterfaces();
 }
 
 const char *
diff --git a/win/tclWinPipe.c b/win/tclWinPipe.c
index d418a3e..13caba9 100644
--- a/win/tclWinPipe.c
+++ b/win/tclWinPipe.c
@@ -1049,15 +1049,8 @@ TclpCreateProcess(
 	 * sink.
 	 */
 
-	if ((TclWinGetPlatformId() == VER_PLATFORM_WIN32_WINDOWS)
-		&& (applType == APPL_DOS)) {
-	    if (CreatePipe(&h, &startInfo.hStdOutput, &secAtts, 0) != FALSE) {
-		CloseHandle(h);
-	    }
-	} else {
-	    startInfo.hStdOutput = CreateFileA("NUL:", GENERIC_WRITE, 0,
-		    &secAtts, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
-	}
+	startInfo.hStdOutput = CreateFile(TEXT("NUL:"), GENERIC_WRITE, 0,
+		&secAtts, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
     } else {
 	DuplicateHandle(hProcess, outputHandle, hProcess,
 		&startInfo.hStdOutput, 0, TRUE, DUPLICATE_SAME_ACCESS);
@@ -1076,7 +1069,7 @@ TclpCreateProcess(
 	 * sink.
 	 */
 
-	startInfo.hStdError = CreateFileA("NUL:", GENERIC_WRITE, 0,
+	startInfo.hStdError = CreateFile(TEXT("NUL:"), GENERIC_WRITE, 0,
 		&secAtts, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
     } else {
 	DuplicateHandle(hProcess, errorHandle, hProcess, &startInfo.hStdError,
-- 
cgit v0.12