From 10e3457aad0e9250d00a55a884a0d979ef78942d Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 2 Nov 2013 14:45:26 +0000 Subject: [PATCH] [USERENV] Get the user name and domain name from the logon token and set the USERNAME and USERDOMAIN environment variables accordingly. svn path=/trunk/; revision=60834 --- reactos/dll/win32/userenv/environment.c | 112 ++++++++++++++++++++++-- reactos/dll/win32/userenv/internal.h | 6 +- reactos/dll/win32/userenv/misc.c | 101 +++++++++++++++++---- reactos/dll/win32/userenv/profile.c | 14 +-- 4 files changed, 201 insertions(+), 32 deletions(-) diff --git a/reactos/dll/win32/userenv/environment.c b/reactos/dll/win32/userenv/environment.c index 918bce42894..baf2a80c0c6 100644 --- a/reactos/dll/win32/userenv/environment.c +++ b/reactos/dll/win32/userenv/environment.c @@ -175,8 +175,8 @@ GetCurrentUserKey(HANDLE hToken) HKEY hKey; LONG Error; - if (!GetUserSidFromToken(hToken, - &SidString)) + if (!GetUserSidStringFromToken(hToken, + &SidString)) { DPRINT1("GetUserSidFromToken() failed\n"); return NULL; @@ -201,6 +201,89 @@ GetCurrentUserKey(HANDLE hToken) } +static +BOOL +GetUserAndDomainName(IN HANDLE hToken, + OUT LPWSTR *UserName, + OUT LPWSTR *DomainName) +{ + PSID Sid = NULL; + LPWSTR lpUserName = NULL; + LPWSTR lpDomainName = NULL; + DWORD cbUserName = 0; + DWORD cbDomainName = 0; + SID_NAME_USE SidNameUse; + BOOL bRet = TRUE; + + if (!GetUserSidFromToken(hToken, + &Sid)) + { + DPRINT1("GetUserSidFromToken() failed\n"); + return FALSE; + } + + if (!LookupAccountSidW(NULL, + Sid, + NULL, + &cbUserName, + NULL, + &cbDomainName, + &SidNameUse)) + { + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) + { + bRet = FALSE; + goto done; + } + } + + lpUserName = LocalAlloc(LPTR, + cbUserName * sizeof(WCHAR)); + if (lpUserName == NULL) + { + bRet = FALSE; + goto done; + } + + lpDomainName = LocalAlloc(LPTR, + cbDomainName * sizeof(WCHAR)); + if (lpDomainName == NULL) + { + bRet = FALSE; + goto done; + } + + if (!LookupAccountSidW(NULL, + Sid, + lpUserName, + &cbUserName, + lpDomainName, + &cbDomainName, + &SidNameUse)) + { + bRet = FALSE; + goto done; + } + + *UserName = lpUserName; + *DomainName = lpDomainName; + +done: + if (bRet == FALSE) + { + if (lpUserName != NULL) + LocalFree(lpUserName); + + if (lpDomainName != NULL) + LocalFree(lpDomainName); + } + + LocalFree(Sid); + + return bRet; +} + + static BOOL SetUserEnvironment(LPVOID *lpEnvironment, @@ -326,6 +409,8 @@ CreateEnvironmentBlock(LPVOID *lpEnvironment, DWORD dwType; HKEY hKey; HKEY hKeyUser; + LPWSTR lpUserName = NULL; + LPWSTR lpDomainName = NULL; NTSTATUS Status; LONG lError; @@ -431,15 +516,20 @@ CreateEnvironmentBlock(LPVOID *lpEnvironment, FALSE); } - /* FIXME: Set 'USERDOMAIN' variable */ - - Length = MAX_PATH; - if (GetUserNameW(Buffer, - &Length)) + if (GetUserAndDomainName(hToken, + &lpUserName, + &lpDomainName)) { + /* Set 'USERDOMAIN' variable */ + SetUserEnvironmentVariable(lpEnvironment, + L"USERDOMAIN", + lpDomainName, + FALSE); + + /* Set 'USERNAME' variable */ SetUserEnvironmentVariable(lpEnvironment, L"USERNAME", - Buffer, + lpUserName, FALSE); } @@ -455,6 +545,12 @@ CreateEnvironmentBlock(LPVOID *lpEnvironment, RegCloseKey(hKeyUser); + if (lpUserName != NULL) + LocalFree(lpUserName); + + if (lpDomainName != NULL) + LocalFree(lpDomainName); + return TRUE; } diff --git a/reactos/dll/win32/userenv/internal.h b/reactos/dll/win32/userenv/internal.h index 098de539765..d22ab2097a4 100644 --- a/reactos/dll/win32/userenv/internal.h +++ b/reactos/dll/win32/userenv/internal.h @@ -75,7 +75,11 @@ AppendBackslash(LPWSTR String); BOOL GetUserSidFromToken(HANDLE hToken, - PUNICODE_STRING SidString); + PSID *Sid); + +BOOL +GetUserSidStringFromToken(HANDLE hToken, + PUNICODE_STRING SidString); PSECURITY_DESCRIPTOR CreateDefaultSecurityDescriptor(VOID); diff --git a/reactos/dll/win32/userenv/misc.c b/reactos/dll/win32/userenv/misc.c index e7bf1ddc2c0..1075b33965b 100644 --- a/reactos/dll/win32/userenv/misc.c +++ b/reactos/dll/win32/userenv/misc.c @@ -53,56 +53,124 @@ AppendBackslash(LPWSTR String) BOOL GetUserSidFromToken(HANDLE hToken, - PUNICODE_STRING SidString) + PSID *Sid) { - PSID_AND_ATTRIBUTES SidBuffer, nsb; + PTOKEN_USER UserBuffer, nsb; + PSID pSid = NULL; ULONG Length; NTSTATUS Status; Length = 256; - SidBuffer = LocalAlloc(LMEM_FIXED, - Length); - if (SidBuffer == NULL) + UserBuffer = LocalAlloc(LPTR, Length); + if (UserBuffer == NULL) + { return FALSE; + } Status = NtQueryInformationToken(hToken, TokenUser, - (PVOID)SidBuffer, + (PVOID)UserBuffer, Length, &Length); if (Status == STATUS_BUFFER_TOO_SMALL) { - nsb = LocalReAlloc(SidBuffer, - Length, - LMEM_MOVEABLE); + nsb = LocalReAlloc(UserBuffer, Length, LMEM_MOVEABLE); if (nsb == NULL) { - LocalFree((HLOCAL)SidBuffer); + LocalFree(UserBuffer); return FALSE; } - SidBuffer = nsb; + UserBuffer = nsb; Status = NtQueryInformationToken(hToken, TokenUser, - (PVOID)SidBuffer, + (PVOID)UserBuffer, Length, &Length); } if (!NT_SUCCESS (Status)) { - LocalFree((HLOCAL)SidBuffer); + LocalFree(UserBuffer); + return FALSE; + } + + Length = RtlLengthSid(UserBuffer->User.Sid); + + pSid = LocalAlloc(LPTR, Length); + if (pSid == NULL) + { + LocalFree(UserBuffer); + return FALSE; + } + + Status = RtlCopySid(Length, pSid, UserBuffer->User.Sid); + + LocalFree(UserBuffer); + + if (!NT_SUCCESS (Status)) + { + LocalFree(pSid); + return FALSE; + } + + *Sid = pSid; + + return TRUE; +} + + +BOOL +GetUserSidStringFromToken(HANDLE hToken, + PUNICODE_STRING SidString) +{ + PTOKEN_USER UserBuffer, nsb; + ULONG Length; + NTSTATUS Status; + + Length = 256; + UserBuffer = LocalAlloc(LPTR, Length); + if (UserBuffer == NULL) + return FALSE; + + Status = NtQueryInformationToken(hToken, + TokenUser, + (PVOID)UserBuffer, + Length, + &Length); + if (Status == STATUS_BUFFER_TOO_SMALL) + { + nsb = LocalReAlloc(UserBuffer, + Length, + LMEM_MOVEABLE); + if (nsb == NULL) + { + LocalFree(UserBuffer); + return FALSE; + } + + UserBuffer = nsb; + Status = NtQueryInformationToken(hToken, + TokenUser, + (PVOID)UserBuffer, + Length, + &Length); + } + + if (!NT_SUCCESS (Status)) + { + LocalFree(UserBuffer); SetLastError(RtlNtStatusToDosError(Status)); return FALSE; } - DPRINT("SidLength: %lu\n", RtlLengthSid (SidBuffer[0].Sid)); + DPRINT("SidLength: %lu\n", RtlLengthSid (UserBuffer->User.Sid)); Status = RtlConvertSidToUnicodeString(SidString, - SidBuffer[0].Sid, + UserBuffer->User.Sid, TRUE); - LocalFree((HLOCAL)SidBuffer); + LocalFree(UserBuffer); if (!NT_SUCCESS(Status)) { @@ -117,6 +185,7 @@ GetUserSidFromToken(HANDLE hToken, return TRUE; } + PSECURITY_DESCRIPTOR CreateDefaultSecurityDescriptor(VOID) { diff --git a/reactos/dll/win32/userenv/profile.c b/reactos/dll/win32/userenv/profile.c index 2884e3a0955..888115baeaf 100644 --- a/reactos/dll/win32/userenv/profile.c +++ b/reactos/dll/win32/userenv/profile.c @@ -814,8 +814,8 @@ GetUserProfileDirectoryW(HANDLE hToken, HKEY hKey; LONG Error; - if (!GetUserSidFromToken(hToken, - &SidString)) + if (!GetUserSidStringFromToken(hToken, + &SidString)) { DPRINT1("GetUserSidFromToken() failed\n"); return FALSE; @@ -898,8 +898,8 @@ CheckForLoadedProfile(HANDLE hToken) DPRINT("CheckForLoadedProfile() called\n"); - if (!GetUserSidFromToken(hToken, - &SidString)) + if (!GetUserSidStringFromToken(hToken, + &SidString)) { DPRINT1("GetUserSidFromToken() failed\n"); return FALSE; @@ -1166,7 +1166,7 @@ LoadUserProfileW(IN HANDLE hToken, } /* Get user SID string */ - ret = GetUserSidFromToken(hToken, &SidString); + ret = GetUserSidStringFromToken(hToken, &SidString); if (!ret) { DPRINT1("GetUserSidFromToken() failed\n"); @@ -1243,8 +1243,8 @@ UnloadUserProfile(HANDLE hToken, RegCloseKey(hProfile); - if (!GetUserSidFromToken(hToken, - &SidString)) + if (!GetUserSidStringFromToken(hToken, + &SidString)) { DPRINT1("GetUserSidFromToken() failed\n"); return FALSE;