Fixes GTA V hang experienced by some users.
Signed-off-by: Brendan Shanks bshanks@codeweavers.com --- configure.ac | 1 + programs/whoami/Makefile.in | 7 +++ programs/whoami/main.c | 95 +++++++++++++++++++++++++++++++++++++ 3 files changed, 103 insertions(+) create mode 100644 programs/whoami/Makefile.in create mode 100644 programs/whoami/main.c
diff --git a/configure.ac b/configure.ac index f74d539f4e..7c3c6d2b67 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 0000000000..a003b0afaa --- /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 0000000000..5903bf21f5 --- /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 <windows.h> +#include <security.h> + +#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", ARRAY_SIZE(L"\r\n")); + } + else + WINE_ERR("GetUserNameExW failed, error %d\n", GetLastError()); + + HeapFree(GetProcessHeap(), 0, buf); + return 0; +}