Fix code assuming that the Reg* functions set the last error code
Modified: trunk/reactos/lib/userenv/desktop.c
Modified: trunk/reactos/lib/userenv/environment.c
Modified: trunk/reactos/lib/userenv/misc.c
Modified: trunk/reactos/lib/userenv/precomp.h
Modified: trunk/reactos/lib/userenv/profile.c
Modified: trunk/reactos/lib/userenv/registry.c
Modified: trunk/reactos/lib/userenv/setup.c
Modified: trunk/reactos/lib/userenv/userenv.xml

Modified: trunk/reactos/lib/userenv/desktop.c
--- trunk/reactos/lib/userenv/desktop.c	2006-01-11 23:54:44 UTC (rev 20794)
+++ trunk/reactos/lib/userenv/desktop.c	2006-01-12 00:11:14 UTC (rev 20795)
@@ -41,29 +41,34 @@
   DWORD dwLength;
   DWORD dwType;
   HKEY hKey;
+  LONG Error;
 
   DPRINT ("GetDesktopPath() called\n");
 
-  if (RegOpenKeyExW (HKEY_CURRENT_USER,
-		     L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders",
-		     0,
-		     KEY_ALL_ACCESS,
-		     &hKey))
+  Error = RegOpenKeyExW (HKEY_CURRENT_USER,
+		         L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders",
+		         0,
+		         KEY_ALL_ACCESS,
+		         &hKey);
+  if (Error != ERROR_SUCCESS)
     {
       DPRINT1 ("RegOpenKeyExW() failed\n");
+      SetLastError((DWORD)Error);
       return FALSE;
     }
 
   dwLength = MAX_PATH * sizeof(WCHAR);
-  if (RegQueryValueExW (hKey,
-			bCommonPath ? L"Common Desktop" : L"Desktop",
-			0,
-			&dwType,
-			(LPBYTE)szPath,
-			&dwLength))
+  Error = RegQueryValueExW (hKey,
+			    bCommonPath ? L"Common Desktop" : L"Desktop",
+			    0,
+			    &dwType,
+			    (LPBYTE)szPath,
+			   &dwLength);
+  if (Error != ERROR_SUCCESS)
     {
       DPRINT1 ("RegQueryValueExW() failed\n");
       RegCloseKey (hKey);
+      SetLastError((DWORD)Error);
       return FALSE;
     }
 
@@ -94,29 +99,34 @@
   DWORD dwLength;
   DWORD dwType;
   HKEY hKey;
+  LONG Error;
 
   DPRINT ("GetProgramsPath() called\n");
 
-  if (RegOpenKeyExW (HKEY_CURRENT_USER,
-		     L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders",
-		     0,
-		     KEY_ALL_ACCESS,
-		     &hKey))
+  Error = RegOpenKeyExW (HKEY_CURRENT_USER,
+		         L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders",
+		         0,
+		         KEY_ALL_ACCESS,
+		         &hKey);
+  if (Error != ERROR_SUCCESS)
     {
       DPRINT1 ("RegOpenKeyExW() failed\n");
+      SetLastError((DWORD)Error);
       return FALSE;
     }
 
   dwLength = MAX_PATH * sizeof(WCHAR);
-  if (RegQueryValueExW (hKey,
-			bCommonPath ? L"Common Programs" : L"Programs",
-			0,
-			&dwType,
-			(LPBYTE)szPath,
-			&dwLength))
+  Error = RegQueryValueExW (hKey,
+			    bCommonPath ? L"Common Programs" : L"Programs",
+			    0,
+			    &dwType,
+			    (LPBYTE)szPath,
+			    &dwLength);
+  if (Error != ERROR_SUCCESS)
     {
       DPRINT1 ("RegQueryValueExW() failed\n");
       RegCloseKey (hKey);
+      SetLastError((DWORD)Error);
       return FALSE;
     }
 

Modified: trunk/reactos/lib/userenv/environment.c
--- trunk/reactos/lib/userenv/environment.c	2006-01-11 23:54:44 UTC (rev 20794)
+++ trunk/reactos/lib/userenv/environment.c	2006-01-12 00:11:14 UTC (rev 20795)
@@ -169,6 +169,7 @@
 {
   UNICODE_STRING SidString;
   HKEY hKey;
+  LONG Error;
 
   if (!GetUserSidFromToken (hToken,
 			    &SidString))
@@ -177,14 +178,16 @@
       return NULL;
     }
 
