[USERENV]
[reactos.git] / reactos / dll / win32 / userenv / environment.c
index 0a148ab..baf2a80 100644 (file)
  *  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,
@@ -118,7 +118,8 @@ SetUserEnvironmentVariable(LPVOID *Environment,
 }
 
 
-static BOOL
+static
+BOOL
 AppendUserEnvironmentVariable(LPVOID *Environment,
                               LPWSTR lpName,
                               LPWSTR lpValue)
@@ -166,15 +167,16 @@ AppendUserEnvironmentVariable(LPVOID *Environment,
 }
 
 
-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;
@@ -199,7 +201,91 @@ GetCurrentUserKey(HANDLE hToken)
 }
 
 
-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)
@@ -311,7 +397,8 @@ SetUserEnvironment(LPVOID *lpEnvironment,
 }
 
 
-BOOL WINAPI
+BOOL
+WINAPI
 CreateEnvironmentBlock(LPVOID *lpEnvironment,
                        HANDLE hToken,
                        BOOL bInherit)
@@ -322,6 +409,8 @@ CreateEnvironmentBlock(LPVOID *lpEnvironment,
     DWORD dwType;
     HKEY hKey;
     HKEY hKeyUser;
+    LPWSTR lpUserName = NULL;
+    LPWSTR lpDomainName = NULL;
     NTSTATUS Status;
     LONG lError;
 
@@ -427,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);
     }
 
@@ -451,11 +545,18 @@ CreateEnvironmentBlock(LPVOID *lpEnvironment,
 
     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");
@@ -472,7 +573,8 @@ DestroyEnvironmentBlock(LPVOID lpEnvironment)
 }
 
 
-BOOL WINAPI
+BOOL
+WINAPI
 ExpandEnvironmentStringsForUserW(IN HANDLE hToken,
                                  IN LPCWSTR lpSrc,
                                  OUT LPWSTR lpDest,
@@ -523,7 +625,8 @@ ExpandEnvironmentStringsForUserW(IN HANDLE hToken,
 }
 
 
-BOOL WINAPI
+BOOL
+WINAPI
 ExpandEnvironmentStringsForUserA(IN HANDLE hToken,
                                  IN LPCSTR lpSrc,
                                  OUT LPSTR lpDest,