aboutsummaryrefslogtreecommitdiffstats
path: root/ui/win32/console_win32.c
diff options
context:
space:
mode:
authorGerald Combs <gerald@wireshark.org>2021-07-01 10:06:02 -0700
committerWireshark GitLab Utility <gerald+gitlab-utility@wireshark.org>2021-07-02 08:02:38 +0000
commit0bc39aa2eb4992f66238bc6ee312e82e3a60017e (patch)
tree8c915522789c93cb8b93a2f75cea340cee73d41c /ui/win32/console_win32.c
parentcc2f5825dfb17d4095b2c4b2fdddcd39fe088c4c (diff)
Win32: Compile ui/win32 as C++.
We always build the .c files in ui/win32 with Visual C++, so rename them to .cpp and update CMakeLists.txt to match. Leave the C code mostly intact for now, but this lets us take advantage of C++ features in the future if desired.
Diffstat (limited to 'ui/win32/console_win32.c')
-rw-r--r--ui/win32/console_win32.c295
1 files changed, 0 insertions, 295 deletions
diff --git a/ui/win32/console_win32.c b/ui/win32/console_win32.c
deleted file mode 100644
index 744791fe7d..0000000000
--- a/ui/win32/console_win32.c
+++ /dev/null
@@ -1,295 +0,0 @@
-/* console_win32.c
- * Console support for MSWindows
- *
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
- * Copyright 2002, Jeffrey C. Foster <jfoste@woodward.com>
- *
- * SPDX-License-Identifier: GPL-2.0-or-later
- */
-
-#ifdef _WIN32
-
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <glib.h>
-#include <wsutil/file_util.h>
-
-#include "console_win32.h"
-
-#include <fcntl.h>
-#include <conio.h>
-#include <windows.h>
-#include <tchar.h>
-
-static gboolean has_console; /* TRUE if app has console */
-static gboolean console_wait; /* "Press any key..." */
-static gboolean stdin_capture = FALSE; /* Don't grab stdin & stdout if TRUE */
-
-/*
- * Check whether a given standard handle needs to be redirected.
- *
- * If you run a Windows-subsystem program from cmd.exe on Windows XP,
- * and you haven't redirected the handle in question, GetStdHandle()
- * succeeds (so it doesn't return INVALID_HANDLE_VALUE or NULL), but
- * GetFile_type fails on the results with ERROR_INVALID_HANDLE.
- * In that case, redirection to a console is necessary.
- *
- * If you run it from the shell prompt in "mintty" in at least some
- * versions of Cygwin on Windows XP, and you haven't redirected the
- * handle in question, GetStdHandle() succeeds and returns a handle
- * that's a pipe or socket; it appears mintty reads from it and outputs
- * what it reads to the console.
- */
-static gboolean
-needs_redirection(int std_handle)
-{
- HANDLE fd;
- DWORD handle_type;
- DWORD error;
-
- fd = GetStdHandle(std_handle);
- if (fd == NULL) {
- /*
- * No standard handle. According to Microsoft's
- * documentation for GetStdHandle(), one reason for
- * this would be that the process is "a service on
- * an interactive desktop"; I'm not sure whether
- * such a process should be popping up a console.
- *
- * However, it also appears to be the case for
- * the standard input and standard error, but
- * *not* the standard output, for something run
- * with a double-click in Windows Explorer,
- * sow we'll say it needs redirection.
- */
- return TRUE;
- }
- if (fd == INVALID_HANDLE_VALUE) {
- /*
- * OK, I'm not when this would happen; return
- * "no redirection" for now.
- */
- return FALSE;
- }
- handle_type = GetFileType(fd);
- if (handle_type == FILE_TYPE_UNKNOWN) {
- error = GetLastError();
- if (error == ERROR_INVALID_HANDLE) {
- /*
- * OK, this appears to be the case where we're
- * running something in a mode that needs a
- * console.
- */
- return TRUE;
- }
- }
-
- /*
- * Assume no redirection is needed for all other cases.
- */
- return FALSE;
-}
-
-/*
- * If this application has no console window to which its standard output
- * would go, create one.
- */
-void
-create_console(void)
-{
- gboolean must_redirect_stdin;
- gboolean must_redirect_stdout;
- gboolean must_redirect_stderr;
-
- if (stdin_capture) {
- /* We've been handed "-i -". Don't mess with stdio. */
- return;
- }
-
- if (has_console) {
- return;
- }
-
- /* Are the standard input, output, and error invalid handles? */
- must_redirect_stdin = needs_redirection(STD_INPUT_HANDLE);
- must_redirect_stdout = needs_redirection(STD_OUTPUT_HANDLE);
- must_redirect_stderr = needs_redirection(STD_ERROR_HANDLE);
-
- /* If none of them are invalid, we don't need to do anything. */
- if (!must_redirect_stdin && !must_redirect_stdout && !must_redirect_stderr)
- return;
-
- /* OK, at least one of them needs to be redirected to a console;
- try to attach to the parent process's console and, if that fails,
- try to create one. */
- /*
- * See if we have an existing console (i.e. we were run from a
- * command prompt).
- */
- if (!AttachConsole(ATTACH_PARENT_PROCESS)) {
- /* Probably not, as we couldn't attach to the parent process's
- console.
- Try to create a console.
-
- According to a comment on
-
-http://msdn.microsoft.com/en-us/library/windows/desktop/ms681952(v=vs.85).aspx
-
- (which now redirects to a docs.microsoft.com page that is
- devoid of comments, and which is not available on the
- Wayback Machine)
-
- and according to
-
-http://connect.microsoft.com/VisualStudio/feedback/details/689696/installing-security-update-kb2507938-prevents-console-allocation
-
- (which has disappeared, and isn't available on the Wayback
- Machine)
-
- and
-
-https://answers.microsoft.com/en-us/windows/forum/windows_xp-windows_update/kb2567680-andor-kb2507938-breaks-attachconsole-api/e8191280-2d49-4be4-9918-18486fba0afa
-
-even a failed attempt to attach to another process's console
-will cause subsequent AllocConsole() calls to fail, possibly due
-to bugs introduced by a security patch. To work around this, we
-do a FreeConsole() first. */
- FreeConsole();
- if (AllocConsole()) {
- /* That succeeded. */
- console_wait = TRUE;
- SetConsoleTitle(_T("Wireshark Debug Console"));
- } else {
- /* On Windows XP, this still fails; FreeConsole() apparently
- doesn't clear the state, as it does on Windows 7. */
- return; /* couldn't create console */
- }
- }
-
- if (must_redirect_stdin)
- ws_freopen("CONIN$", "r", stdin);
- if (must_redirect_stdout) {
- ws_freopen("CONOUT$", "w", stdout);
- fprintf(stdout, "\n");
- }
- if (must_redirect_stderr) {
- ws_freopen("CONOUT$", "w", stderr);
- fprintf(stderr, "\n");
- }
-
- /* Now register "destroy_console()" as a routine to be called just
- before the application exits, so that we can destroy the console
- after the user has typed a key (so that the console doesn't just
- disappear out from under them, giving the user no chance to see
- the message(s) we put in there). */
- atexit(destroy_console);
-
- /* Well, we have a console now. */
- has_console = TRUE;
-}
-
-void
-restore_pipes(void)
-{
- gboolean must_redirect_stdin;
- gboolean must_redirect_stdout;
- gboolean must_redirect_stderr;
-
- HANDLE fd;
-
- if (stdin_capture) {
- /* We've been handed "-i -". Don't mess with stdio. */
- return;
- }
-
- if (has_console) {
- return;
- }
-
- /* Are the standard input, output, and error invalid handles? */
- must_redirect_stdin = needs_redirection(STD_INPUT_HANDLE);
- must_redirect_stdout = needs_redirection(STD_OUTPUT_HANDLE);
- must_redirect_stderr = needs_redirection(STD_ERROR_HANDLE);
-
- /* If none of them are invalid, we don't need to do anything. */
- if (!must_redirect_stdin && !must_redirect_stdout && !must_redirect_stderr)
- return;
-
- if (!must_redirect_stdin)
- fd = GetStdHandle(STD_INPUT_HANDLE);
-
- /* OK, at least one of them needs to be redirected to a console;
- try to attach to the parent process's console and, if that fails,
- cleanup and return. */
- /*
- * See if we have an existing console (i.e. we were run from a
- * command prompt).
- */
- if (!AttachConsole(ATTACH_PARENT_PROCESS)) {
- FreeConsole();
- return; /* No parent - cleanup and exit */
- }
-
- if (must_redirect_stdin) {
- ws_freopen("CONIN$", "r", stdin);
- } else {
- SetStdHandle(STD_INPUT_HANDLE, fd);
- }
- if (must_redirect_stdout) {
- ws_freopen("CONOUT$", "w", stdout);
- fprintf(stdout, "\n");
- }
- if (must_redirect_stderr) {
- ws_freopen("CONOUT$", "w", stderr);
- fprintf(stderr, "\n");
- }
-
- /* Now register "destroy_console()" as a routine to be called just
- before the application exits, so that we can destroy the console
- after the user has typed a key (so that the console doesn't just
- disappear out from under them, giving the user no chance to see
- the message(s) we put in there). */
- atexit(destroy_console);
-
- /* Well, we have a console now. */
- has_console = TRUE;
-}
-
-void
-destroy_console(void)
-{
- if (console_wait) {
- printf("\n\nPress any key to exit\n");
- _getch();
- }
- FreeConsole();
-}
-
-void
-set_console_wait(gboolean set_console_wait)
-{
- console_wait = set_console_wait;
-}
-
-gboolean
-get_console_wait(void)
-{
- return console_wait;
-}
-
-void
-set_stdin_capture(gboolean set_stdin_capture)
-{
- stdin_capture = set_stdin_capture;
-}
-
-gboolean
-get_stdin_capture(void)
-{
- return stdin_capture;
-}
-
-#endif /* _WIN32 */