-  if (RegOpenKeyExW (HKEY_USERS,
-		     SidString.Buffer,
-		     0,
-		     KEY_ALL_ACCESS,
-		     &hKey))
+  Error = RegOpenKeyExW (HKEY_USERS,
+		         SidString.Buffer,
+		         0,
+		         KEY_ALL_ACCESS,
+		         &hKey);
+  if (Error != ERROR_SUCCESS)
     {
-      DPRINT1 ("RegOpenKeyExW() failed (Error %ld)\n", GetLastError());
+      DPRINT1 ("RegOpenKeyExW() failed (Error %ld)\n", Error);
       RtlFreeUnicodeString (&SidString);
+      SetLastError((DWORD)Error);
       return NULL;
     }
 
@@ -209,32 +212,37 @@
   DWORD i;
   LPWSTR lpValueName;
   LPWSTR lpValueData;
+  LONG Error;
 
-  if (RegOpenKeyExW (hKey,
-		     lpSubKeyName,
-		     0,
-		     KEY_ALL_ACCESS,
-		     &hEnvKey))
+  Error = RegOpenKeyExW (hKey,
+		         lpSubKeyName,
+		         0,
+		         KEY_ALL_ACCESS,
+		         &hEnvKey);
+  if (Error != ERROR_SUCCESS)
     {
-      DPRINT1 ("RegOpenKeyExW() failed (Error %ld)\n", GetLastError());
+      DPRINT1 ("RegOpenKeyExW() failed (Error %ld)\n", Error);
+      SetLastError((DWORD)Error);
       return FALSE;
     }
 
-  if (RegQueryInfoKey (hEnvKey,
-		       NULL,
-		       NULL,
-		       NULL,
-		       NULL,
-		       NULL,
-		       NULL,
-		       &dwValues,
-		       &dwMaxValueNameLength,
-		       &dwMaxValueDataLength,
-		       NULL,
-		       NULL))
+  Error = RegQueryInfoKey (hEnvKey,
+		           NULL,
+		           NULL,
+		           NULL,
+		           NULL,
+		           NULL,
+		           NULL,
+		           &dwValues,
+		           &dwMaxValueNameLength,
+		           &dwMaxValueDataLength,
+		           NULL,
+		           NULL);
+  if (Error != ERROR_SUCCESS)
     {
-      DPRINT1 ("RegQueryInforKey() failed (Error %ld)\n", GetLastError());
+      DPRINT1 ("RegQueryInforKey() failed (Error %ld)\n", Error);
       RegCloseKey (hEnvKey);
+      SetLastError((DWORD)Error);
       return FALSE;
     }
 
@@ -314,13 +322,17 @@
   DPRINT("CreateEnvironmentBlock() called\n");
 
   if (lpEnvironment == NULL)
-    return FALSE;
+    {
+      SetLastError(ERROR_INVALID_PARAMETER);
+      return FALSE;
+    }
 
   Status = RtlCreateEnvironment ((BOOLEAN)bInherit,
 				 (PWSTR*)lpEnvironment);
   if (!NT_SUCCESS (Status))
     {
       DPRINT1 ("RtlCreateEnvironment() failed (Status %lx)\n", Status);
+      SetLastError (RtlNtStatusToDosError (Status));
       return FALSE;
     }
 
@@ -390,7 +402,10 @@
   DPRINT ("DestroyEnvironmentBlock() called\n");
 
   if (lpEnvironment == NULL)
-    return FALSE;
+    {
+      SetLastError(ERROR_INVALID_PARAMETER);
+      return FALSE;
+    }
 
   RtlDestroyEnvironment (lpEnvironment);
 

Modified: trunk/reactos/lib/userenv/misc.c
--- trunk/reactos/lib/userenv/misc.c	2006-01-11 23:54:44 UTC (rev 20794)
+++ trunk/reactos/lib/userenv/misc.c	2006-01-12 00:11:14 UTC (rev 20795)
@@ -91,6 +91,7 @@
   if (!NT_SUCCESS (Status))
     {
       LocalFree ((HLOCAL)SidBuffer);
+      SetLastError (RtlNtStatusToDosError (Status));
       return FALSE;
     }
 
@@ -103,7 +104,10 @@
   LocalFree ((HLOCAL)SidBuffer);
 
   if (!NT_SUCCESS (Status))
