From bba7724b2d628200a5fcc269336044666a2a37b7 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 28 Feb 2004 11:30:59 +0000 Subject: [PATCH] Complete user profile creation. Add LoadUserProfileW() stub. svn path=/trunk/; revision=8436 --- reactos/lib/userenv/profile.c | 25 +++- reactos/lib/userenv/registry.c | 250 +++++++++++++++++++++++++++++++- reactos/lib/userenv/userenv.def | 1 + reactos/lib/userenv/userenv.edf | 1 + 4 files changed, 273 insertions(+), 4 deletions(-) diff --git a/reactos/lib/userenv/profile.c b/reactos/lib/userenv/profile.c index 1ea655aad8e..d7d927a5a4c 100644 --- a/reactos/lib/userenv/profile.c +++ b/reactos/lib/userenv/profile.c @@ -1,4 +1,4 @@ -/* $Id: profile.c,v 1.4 2004/01/23 10:39:22 ekohl Exp $ +/* $Id: profile.c,v 1.5 2004/02/28 11:30:59 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -90,6 +90,7 @@ CreateUserProfileW (PSID Sid, HKEY hKey; NTSTATUS Status; + DPRINT ("CreateUserProfileW() called\n"); if (RegOpenKeyExW (HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList", @@ -269,6 +270,8 @@ CreateUserProfileW (PSID Sid, RtlFreeUnicodeString (&SidString); + DPRINT ("CreateUserProfileW() done\n"); + return TRUE; } @@ -507,4 +510,24 @@ GetUserProfileDirectoryW (HANDLE hToken, return GetDefaultUserProfileDirectoryW (lpProfileDir, lpcchSize); } + +BOOL WINAPI +LoadUserProfileW (HANDLE hToken, + LPPROFILEINFOW lpProfileInfo) +{ + + /* Check profile info */ + if (lpProfileInfo->dwSize != sizeof(PROFILEINFOW) || + lpProfileInfo->lpUserName == NULL || + lpProfileInfo->lpUserName[0] == 0) + { + SetLastError (ERROR_INVALID_PARAMETER); + return FALSE; + } + + /* FIXME: load the profile */ + + return TRUE; +} + /* EOF */ diff --git a/reactos/lib/userenv/registry.c b/reactos/lib/userenv/registry.c index 814d8bb2e91..65f9ec99ebe 100644 --- a/reactos/lib/userenv/registry.c +++ b/reactos/lib/userenv/registry.c @@ -1,4 +1,4 @@ -/* $Id: registry.c,v 1.1 2004/01/16 15:31:53 ekohl Exp $ +/* $Id: registry.c,v 1.2 2004/02/28 11:30:59 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -16,11 +16,255 @@ /* FUNCTIONS ***************************************************************/ -BOOL -CreateUserHive (LPCWSTR lpKeyName) +static BOOL +CopyKey (HKEY hDstKey, + HKEY hSrcKey) { + FILETIME LastWrite; + DWORD dwSubKeys; + DWORD dwValues; + DWORD dwType; + DWORD dwMaxSubKeyNameLength; + DWORD dwSubKeyNameLength; + DWORD dwMaxValueNameLength; + DWORD dwValueNameLength; + DWORD dwMaxValueLength; + DWORD dwValueLength; + DWORD dwDisposition; + DWORD i; + LPWSTR lpNameBuffer; + LPBYTE lpDataBuffer; + HKEY hDstSubKey; + HKEY hSrcSubKey; + + DPRINT ("CopyKey() called \n"); + + if (RegQueryInfoKey (hSrcKey, + NULL, + NULL, + NULL, + &dwSubKeys, + &dwMaxSubKeyNameLength, + NULL, + &dwValues, + &dwMaxValueNameLength, + &dwMaxValueLength, + NULL, + NULL)) + { + DPRINT1("Error: %lu\n", GetLastError ()); + return FALSE; + } + + DPRINT ("dwSubKeys %lu\n", dwSubKeys); + DPRINT ("dwMaxSubKeyNameLength %lu\n", dwMaxSubKeyNameLength); + DPRINT ("dwValues %lu\n", dwValues); + DPRINT ("dwMaxValueNameLength %lu\n", dwMaxValueNameLength); + DPRINT ("dwMaxValueLength %lu\n", dwMaxValueLength); + + /* Copy subkeys */ + if (dwSubKeys != 0) + { + lpNameBuffer = HeapAlloc (GetProcessHeap (), + 0, + dwMaxSubKeyNameLength * sizeof(WCHAR)); + if (lpNameBuffer == NULL) + { + DPRINT1("Buffer allocation failed\n"); + return FALSE; + } + + for (i = 0; i < dwSubKeys; i++) + { + dwSubKeyNameLength = dwMaxSubKeyNameLength; + if (RegEnumKeyExW (hSrcKey, + i, + lpNameBuffer, + &dwSubKeyNameLength, + NULL, + NULL, + NULL, + &LastWrite)) + { + DPRINT1("Subkey enumeration failed (Error %lu)\n", GetLastError()); + HeapFree (GetProcessHeap (), + 0, + lpNameBuffer); + return FALSE; + } + + if (RegCreateKeyExW (hDstKey, + lpNameBuffer, + 0, + NULL, + REG_OPTION_NON_VOLATILE, + KEY_WRITE, + NULL, + &hDstSubKey, + &dwDisposition)) + { + DPRINT1("Subkey creation failed (Error %lu)\n", GetLastError()); + HeapFree (GetProcessHeap (), + 0, + lpNameBuffer); + return FALSE; + } + + if (RegOpenKeyExW (hSrcKey, + lpNameBuffer, + 0, + KEY_READ, + &hSrcSubKey)) + { + DPRINT1("Error: %lu\n", GetLastError()); + RegCloseKey (hDstSubKey); + HeapFree (GetProcessHeap (), + 0, + lpNameBuffer); + return FALSE; + } + + if (!CopyKey (hDstSubKey, + hSrcSubKey)) + { + DPRINT1("Error: %lu\n", GetLastError()); + RegCloseKey (hSrcSubKey); + RegCloseKey (hDstSubKey); + HeapFree (GetProcessHeap (), + 0, + lpNameBuffer); + return FALSE; + } + + RegCloseKey (hSrcSubKey); + RegCloseKey (hDstSubKey); + } + + HeapFree (GetProcessHeap (), + 0, + lpNameBuffer); + } + + /* Copy values */ + if (dwValues != 0) + { + lpNameBuffer = HeapAlloc (GetProcessHeap (), + 0, + dwMaxValueNameLength * sizeof(WCHAR)); + if (lpNameBuffer == NULL) + { + DPRINT1("Buffer allocation failed\n"); + return FALSE; + } + + lpDataBuffer = HeapAlloc (GetProcessHeap (), + 0, + dwMaxValueLength); + if (lpDataBuffer == NULL) + { + DPRINT1("Buffer allocation failed\n"); + HeapFree (GetProcessHeap (), + 0, + lpNameBuffer); + return FALSE; + } + + for (i = 0; i < dwValues; i++) + { + dwValueNameLength = dwMaxValueNameLength; + dwValueLength = dwMaxValueLength; + if (RegEnumValueW (hSrcKey, + i, + lpNameBuffer, + &dwValueNameLength, + NULL, + &dwType, + lpDataBuffer, + &dwValueLength)) + { + DPRINT1("Error: %lu\n", GetLastError()); + HeapFree (GetProcessHeap (), + 0, + lpDataBuffer); + HeapFree (GetProcessHeap (), + 0, + lpNameBuffer); + return FALSE; + } + + if (RegSetValueEx (hDstKey, + lpNameBuffer, + 0, + dwType, + lpDataBuffer, + dwValueLength)) + { + DPRINT1("Error: %lu\n", GetLastError()); + HeapFree (GetProcessHeap (), + 0, + lpDataBuffer); + HeapFree (GetProcessHeap (), + 0, + lpNameBuffer); + return FALSE; + } + } + + HeapFree (GetProcessHeap (), + 0, + lpDataBuffer); + + HeapFree (GetProcessHeap (), + 0, + lpNameBuffer); + } + + DPRINT ("CopyKey() done \n"); return TRUE; } + +BOOL +CreateUserHive (LPCWSTR lpKeyName) +{ + HKEY hDefaultKey; + HKEY hUserKey; + BOOL bResult; + + DPRINT ("CreateUserHive(%S) called\n", lpKeyName); + + + if (RegOpenKeyExW (HKEY_USERS, + L".Default", + 0, + KEY_READ, + &hDefaultKey)) + { + DPRINT1("Error: %lu\n", GetLastError()); + return FALSE; + } + + if (RegOpenKeyExW (HKEY_USERS, + lpKeyName, + 0, + KEY_ALL_ACCESS, + &hUserKey)) + { + DPRINT1("Error: %lu\n", GetLastError()); + RegCloseKey (hDefaultKey); + return FALSE; + } + + bResult = CopyKey (hUserKey, + hDefaultKey); + + RegCloseKey (hUserKey); + RegCloseKey (hDefaultKey); + + DPRINT ("CreateUserHive() done\n"); + + return bResult; +} + /* EOF */ diff --git a/reactos/lib/userenv/userenv.def b/reactos/lib/userenv/userenv.def index 76a7161dc9f..7a44c804dea 100644 --- a/reactos/lib/userenv/userenv.def +++ b/reactos/lib/userenv/userenv.def @@ -6,4 +6,5 @@ GetDefaultUserProfileDirectoryW@8 GetProfilesDirectoryW@8 GetUserProfileDirectoryW@12 CreateUserProfileW@8 +LoadUserProfileW@8 ;EOF diff --git a/reactos/lib/userenv/userenv.edf b/reactos/lib/userenv/userenv.edf index b2db3b48664..806a4469c11 100644 --- a/reactos/lib/userenv/userenv.edf +++ b/reactos/lib/userenv/userenv.edf @@ -6,4 +6,5 @@ GetDefaultUserProfileDirectoryW=GetDefaultUserProfileDirectoryW@8 GetProfilesDirectoryW=GetProfilesDirectoryW@8 GetUserProfileDirectoryW=GetUserProfileDirectoryW@12 CreateUserProfileW=CreateUserProfileW@8 +LoadUserProfileW=LoadUserProfileW@8 ;EOF