* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-/* $Id$
- *
+/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries
- * FILE: lib/userenv/environment.c
+ * FILE: dll/win32/userenv/environment.c
* PURPOSE: User environment functions
* PROGRAMMER: Eric Kohl
*/
-#include <precomp.h>
+#include "precomp.h"
#define NDEBUG
#include <debug.h>
-static BOOL
+static
+BOOL
SetUserEnvironmentVariable(LPVOID *Environment,
LPWSTR lpName,
LPWSTR lpValue,
}
-static BOOL
+static
+BOOL
AppendUserEnvironmentVariable(LPVOID *Environment,
LPWSTR lpName,
LPWSTR lpValue)
}
-static HKEY
+static
+HKEY
GetCurrentUserKey(HANDLE hToken)
{
UNICODE_STRING SidString;
HKEY hKey;
LONG Error;
- if (!GetUserSidFromToken(hToken,
- &SidString))
+ if (!GetUserSidStringFromToken(hToken,
+ &SidString))
{
DPRINT1("GetUserSidFromToken() failed\n");
return NULL;
}
-static BOOL
+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,
HKEY hKey,
LPWSTR lpSubKeyName)
}
-BOOL WINAPI
+BOOL
+WINAPI
CreateEnvironmentBlock(LPVOID *lpEnvironment,
HANDLE hToken,
BOOL bInherit)
DWORD dwType;
HKEY hKey;
HKEY hKeyUser;
+ LPWSTR lpUserName = NULL;
+ LPWSTR lpDomainName = NULL;
NTSTATUS Status;
LONG lError;
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);
}
RegCloseKey(hKeyUser);
+ if (lpUserName != NULL)
+ LocalFree(lpUserName);
+
+ if (lpDomainName != NULL)
+ LocalFree(lpDomainName);
+
return TRUE;
}
-BOOL WINAPI
+BOOL
+WINAPI
DestroyEnvironmentBlock(LPVOID lpEnvironment)
{
DPRINT("DestroyEnvironmentBlock() called\n");
}
-BOOL WINAPI
+BOOL
+WINAPI
ExpandEnvironmentStringsForUserW(IN HANDLE hToken,
IN LPCWSTR lpSrc,
OUT LPWSTR lpDest,
}
-BOOL WINAPI
+BOOL
+WINAPI
ExpandEnvironmentStringsForUserA(IN HANDLE hToken,
IN LPCSTR lpSrc,
OUT LPSTR lpDest,