-    return FALSE;
+    {
+      SetLastError (RtlNtStatusToDosError (Status));
+      return FALSE;
+    }
 
   DPRINT ("SidString.Length: %lu\n", SidString->Length);
   DPRINT ("SidString.MaximumLength: %lu\n", SidString->MaximumLength);

Modified: trunk/reactos/lib/userenv/precomp.h
--- trunk/reactos/lib/userenv/precomp.h	2006-01-11 23:54:44 UTC (rev 20794)
+++ trunk/reactos/lib/userenv/precomp.h	2006-01-12 00:11:14 UTC (rev 20795)
@@ -4,6 +4,7 @@
 #define NTOS_MODE_USER
 #include <ndk/ntndk.h>
 #include <userenv.h>
+#include <sddl.h>
 #include <shlobj.h>
 
 #include "internal.h"

Modified: trunk/reactos/lib/userenv/profile.c
--- trunk/reactos/lib/userenv/profile.c	2006-01-11 23:54:44 UTC (rev 20794)
+++ trunk/reactos/lib/userenv/profile.c	2006-01-12 00:11:14 UTC (rev 20795)
@@ -66,6 +66,7 @@
   if (wcslen(lpName) + wcslen(lpszPostfix) >= dwMaxLength)
     {
       DPRINT1("Error: buffer overflow\n");
+      SetLastError(ERROR_BUFFER_OVERFLOW);
       return FALSE;
     }
 
@@ -109,35 +110,39 @@
   WCHAR szUserProfilePath[MAX_PATH];
   WCHAR szDefaultUserPath[MAX_PATH];
   WCHAR szBuffer[MAX_PATH];
-  UNICODE_STRING SidString;
+  LPWSTR SidString;
   DWORD dwLength;
   DWORD dwDisposition;
   HKEY hKey;
-  NTSTATUS Status;
+  LONG Error;
 
   DPRINT("CreateUserProfileW() called\n");
 
-  if (RegOpenKeyExW (HKEY_LOCAL_MACHINE,
-		     L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList",
-		     0,
-		     KEY_ALL_ACCESS,
-		     &hKey))
+  Error = RegOpenKeyExW (HKEY_LOCAL_MACHINE,
+		         L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList",
+		         0,
+		         KEY_ALL_ACCESS,
+		         &hKey);
+  if (Error != ERROR_SUCCESS)
     {
-      DPRINT1("Error: %lu\n", GetLastError());
+      DPRINT1("Error: %lu\n", Error);
+      SetLastError((DWORD)Error);
       return FALSE;
     }
 
   /* Get profiles path */
   dwLength = MAX_PATH * sizeof(WCHAR);
-  if (RegQueryValueExW (hKey,
-			L"ProfilesDirectory",
-			NULL,
-			NULL,
-			(LPBYTE)szRawProfilesPath,
-			&dwLength))
+  Error = RegQueryValueExW (hKey,
+			    L"ProfilesDirectory",
+			    NULL,
+			    NULL,
+			    (LPBYTE)szRawProfilesPath,
+			    &dwLength);
+  if (Error != ERROR_SUCCESS)
     {
-      DPRINT1("Error: %lu\n", GetLastError());
+      DPRINT1("Error: %lu\n", Error);
       RegCloseKey (hKey);
+      SetLastError((DWORD)Error);
       return FALSE;
     }
 
@@ -153,15 +158,17 @@
 
   /* Get default user path */
   dwLength = MAX_PATH * sizeof(WCHAR);
-  if (RegQueryValueExW (hKey,
-			L"DefaultUserProfile",
-			NULL,
-			NULL,
-			(LPBYTE)szBuffer,
-			&dwLength))
+  Error = RegQueryValueExW (hKey,
+			    L"DefaultUserProfile",
+			    NULL,
+			    NULL,
+			    (LPBYTE)szBuffer,
+			    &dwLength);
+  if (Error != ERROR_SUCCESS)
     {
-      DPRINT1("Error: %lu\n", GetLastError());
+      DPRINT1("Error: %lu\n", Error);
       RegCloseKey (hKey);
+      SetLastError((DWORD)Error);
       return FALSE;
     }
 
@@ -173,7 +180,7 @@
   if (!AppendSystemPostfix (szUserProfilePath, MAX_PATH))
     {
       DPRINT1("AppendSystemPostfix() failed\n", GetLastError());
-      RtlFreeUnicodeString (&SidString);
+      LocalFree ((HLOCAL)SidString);
       RegCloseKey (hKey);
       return FALSE;
     }
@@ -200,30 +207,32 @@
     }
 
   /* Add profile to profile list */
