[PATCH] whoami: Add semi-stub application to display username.
Brendan Shanks
bshanks at codeweavers.com
Mon Mar 9 13:09:52 CDT 2020
Fixes GTA V hang experienced by some users.
Signed-off-by: Brendan Shanks <bshanks at 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;
+}
--
2.24.1
More information about the wine-devel
mailing list