From b36a10596a868e690e32c70f4487c3dc6b9bda7c Mon Sep 17 00:00:00 2001 From: Brendan Shanks Date: Mon, 9 Mar 2020 11:09:52 -0700 Subject: [PATCH] whoami: Add semi-stub application to display username. Fixes GTA V hang experienced by some users. Signed-off-by: Brendan Shanks Signed-off-by: Alexandre Julliard --- configure | 2 + configure.ac | 1 + programs/whoami/Makefile.in | 7 +++ programs/whoami/main.c | 95 +++++++++++++++++++++++++++++++++++++ 4 files changed, 105 insertions(+) create mode 100644 programs/whoami/Makefile.in create mode 100644 programs/whoami/main.c diff --git a/configure b/configure index d536aa28b98..2910662c145 100755 --- a/configure +++ b/configure @@ -1792,6 +1792,7 @@ enable_uninstaller enable_unlodctr enable_view enable_wevtutil +enable_whoami enable_wineboot enable_winebrowser enable_winecfg @@ -21266,6 +21267,7 @@ wine_fn_config_makefile programs/uninstaller enable_uninstaller wine_fn_config_makefile programs/unlodctr enable_unlodctr wine_fn_config_makefile programs/view enable_view wine_fn_config_makefile programs/wevtutil enable_wevtutil +wine_fn_config_makefile programs/whoami enable_whoami wine_fn_config_makefile programs/wineboot enable_wineboot wine_fn_config_makefile programs/winebrowser enable_winebrowser wine_fn_config_makefile programs/winecfg enable_winecfg diff --git a/configure.ac b/configure.ac index f74d539f4e5..7c3c6d2b670 100644 --- a/configure.ac +++ b/configure.ac @@ -3973,6 +3973,7 @@ WINE_CONFIG_MAKEFILE(programs/uninstaller) WINE_CONFIG_MAKEFILE(programs/unlodctr) WINE_CONFIG_MAKEFILE(programs/view) WINE_CONFIG_MAKEFILE(programs/wevtutil) +WINE_CONFIG_MAKEFILE(programs/whoami) WINE_CONFIG_MAKEFILE(programs/wineboot) WINE_CONFIG_MAKEFILE(programs/winebrowser) WINE_CONFIG_MAKEFILE(programs/winecfg) diff --git a/programs/whoami/Makefile.in b/programs/whoami/Makefile.in new file mode 100644 index 00000000000..a003b0afaa7 --- /dev/null +++ b/programs/whoami/Makefile.in @@ -0,0 +1,7 @@ +MODULE = whoami.exe +IMPORTS = secur32 + +EXTRADLLFLAGS = -mconsole -municode -mno-cygwin + +C_SRCS = \ + main.c diff --git a/programs/whoami/main.c b/programs/whoami/main.c new file mode 100644 index 00000000000..297f12c9a91 --- /dev/null +++ b/programs/whoami/main.c @@ -0,0 +1,95 @@ +/* + * Copyright 2020 Brendan Shanks for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#define SECURITY_WIN32 +#include +#include + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(whoami); + +static int output_write(const WCHAR* str, int len) +{ + DWORD ret, count; + ret = WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), str, len, &count, NULL); + if (!ret) + { + DWORD lenA; + char* strA; + + /* On Windows WriteConsoleW() fails if the output is redirected. So fall + * back to WriteFile(), assuming the console encoding is still the right + * one in that case. + */ + lenA = WideCharToMultiByte(GetConsoleOutputCP(), 0, str, len, + NULL, 0, NULL, NULL); + strA = HeapAlloc(GetProcessHeap(), 0, lenA); + if (!strA) + return 0; + + WideCharToMultiByte(GetConsoleOutputCP(), 0, str, len, strA, lenA, + NULL, NULL); + WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), strA, lenA, &count, FALSE); + HeapFree(GetProcessHeap(), 0, strA); + } + return count; +} + +int __cdecl wmain(int argc, WCHAR *argv[]) +{ + WCHAR *buf = NULL; + ULONG size = 0; + BOOL result; + + if (argc > 1) + { + int i; + + WINE_FIXME("unsupported arguments:"); + for (i = 0; i < argc; i++) + WINE_FIXME(" %s", wine_dbgstr_w(argv[i])); + WINE_FIXME("\n"); + } + + result = GetUserNameExW(NameSamCompatible, NULL, &size); + if (result || GetLastError() != ERROR_MORE_DATA) + { + WINE_ERR("GetUserNameExW failed, result %d, error %d\n", result, GetLastError()); + return 1; + } + + buf = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WCHAR)); + if (!buf) + { + WINE_ERR("Memory allocation failed\n"); + return 1; + } + + result = GetUserNameExW(NameSamCompatible, buf, &size); + if (result) + { + output_write(buf, size); + output_write(L"\r\n", 2); + } + else + WINE_ERR("GetUserNameExW failed, error %d\n", GetLastError()); + + HeapFree(GetProcessHeap(), 0, buf); + return 0; +}