-  Status = RtlConvertSidToUnicodeString (&SidString, Sid, TRUE);
-  if (!NT_SUCCESS(Status))
+  if (!ConvertSidToStringSidW (Sid,
+                               &SidString))
     {
-      DPRINT1("Status: %lx\n", Status);
+      DPRINT1("Error: %lu\n", GetLastError());
       return FALSE;
     }
 
   wcscpy (szBuffer,
 	  L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList\\");
-  wcscat (szBuffer, SidString.Buffer);
+  wcscat (szBuffer, SidString);
 
   /* Create user profile key */
-  if (RegCreateKeyExW (HKEY_LOCAL_MACHINE,
-		       szBuffer,
-		       0,
-		       NULL,
-		       REG_OPTION_NON_VOLATILE,
-		       KEY_ALL_ACCESS,
-		       NULL,
-		       &hKey,
-		       &dwDisposition))
+  Error = RegCreateKeyExW (HKEY_LOCAL_MACHINE,
+		           szBuffer,
+		           0,
+		           NULL,
+		           REG_OPTION_NON_VOLATILE,
+		           KEY_ALL_ACCESS,
+		           NULL,
+		           &hKey,
+		           &dwDisposition);
+  if (Error != ERROR_SUCCESS)
     {
-      DPRINT1("Error: %lu\n", GetLastError());
-      RtlFreeUnicodeString (&SidString);
+      DPRINT1("Error: %lu\n", Error);
+      LocalFree ((HLOCAL)SidString);
+      SetLastError((DWORD)Error);
       return FALSE;
     }
 
@@ -234,36 +243,40 @@
   if (!AppendSystemPostfix (szBuffer, MAX_PATH))
     {
       DPRINT1("AppendSystemPostfix() failed\n", GetLastError());
-      RtlFreeUnicodeString (&SidString);
+      LocalFree ((HLOCAL)SidString);
       RegCloseKey (hKey);
       return FALSE;
     }
 
   /* Set 'ProfileImagePath' value (non-expanded) */
-  if (RegSetValueExW (hKey,
-		      L"ProfileImagePath",
-		      0,
-		      REG_EXPAND_SZ,
-		      (LPBYTE)szBuffer,
-		      (wcslen (szBuffer) + 1) * sizeof(WCHAR)))
+  Error = RegSetValueExW (hKey,
+		          L"ProfileImagePath",
+		          0,
+		          REG_EXPAND_SZ,
+		          (LPBYTE)szBuffer,
+		          (wcslen (szBuffer) + 1) * sizeof(WCHAR));
+  if (Error != ERROR_SUCCESS)
     {
-      DPRINT1("Error: %lu\n", GetLastError());
-      RtlFreeUnicodeString (&SidString);
+      DPRINT1("Error: %lu\n", Error);
+      LocalFree ((HLOCAL)SidString);
       RegCloseKey (hKey);
+      SetLastError((DWORD)Error);
       return FALSE;
     }
 
   /* Set 'Sid' value */
-  if (RegSetValueExW (hKey,
-		      L"Sid",
-		      0,
-		      REG_BINARY,
-		      Sid,
-		      RtlLengthSid (Sid)))
+  Error = RegSetValueExW (hKey,
+		          L"Sid",
+		          0,
+		          REG_BINARY,
+		          Sid,
+		          GetLengthSid (Sid));
+  if (Error != ERROR_SUCCESS)
     {
-      DPRINT1("Error: %lu\n", GetLastError());
-      RtlFreeUnicodeString (&SidString);
+      DPRINT1("Error: %lu\n", Error);
+      LocalFree ((HLOCAL)SidString);
       RegCloseKey (hKey);
+      SetLastError((DWORD)Error);
       return FALSE;
     }
 
@@ -274,27 +287,29 @@
   wcscat (szBuffer, L"\\ntuser.dat");
 
   /* Create new user hive */
-  if (RegLoadKeyW (HKEY_USERS,
-		   SidString.Buffer,
-		   szBuffer))
+  Error = RegLoadKeyW (HKEY_USERS,
+		       SidString,
+		       szBuffer);
+  if (Error != ERROR_SUCCESS)
     {
-      DPRINT1("Error: %lu\n", GetLastError());
-      RtlFreeUnicodeString (&SidString);
+      DPRINT1("Error: %lu\n", Error);
+      LocalFree ((HLOCAL)SidString);
+      SetLastError((DWORD)Error);
       return FALSE;
     }
 
   /* Initialize user hive */
-  if (!CreateUserHive (SidString.Buffer, szUserProfilePath))
+  if (!CreateUserHive (SidString, szUserProfilePath))
     {
       DPRINT1("Error: %lu\n", GetLastError());
-      RtlFreeUnicodeString (&SidString);
+      LocalFree ((HLOCAL)SidString);
       return FALSE;
     }
 
   RegUnLoadKeyW (HKEY_USERS,
-		 SidString.Buffer);
+		 SidString);
 
