Alexandre Julliard : advapi32: Use WINEUSERNAME variable to implement GetUserNameA/W.
Alexandre Julliard
julliard at winehq.org
Thu Apr 16 16:45:12 CDT 2020
Module: wine
Branch: master
Commit: f8fb43aaba499c6d0da05b0ee3a09c349a753cf8
URL: https://source.winehq.org/git/wine.git/?a=commit;h=f8fb43aaba499c6d0da05b0ee3a09c349a753cf8
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu Apr 16 15:15:21 2020 +0200
advapi32: Use WINEUSERNAME variable to implement GetUserNameA/W.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/advapi32/advapi.c | 79 +++++++++-----------------------------------------
1 file changed, 14 insertions(+), 65 deletions(-)
diff --git a/dlls/advapi32/advapi.c b/dlls/advapi32/advapi.c
index 433c25820d..cfd79e02af 100644
--- a/dlls/advapi32/advapi.c
+++ b/dlls/advapi32/advapi.c
@@ -32,7 +32,6 @@
#include "wincred.h"
#include "wct.h"
-#include "wine/library.h"
#include "wine/unicode.h"
#include "wine/debug.h"
@@ -42,81 +41,31 @@ WINE_DEFAULT_DEBUG_CHANNEL(advapi);
/******************************************************************************
* GetUserNameA [ADVAPI32.@]
- *
- * Get the current user name.
- *
- * PARAMS
- * lpszName [O] Destination for the user name.
- * lpSize [I/O] Size of lpszName.
- *
- * RETURNS
- * Success: The length of the user name, including terminating NUL.
- * Failure: ERROR_MORE_DATA if *lpSize is too small.
*/
-BOOL WINAPI
-GetUserNameA( LPSTR lpszName, LPDWORD lpSize )
+BOOL WINAPI GetUserNameA( LPSTR name, LPDWORD size )
{
- WCHAR *buffer;
+ DWORD len = GetEnvironmentVariableA( "WINEUSERNAME", name, *size );
BOOL ret;
- DWORD sizeW = *lpSize;
-
- if (!(buffer = heap_alloc( sizeW * sizeof(WCHAR) )))
- {
- SetLastError( ERROR_NOT_ENOUGH_MEMORY );
- return FALSE;
- }
- ret = GetUserNameW( buffer, &sizeW );
- if (ret)
- *lpSize = WideCharToMultiByte( CP_ACP, 0, buffer, -1, lpszName, *lpSize, NULL, NULL );
- else
- *lpSize = sizeW;
-
- heap_free( buffer );
+ if (!len) return FALSE;
+ if ((ret = (len < *size))) len++;
+ *size = len;
return ret;
}
/******************************************************************************
* GetUserNameW [ADVAPI32.@]
- *
- * See GetUserNameA.
*/
-BOOL WINAPI
-GetUserNameW( LPWSTR lpszName, LPDWORD lpSize )
+BOOL WINAPI GetUserNameW( LPWSTR name, LPDWORD size )
{
- const char *name = wine_get_user_name();
- DWORD i, len = MultiByteToWideChar( CP_UNIXCP, 0, name, -1, NULL, 0 );
- LPWSTR backslash;
-
- if (len > *lpSize)
- {
- SetLastError( ERROR_INSUFFICIENT_BUFFER );
- *lpSize = len;
- return FALSE;
- }
-
- *lpSize = len;
- MultiByteToWideChar( CP_UNIXCP, 0, name, -1, lpszName, len );
-
- /* Word uses the user name to create named mutexes and file mappings,
- * and backslashes in the name cause the creation to fail.
- * Also, Windows doesn't return the domain name in the user name even when
- * joined to a domain. A Unix box joined to a domain using winbindd will
- * contain the domain name in the username. So we need to cut this off.
- * FIXME: Only replaces forward and backslashes for now, should get the
- * winbind separator char from winbindd and replace that.
- */
- for (i = 0; lpszName[i]; i++)
- if (lpszName[i] == '/') lpszName[i] = '\\';
-
- backslash = strrchrW(lpszName, '\\');
- if (backslash == NULL)
- return TRUE;
-
- len = lstrlenW(backslash);
- memmove(lpszName, backslash + 1, len * sizeof(WCHAR));
- *lpSize = len;
- return TRUE;
+ static const WCHAR wineusernameW[] = {'W','I','N','E','U','S','E','R','N','A','M','E',0};
+ DWORD len = GetEnvironmentVariableW( wineusernameW, name, *size );
+ BOOL ret;
+
+ if (!len) return FALSE;
+ if ((ret = (len < *size))) len++;
+ *size = len;
+ return ret;
}
/******************************************************************************
More information about the wine-cvs
mailing list