https://git.reactos.org/?p=reactos.git;a=commitdiff;h=e6201ea61e435c68f1254…
commit e6201ea61e435c68f125416d94d59ec5a39593b8
Author: Timo Kreuzer <timo.kreuzer(a)reactos.org>
AuthorDate: Thu Dec 14 20:01:29 2023 +0200
Commit: Timo Kreuzer <timo.kreuzer(a)reactos.org>
CommitDate: Mon Dec 18 23:14:14 2023 +0200
[USERENV] Use RegCopyTreeW from advapi32_vista
---
dll/win32/userenv/CMakeLists.txt | 2 +-
dll/win32/userenv/registry.c | 226 +--------------------------------------
2 files changed, 3 insertions(+), 225 deletions(-)
diff --git a/dll/win32/userenv/CMakeLists.txt b/dll/win32/userenv/CMakeLists.txt
index 28b272697b5..8e372f16001 100644
--- a/dll/win32/userenv/CMakeLists.txt
+++ b/dll/win32/userenv/CMakeLists.txt
@@ -24,6 +24,6 @@ add_library(userenv MODULE
set_module_type(userenv win32dll)
target_link_libraries(userenv uuid)
-add_importlibs(userenv advapi32 user32 msvcrt kernel32 ntdll)
+add_importlibs(userenv advapi32 advapi32_vista user32 msvcrt kernel32 ntdll)
add_pch(userenv precomp.h "${PCH_SKIP_SOURCE}")
add_cd_file(TARGET userenv DESTINATION reactos/system32 FOR all)
diff --git a/dll/win32/userenv/registry.c b/dll/win32/userenv/registry.c
index a7fc4fee49c..326832a1164 100644
--- a/dll/win32/userenv/registry.c
+++ b/dll/win32/userenv/registry.c
@@ -29,6 +29,8 @@
#define NDEBUG
#include <debug.h>
+LSTATUS WINAPI RegCopyTreeW(_In_ HKEY, _In_opt_ LPCWSTR, _In_ HKEY);
+
/* FUNCTIONS ***************************************************************/
static
@@ -38,7 +40,6 @@ CopyKey(HKEY hDstKey,
{
LONG Error;
-#if (_WIN32_WINNT >= 0x0600)
Error = RegCopyTreeW(hSrcKey,
NULL,
hDstKey);
@@ -49,229 +50,6 @@ CopyKey(HKEY hDstKey,
}
return TRUE;
-
-#else
- 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");
-
- Error = RegQueryInfoKey(hSrcKey,
- NULL,
- NULL,
- NULL,
- &dwSubKeys,
- &dwMaxSubKeyNameLength,
- NULL,
- &dwValues,
- &dwMaxValueNameLength,
- &dwMaxValueLength,
- NULL,
- NULL);
- if (Error != ERROR_SUCCESS)
- {
- DPRINT1("RegQueryInfoKey() failed (Error %lu)\n", Error);
- SetLastError((DWORD)Error);
- return FALSE;
- }
-
- dwMaxSubKeyNameLength++;
- dwMaxValueNameLength++;
-
- 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");
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- return FALSE;
- }
-
- for (i = 0; i < dwSubKeys; i++)
- {
- dwSubKeyNameLength = dwMaxSubKeyNameLength;
- Error = RegEnumKeyExW(hSrcKey,
- i,
- lpNameBuffer,
- &dwSubKeyNameLength,
- NULL,
- NULL,
- NULL,
- &LastWrite);
- if (Error != ERROR_SUCCESS)
- {
- DPRINT1("Subkey enumeration failed (Error %lu)\n", Error);
- HeapFree(GetProcessHeap(),
- 0,
- lpNameBuffer);
- SetLastError((DWORD)Error);
- return FALSE;
- }
-
- 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", Error);
- HeapFree(GetProcessHeap(),
- 0,
- lpNameBuffer);
- SetLastError((DWORD)Error);
- return FALSE;
- }
-
- Error = RegOpenKeyExW(hSrcKey,
- lpNameBuffer,
- 0,
- KEY_READ,
- &hSrcSubKey);
- if (Error != ERROR_SUCCESS)
- {
- DPRINT1("Error: %lu\n", Error);
- RegCloseKey(hDstSubKey);
- HeapFree(GetProcessHeap(),
- 0,
- lpNameBuffer);
- SetLastError((DWORD)Error);
- 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");
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- return FALSE;
- }
-
- lpDataBuffer = HeapAlloc(GetProcessHeap(),
- 0,
- dwMaxValueLength);
- if (lpDataBuffer == NULL)
- {
- DPRINT1("Buffer allocation failed\n");
- HeapFree(GetProcessHeap(),
- 0,
- lpNameBuffer);
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- return FALSE;
- }
-
- for (i = 0; i < dwValues; i++)
- {
- dwValueNameLength = dwMaxValueNameLength;
- dwValueLength = dwMaxValueLength;
- Error = RegEnumValueW(hSrcKey,
- i,
- lpNameBuffer,
- &dwValueNameLength,
- NULL,
- &dwType,
- lpDataBuffer,
- &dwValueLength);
- if (Error != ERROR_SUCCESS)
- {
- DPRINT1("Error: %lu\n", Error);
- HeapFree(GetProcessHeap(),
- 0,
- lpDataBuffer);
- HeapFree(GetProcessHeap(),
- 0,
- lpNameBuffer);
- SetLastError((DWORD)Error);
- return FALSE;
- }
-
- Error = RegSetValueExW(hDstKey,
- lpNameBuffer,
- 0,
- dwType,
- lpDataBuffer,
- dwValueLength);
- if (Error != ERROR_SUCCESS)
- {
- DPRINT1("Error: %lu\n", Error);
- HeapFree(GetProcessHeap(),
- 0,
- lpDataBuffer);
- HeapFree(GetProcessHeap(),
- 0,
- lpNameBuffer);
- SetLastError((DWORD)Error);
- return FALSE;
- }
- }
-
- HeapFree(GetProcessHeap(),
- 0,
- lpDataBuffer);
-
- HeapFree(GetProcessHeap(),
- 0,
- lpNameBuffer);
- }
-
- DPRINT("CopyKey() done\n");
-
- return TRUE;
-#endif
}