-  RtlFreeUnicodeString (&SidString);
+  LocalFree ((HLOCAL)SidString);
 
   DPRINT("CreateUserProfileW() done\n");
 
@@ -342,28 +357,33 @@
   WCHAR szBuffer[MAX_PATH];
   DWORD dwLength;
   HKEY hKey;
+  LONG Error;
 
-  if (RegOpenKeyExW (HKEY_LOCAL_MACHINE,
-		     L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList",
-		     0,
-		     KEY_READ,
-		     &hKey))
+  Error = RegOpenKeyExW (HKEY_LOCAL_MACHINE,
+		         L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList",
+		         0,
+		         KEY_READ,
+		         &hKey);
+  if (Error != ERROR_SUCCESS)
     {
-      DPRINT1("Error: %lu\n", GetLastError());
+      DPRINT1("Error: %lu\n", Error);
+      SetLastError((DWORD)Error);
       return FALSE;
     }
 
   /* Get profiles path */
   dwLength = sizeof(szBuffer);
-  if (RegQueryValueExW (hKey,
-			L"ProfilesDirectory",
-			NULL,
-			NULL,
-			(LPBYTE)szBuffer,
-			&dwLength))
+  Error = RegQueryValueExW (hKey,
+			    L"ProfilesDirectory",
+			    NULL,
+			    NULL,
+			    (LPBYTE)szBuffer,
+			    &dwLength);
+  if (Error != ERROR_SUCCESS)
     {
-      DPRINT1("Error: %lu\n", GetLastError());
+      DPRINT1("Error: %lu\n", Error);
       RegCloseKey (hKey);
+      SetLastError((DWORD)Error);
       return FALSE;
     }
 
@@ -379,15 +399,17 @@
 
   /* Get 'AllUsersProfile' name */
   dwLength = sizeof(szBuffer);
-  if (RegQueryValueExW (hKey,
-			L"AllUsersProfile",
-			NULL,
-			NULL,
-			(LPBYTE)szBuffer,
-			&dwLength))
+  Error = RegQueryValueExW (hKey,
+			    L"AllUsersProfile",
+			    NULL,
+			    NULL,
+			    (LPBYTE)szBuffer,
+			    &dwLength);
+  if (Error != ERROR_SUCCESS)
     {
-      DPRINT1("Error: %lu\n", GetLastError());
+      DPRINT1("Error: %lu\n", Error);
       RegCloseKey (hKey);
+      SetLastError((DWORD)Error);
       return FALSE;
     }
 
@@ -455,28 +477,33 @@
   WCHAR szBuffer[MAX_PATH];
   DWORD dwLength;
   HKEY hKey;
+  LONG Error;
 
-  if (RegOpenKeyExW (HKEY_LOCAL_MACHINE,
-		     L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList",
-		     0,
-		     KEY_READ,
-		     &hKey))
+  Error = RegOpenKeyExW (HKEY_LOCAL_MACHINE,
+		         L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList",
+		         0,
+		         KEY_READ,
+		         &hKey);
+  if (Error != ERROR_SUCCESS)
     {
-      DPRINT1("Error: %lu\n", GetLastError());
+      DPRINT1("Error: %lu\n", Error);
+      SetLastError((DWORD)Error);
       return FALSE;
     }
 
   /* Get profiles path */
   dwLength = sizeof(szBuffer);
-  if (RegQueryValueExW (hKey,
-			L"ProfilesDirectory",
-			NULL,
-			NULL,
-			(LPBYTE)szBuffer,
-			&dwLength))
+  Error = RegQueryValueExW (hKey,
+			    L"ProfilesDirectory",
+			    NULL,
+			    NULL,
+			    (LPBYTE)szBuffer,
+			    &dwLength);
+  if (Error != ERROR_SUCCESS)
     {
-      DPRINT1("Error: %lu\n", GetLastError());
+      DPRINT1("Error: %lu\n", Error);
       RegCloseKey (hKey);
+      SetLastError((DWORD)Error);
       return FALSE;
     }
 
@@ -492,15 +519,17 @@
 
   /* Get 'DefaultUserProfile' name */
   dwLength = sizeof(szBuffer);
-  if (RegQueryValueExW (hKey,
-			L"DefaultUserProfile",
-			NULL,
-			NULL,
-			(LPBYTE)szBuffer,
-			&dwLength))
+  Error = RegQueryValueExW (hKey,
+			    L"DefaultUserProfile",
+			    NULL,
+			    NULL,
+			   (LPBYTE)szBuffer,
+			   &dwLength);
+  if (Error != ERROR_SUCCESS)
     {
-      DPRINT1("Error: %lu\n", GetLastError());
+      DPRINT1("Error: %lu\n", Error);
       RegCloseKey (hKey);
+      SetLastError((DWORD)Error);
       return FALSE;
     }
 
@@ -568,28 +597,33 @@
   WCHAR szBuffer[MAX_PATH];
   DWORD dwLength;
   HKEY hKey;
+  LONG Error;
 
-  if (RegOpenKeyExW (HKEY_LOCAL_MACHINE,
-		     L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList",
-		     0,
-		     KEY_READ,
-		     &hKey))
+  Error = RegOpenKeyExW (HKEY_LOCAL_MACHINE,
+		         L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList",
+		         0,
+		         KEY_READ,
+		        &hKey);
+  if (Error != ERROR_SUCCESS)
     {
-      DPRINT1("Error: %lu\n", GetLastError());
+      DPRINT1("Error: %lu\n", Error);
+      SetLastError((DWORD)Error);
       return FALSE;
     }
 
   /* Get profiles path */
   dwLength = sizeof(szBuffer);
-  if (RegQueryValueExW (hKey,
-			L"ProfilesDirectory",
-			NULL,
-			NULL,
-			(LPBYTE)szBuffer,
-			&dwLength))
+  Error = RegQueryValueExW (hKey,
+			    L"ProfilesDirectory",
+			    NULL,
+			    NULL,
+			    (LPBYTE)szBuffer,
+			    &dwLength);
+  if (Error != ERROR_SUCCESS)
     {
-      DPRINT1("Error: %lu\n", GetLastError());
+      DPRINT1("Error: %lu\n", Error);
       RegCloseKey (hKey);
+      SetLastError((DWORD)Error);
       return FALSE;
     }
 
@@ -668,6 +702,7 @@
   WCHAR szImagePath[MAX_PATH];
   DWORD dwLength;
   HKEY hKey;
+  LONG Error;
 
   if (!GetUserSidFromToken (hToken,
 			    &SidString))
@@ -687,26 +722,30 @@
 
   DPRINT ("KeyName: '%S'\n", szKeyName);
 
-  if (RegOpenKeyExW (HKEY_LOCAL_MACHINE,
-		     szKeyName,
-		     0,
-		     KEY_ALL_ACCESS,
-		     &hKey))
+  Error = RegOpenKeyExW (HKEY_LOCAL_MACHINE,
+		         szKeyName,
+		         0,
+		         KEY_ALL_ACCESS,
+		         &hKey);
+  if (Error != ERROR_SUCCESS)
     {
-      DPRINT1 ("Error: %lu\n", GetLastError());
+      DPRINT1 ("Error: %lu\n", Error);
+      SetLastError((DWORD)Error);
       return FALSE;
     }
 
   dwLength = sizeof(szRawImagePath);
-  if (RegQueryValueExW (hKey,
-			L"ProfileImagePath",
-			NULL,
-			NULL,
-			(LPBYTE)szRawImagePath,
-			&dwLength))
+  Error = RegQueryValueExW (hKey,
+			    L"ProfileImagePath",
+			    NULL,
+			    NULL,
+			    (LPBYTE)szRawImagePath,
+			    &dwLength);
+  if (Error != ERROR_SUCCESS)
     {
-      DPRINT1 ("Error: %lu\n", GetLastError());
+      DPRINT1 ("Error: %lu\n", Error);
       RegCloseKey (hKey);
+      SetLastError((DWORD)Error);
       return FALSE;
     }
 
@@ -792,6 +831,7 @@
 {
   WCHAR szUserHivePath[MAX_PATH];
   UNICODE_STRING SidString;
+  LONG Error;
   DWORD dwLength = sizeof(szUserHivePath) / sizeof(szUserHivePath[0]);
 
   DPRINT ("LoadUserProfileW() called\n");
@@ -842,23 +882,27 @@
 
   DPRINT ("SidString: '%wZ'\n", &SidString);
 
-  if (RegLoadKeyW (HKEY_USERS,
-		   SidString.Buffer,
-		   szUserHivePath))
+  Error = RegLoadKeyW (HKEY_USERS,
+		       SidString.Buffer,
+		       szUserHivePath);
+  if (Error != ERROR_SUCCESS)
     {
-      DPRINT1 ("RegLoadKeyW() failed (Error %ld)\n", GetLastError());
+      DPRINT1 ("RegLoadKeyW() failed (Error %ld)\n", Error);
       RtlFreeUnicodeString (&SidString);
+      SetLastError((DWORD)Error);
       return FALSE;
     }
 
-  if (RegOpenKeyExW (HKEY_USERS,
-		     SidString.Buffer,
-		     0,
-		     KEY_ALL_ACCESS,
-		     (PHKEY)&lpProfileInfo->hProfile))
+  Error = RegOpenKeyExW (HKEY_USERS,
+		         SidString.Buffer,
+		         0,
+		         KEY_ALL_ACCESS,
+		         (PHKEY)&lpProfileInfo->hProfile);
+  if (Error != ERROR_SUCCESS)
     {
-      DPRINT1 ("RegOpenKeyExW() failed (Error %ld)\n", GetLastError());
+      DPRINT1 ("RegOpenKeyExW() failed (Error %ld)\n", Error);
       RtlFreeUnicodeString (&SidString);
+      SetLastError((DWORD)Error);
       return FALSE;
     }
 
@@ -875,6 +919,7 @@
 		   HANDLE hProfile)
 {
   UNICODE_STRING SidString;
+  LONG Error;
 
   DPRINT ("UnloadUserProfile() called\n");
 
@@ -896,11 +941,13 @@
 
   DPRINT ("SidString: '%wZ'\n", &SidString);
 
-  if (RegUnLoadKeyW (HKEY_USERS,
-		     SidString.Buffer))
+  Error = RegUnLoadKeyW (HKEY_USERS,
+		         SidString.Buffer);
+  if (Error != ERROR_SUCCESS)
     {
-      DPRINT1 ("RegUnLoadKeyW() failed (Error %ld)\n", GetLastError());
+      DPRINT1 ("RegUnLoadKeyW() failed (Error %ld)\n", Error);
       RtlFreeUnicodeString (&SidString);
+      SetLastError((DWORD)Error);
       return FALSE;
     }
 

Modified: trunk/reactos/lib/userenv/registry.c
--- trunk/reactos/lib/userenv/registry.c	2006-01-11 23:54:44 UTC (rev 20794)
+++ trunk/reactos/lib/userenv/registry.c	2006-01-12 00:11:14 UTC (rev 20795)
@@ -37,6 +37,21 @@
 CopyKey (HKEY hDstKey,
 	 HKEY hSrcKey)
 {
+  LONG Error;
+
+#if (_WIN32_WINNT >= 0x0600)
+  Error = RegCopyTreeW(hSrcKey,
+                       NULL,
+                       hDstKey);
+  if (Error != ERROR_SUCCESS)
+  {
+      SetLastError((DWORD)Error);
+      return FALSE;
+  }
+
+  return TRUE;
+
+#else
   FILETIME LastWrite;
   DWORD dwSubKeys;
   DWORD dwValues;
@@ -56,20 +71,22 @@
 
   DPRINT ("CopyKey() called \n");
 
-  if (RegQueryInfoKey (hSrcKey,
-		       NULL,
-		       NULL,
-		       NULL,
-		       &dwSubKeys,
-		       &dwMaxSubKeyNameLength,
-		       NULL,
-		       &dwValues,
-		       &dwMaxValueNameLength,
-		       &dwMaxValueLength,
-		       NULL,
-		       NULL))
+  Error = RegQueryInfoKey (hSrcKey,
+		           NULL,
+		           NULL,
+		           NULL,
+		           &dwSubKeys,
+		           &dwMaxSubKeyNameLength,
+		           NULL,
+		           &dwValues,
+		           &dwMaxValueNameLength,
+		           &dwMaxValueLength,
+		           NULL,
+		           NULL);
+  if (Error != ERROR_SUCCESS)
     {
-      DPRINT1 ("RegQueryInfoKey() failed (Error %lu)\n", GetLastError ());
+      DPRINT1 ("RegQueryInfoKey() failed (Error %lu)\n", Error);
+      SetLastError((DWORD)Error);
       return FALSE;
     }
 
@@ -88,56 +105,63 @@
       if (lpNameBuffer == NULL)
 	{
 	  DPRINT1("Buffer allocation failed\n");
+          SetLastError(ERROR_NOT_ENOUGH_MEMORY);
 	  return FALSE;
 	}
 
       for (i = 0; i < dwSubKeys; i++)
 	{
 	  dwSubKeyNameLength = dwMaxSubKeyNameLength;
-	  if (RegEnumKeyExW (hSrcKey,
-			     i,
-			     lpNameBuffer,
-			     &dwSubKeyNameLength,
-			     NULL,
-			     NULL,
-			     NULL,
-			     &LastWrite))
+	  Error = RegEnumKeyExW (hSrcKey,
+			         i,
+			         lpNameBuffer,
+			         &dwSubKeyNameLength,
+			         NULL,
+			         NULL,
+			         NULL,
+			         &LastWrite);
+          if (Error != ERROR_SUCCESS)
 	    {
-	      DPRINT1 ("Subkey enumeration failed (Error %lu)\n", GetLastError());
+	      DPRINT1 ("Subkey enumeration failed (Error %lu)\n", Error);
 	      HeapFree (GetProcessHeap (),
 			0,
 			lpNameBuffer);
+              SetLastError((DWORD)Error);
 	      return FALSE;
 	    }
 
-	  if (RegCreateKeyExW (hDstKey,
-			       lpNameBuffer,
-			       0,
-			       NULL,
-			       REG_OPTION_NON_VOLATILE,
-			       KEY_WRITE,
-			       NULL,
-			       &hDstSubKey,
-			       &dwDisposition))
+	  Error = RegCreateKeyExW (hDstKey,
+			           lpNameBuffer,
+			           0,
+			           NULL,
+			           REG_OPTION_NON_VOLATILE,
+			           KEY_WRITE,
+			           NULL,
+			           &hDstSubKey,
+			           &dwDisposition);
+          if (Error != ERROR_SUCCESS)
 	    {
-	      DPRINT1 ("Subkey creation failed (Error %lu)\n", GetLastError());
+	      DPRINT1 ("Subkey creation failed (Error %lu)\n", Error);
 	      HeapFree (GetProcessHeap (),
 			0,
 			lpNameBuffer);
+              SetLastError((DWORD)Error);
 	      return FALSE;
 	    }
 
-	  if (RegOpenKeyExW (hSrcKey,
-			     lpNameBuffer,
-			     0,
-			     KEY_READ,
-			     &hSrcSubKey))
+	  Error = RegOpenKeyExW (hSrcKey,
+			         lpNameBuffer,
+			         0,
+			         KEY_READ,
+			         &hSrcSubKey);
+          if (Error != ERROR_SUCCESS)
 	    {
-	      DPRINT1 ("Error: %lu\n", GetLastError());
+	      DPRINT1 ("Error: %lu\n", Error);
 	      RegCloseKey (hDstSubKey);
 	      HeapFree (GetProcessHeap (),
 			0,
 			lpNameBuffer);
+              SetLastError((DWORD)Error);
 	      return FALSE;
 	    }
 
@@ -171,6 +195,7 @@
       if (lpNameBuffer == NULL)
 	{
 	  DPRINT1 ("Buffer allocation failed\n");
+          SetLastError(ERROR_NOT_ENOUGH_MEMORY);
 	  return FALSE;
 	}
 
@@ -183,6 +208,7 @@
 	  HeapFree (GetProcessHeap (),
 		    0,
 		    lpNameBuffer);
+          SetLastError(ERROR_NOT_ENOUGH_MEMORY);
 	  return FALSE;
 	}
 
@@ -190,39 +216,43 @@
 	{
 	  dwValueNameLength = dwMaxValueNameLength;
 	  dwValueLength = dwMaxValueLength;
-	  if (RegEnumValueW (hSrcKey,
-			     i,
-			     lpNameBuffer,
-			     &dwValueNameLength,
-			     NULL,
-			     &dwType,
-			     lpDataBuffer,
-			     &dwValueLength))
+	  Error = RegEnumValueW (hSrcKey,
+			         i,
+			         lpNameBuffer,
+			         &dwValueNameLength,
+			         NULL,
+			         &dwType,
[truncated at 1000 lines; 587 more skipped]