https://git.reactos.org/?p=reactos.git;a=commitdiff;h=eef22cc03666b24de5e02…
commit eef22cc03666b24de5e022638125cc06f554b46f
Author: Timo Kreuzer <timo.kreuzer(a)reactos.org>
AuthorDate: Mon Nov 20 21:28:25 2023 +0200
Commit: Timo Kreuzer <timo.kreuzer(a)reactos.org>
CommitDate: Mon Dec 18 23:14:14 2023 +0200
[ADVAPI32] Unify source for vista registry functions
- In advapi32_vista compile the code from advapi32/reg/reg.c
- Export RegCopyTreeW from advapi32_vista
---
dll/win32/advapi32/reg/reg.c | 199 ++++++++++++++++++++++++++++
dll/win32/advapi32_vista/CMakeLists.txt | 15 ++-
dll/win32/advapi32_vista/DllMain.c | 11 ++
dll/win32/advapi32_vista/RegDeleteTree.c | 102 --------------
dll/win32/advapi32_vista/RegLoadMUIString.c | 195 ---------------------------
dll/win32/advapi32_vista/RegSetKeyValue.c | 25 ----
6 files changed, 219 insertions(+), 328 deletions(-)
diff --git a/dll/win32/advapi32/reg/reg.c b/dll/win32/advapi32/reg/reg.c
index 1e06f67a919..38a434fddd7 100644
--- a/dll/win32/advapi32/reg/reg.c
+++ b/dll/win32/advapi32/reg/reg.c
@@ -322,6 +322,7 @@ OpenCurrentConfigKey (PHANDLE KeyHandle)
&Attributes);
}
+#ifndef _ADVAPI32_VISTA_
/************************************************************************
* RegDisablePredefinedCache
@@ -444,6 +445,7 @@ RegCloseKey(HKEY hKey)
return ERROR_SUCCESS;
}
+#endif // _ADVAPI32_VISTA_
static NTSTATUS
RegpCopyTree(IN HKEY hKeySrc,
@@ -803,6 +805,7 @@ Cleanup2:
return ERROR_SUCCESS;
}
+#ifndef _ADVAPI32_VISTA_
/************************************************************************
* RegCopyTreeA
@@ -1734,6 +1737,7 @@ Cleanup:
}
#endif
+#endif // _ADVAPI32_VISTA_
/************************************************************************
* RegDeleteTreeW
@@ -1856,6 +1860,7 @@ RegDeleteTreeA(IN HKEY hKey,
return Ret;
}
+#ifndef _ADVAPI32_VISTA_
/************************************************************************
* RegDisableReflectionKey
@@ -2161,6 +2166,7 @@ RegGetValueA(HKEY hKey,
return ret;
}
+#endif // _ADVAPI32_VISTA_
/************************************************************************
* RegSetKeyValueW
@@ -2231,6 +2237,7 @@ Cleanup:
return Ret;
}
+#ifndef _ADVAPI32_VISTA_
/************************************************************************
* RegSetKeyValueA
@@ -5136,4 +5143,196 @@ RegUnLoadKeyW(HKEY hKey,
return ERROR_SUCCESS;
}
+#endif // _ADVAPI32_VISTA_
+
+/******************************************************************************
+ * load_string [Internal]
+ *
+ * This is basically a copy of user32/resource.c's LoadStringW. Necessary to
+ * avoid importing user32, which is higher level than advapi32. Helper for
+ * RegLoadMUIString.
+ */
+static int load_string(HINSTANCE hModule, UINT resId, LPWSTR pwszBuffer, INT cMaxChars)
+{
+ HGLOBAL hMemory;
+ HRSRC hResource;
+ WCHAR* pString;
+ int idxString;
+
+ /* Negative values have to be inverted. */
+ if (HIWORD(resId) == 0xffff)
+ resId = (UINT)(-((INT)resId));
+
+ /* Load the resource into memory and get a pointer to it. */
+ hResource = FindResourceW(hModule, MAKEINTRESOURCEW(LOWORD(resId >> 4) + 1),
(LPWSTR)RT_STRING);
+ if (!hResource) return 0;
+ hMemory = LoadResource(hModule, hResource);
+ if (!hMemory) return 0;
+ pString = LockResource(hMemory);
+
+ /* Strings are length-prefixed. Lowest nibble of resId is an index. */
+ idxString = resId & 0xf;
+ while (idxString--) pString += *pString + 1;
+
+ /* If no buffer is given, return length of the string. */
+ if (!pwszBuffer) return *pString;
+
+ /* Else copy over the string, respecting the buffer size. */
+ cMaxChars = (*pString < cMaxChars) ? *pString : (cMaxChars - 1);
+ if (cMaxChars >= 0)
+ {
+ memcpy(pwszBuffer, pString + 1, cMaxChars * sizeof(WCHAR));
+ pwszBuffer[cMaxChars] = L'\0';
+ }
+
+ return cMaxChars;
+}
+
+/************************************************************************
+ * RegLoadMUIStringW
+ *
+ * @implemented
+ */
+LONG WINAPI
+RegLoadMUIStringW(
+ IN HKEY hKey,
+ IN LPCWSTR pszValue OPTIONAL,
+ OUT LPWSTR pszOutBuf,
+ IN DWORD cbOutBuf,
+ OUT LPDWORD pcbData OPTIONAL,
+ IN DWORD Flags,
+ IN LPCWSTR pszDirectory OPTIONAL)
+{
+ DWORD dwValueType, cbData;
+ LPWSTR pwszTempBuffer = NULL, pwszExpandedBuffer = NULL;
+ LONG result;
+
+ /* Parameter sanity checks. */
+ if (!hKey || !pszOutBuf)
+ return ERROR_INVALID_PARAMETER;
+
+ if (pszDirectory && *pszDirectory)
+ {
+ FIXME("BaseDir parameter not yet supported!\n");
+ return ERROR_INVALID_PARAMETER;
+ }
+
+ /* Check for value existence and correctness of it's type, allocate a buffer and
load it. */
+ result = RegQueryValueExW(hKey, pszValue, NULL, &dwValueType, NULL,
&cbData);
+ if (result != ERROR_SUCCESS) goto cleanup;
+ if (!(dwValueType == REG_SZ || dwValueType == REG_EXPAND_SZ) || !cbData)
+ {
+ result = ERROR_FILE_NOT_FOUND;
+ goto cleanup;
+ }
+ pwszTempBuffer = HeapAlloc(GetProcessHeap(), 0, cbData);
+ if (!pwszTempBuffer)
+ {
+ result = ERROR_NOT_ENOUGH_MEMORY;
+ goto cleanup;
+ }
+ result = RegQueryValueExW(hKey, pszValue, NULL, &dwValueType,
(LPBYTE)pwszTempBuffer, &cbData);
+ if (result != ERROR_SUCCESS) goto cleanup;
+
+ /* Expand environment variables, if appropriate, or copy the original string over.
*/
+ if (dwValueType == REG_EXPAND_SZ)
+ {
+ cbData = ExpandEnvironmentStringsW(pwszTempBuffer, NULL, 0) * sizeof(WCHAR);
+ if (!cbData) goto cleanup;
+ pwszExpandedBuffer = HeapAlloc(GetProcessHeap(), 0, cbData);
+ if (!pwszExpandedBuffer)
+ {
+ result = ERROR_NOT_ENOUGH_MEMORY;
+ goto cleanup;
+ }
+ ExpandEnvironmentStringsW(pwszTempBuffer, pwszExpandedBuffer, cbData);
+ }
+ else
+ {
+ pwszExpandedBuffer = HeapAlloc(GetProcessHeap(), 0, cbData);
+ memcpy(pwszExpandedBuffer, pwszTempBuffer, cbData);
+ }
+
+ /* If the value references a resource based string, parse the value and load the
string.
+ * Else just copy over the original value. */
+ result = ERROR_SUCCESS;
+ if (*pwszExpandedBuffer != L'@') /* '@' is the prefix for resource
based string entries. */
+ {
+ lstrcpynW(pszOutBuf, pwszExpandedBuffer, cbOutBuf / sizeof(WCHAR));
+ }
+ else
+ {
+ WCHAR* pComma = wcsrchr(pwszExpandedBuffer, L',');
+ UINT uiStringId;
+ HMODULE hModule;
+
+ /* Format of the expanded value is 'path_to_dll,-resId' */
+ if (!pComma || pComma[1] != L'-')
+ {
+ result = ERROR_BADKEY;
+ goto cleanup;
+ }
+
+ uiStringId = _wtoi(pComma + 2);
+ *pComma = L'\0';
+
+ hModule = LoadLibraryExW(pwszExpandedBuffer + 1, NULL,
LOAD_LIBRARY_AS_DATAFILE);
+ if (!hModule || !load_string(hModule, uiStringId, pszOutBuf, cbOutBuf /
sizeof(WCHAR)))
+ result = ERROR_BADKEY;
+ FreeLibrary(hModule);
+ }
+
+cleanup:
+ HeapFree(GetProcessHeap(), 0, pwszTempBuffer);
+ HeapFree(GetProcessHeap(), 0, pwszExpandedBuffer);
+ return result;
+}
+
+/************************************************************************
+ * RegLoadMUIStringA
+ *
+ * @implemented
+ */
+LONG WINAPI
+RegLoadMUIStringA(
+ IN HKEY hKey,
+ IN LPCSTR pszValue OPTIONAL,
+ OUT LPSTR pszOutBuf,
+ IN DWORD cbOutBuf,
+ OUT LPDWORD pcbData OPTIONAL,
+ IN DWORD Flags,
+ IN LPCSTR pszDirectory OPTIONAL)
+{
+ UNICODE_STRING valueW, baseDirW;
+ WCHAR* pwszBuffer;
+ DWORD cbData = cbOutBuf * sizeof(WCHAR);
+ LONG result;
+
+ valueW.Buffer = baseDirW.Buffer = pwszBuffer = NULL;
+ if (!RtlCreateUnicodeStringFromAsciiz(&valueW, pszValue) ||
+ !RtlCreateUnicodeStringFromAsciiz(&baseDirW, pszDirectory) ||
+ !(pwszBuffer = HeapAlloc(GetProcessHeap(), 0, cbData)))
+ {
+ result = ERROR_NOT_ENOUGH_MEMORY;
+ goto cleanup;
+ }
+
+ result = RegLoadMUIStringW(hKey, valueW.Buffer, pwszBuffer, cbData, NULL, Flags,
+ baseDirW.Buffer);
+
+ if (result == ERROR_SUCCESS)
+ {
+ cbData = WideCharToMultiByte(CP_ACP, 0, pwszBuffer, -1, pszOutBuf, cbOutBuf,
NULL, NULL);
+ if (pcbData)
+ *pcbData = cbData;
+ }
+
+cleanup:
+ HeapFree(GetProcessHeap(), 0, pwszBuffer);
+ RtlFreeUnicodeString(&baseDirW);
+ RtlFreeUnicodeString(&valueW);
+
+ return result;
+}
+
/* EOF */
diff --git a/dll/win32/advapi32_vista/CMakeLists.txt
b/dll/win32/advapi32_vista/CMakeLists.txt
index ab6e406876a..3af7909efb7 100644
--- a/dll/win32/advapi32_vista/CMakeLists.txt
+++ b/dll/win32/advapi32_vista/CMakeLists.txt
@@ -2,19 +2,22 @@
remove_definitions(-D_WIN32_WINNT=0x502 -DWINVER=0x502)
add_definitions(-D_WIN32_WINNT=0x600 -DWINVER=0x600)
-add_definitions(-D_ADVAPI32_)
+add_definitions(-D_ADVAPI32_ -D_ADVAPI32_VISTA_)
spec2def(advapi32_vista.dll advapi32_vista.spec ADD_IMPORTLIB)
+include_directories(
+ ../advapi32
+ ${CMAKE_CURRENT_BINARY_DIR}/../advapi32
+)
+
list(APPEND SOURCE
DllMain.c
- RegDeleteTree.c
- RegSetKeyValue.c
- RegLoadMUIString.c
+ ../advapi32/reg/reg.c
${CMAKE_CURRENT_BINARY_DIR}/advapi32_vista.def)
add_library(advapi32_vista MODULE ${SOURCE})
set_module_type(advapi32_vista win32dll ENTRYPOINT DllMain 12)
-target_link_libraries(advapi32_vista wine)
+target_link_libraries(advapi32_vista wine ${PSEH_LIB})
add_importlibs(advapi32_vista advapi32 kernel32 ntdll)
-add_dependencies(advapi32_vista psdk)
+add_dependencies(advapi32_vista psdk advapi32)
add_cd_file(TARGET advapi32_vista DESTINATION reactos/system32 FOR all)
diff --git a/dll/win32/advapi32_vista/DllMain.c b/dll/win32/advapi32_vista/DllMain.c
index 0902d8455d7..6ed5bb68a67 100644
--- a/dll/win32/advapi32_vista/DllMain.c
+++ b/dll/win32/advapi32_vista/DllMain.c
@@ -1,6 +1,9 @@
#include "advapi32_vista.h"
+BOOL
+RegInitialize(VOID);
+
BOOL
WINAPI
DllMain(HANDLE hDll,
@@ -9,6 +12,14 @@ DllMain(HANDLE hDll,
{
/* For now, there isn't much to do */
if (dwReason == DLL_PROCESS_ATTACH)
+ {
DisableThreadLibraryCalls(hDll);
+
+ if (!RegInitialize())
+ {
+ return FALSE;
+ }
+ }
+
return TRUE;
}
diff --git a/dll/win32/advapi32_vista/RegDeleteTree.c
b/dll/win32/advapi32_vista/RegDeleteTree.c
deleted file mode 100644
index 0a9f6192fb7..00000000000
--- a/dll/win32/advapi32_vista/RegDeleteTree.c
+++ /dev/null
@@ -1,102 +0,0 @@
-
-#include "advapi32_vista.h"
-
-/* heap allocation helpers */
-static void *heap_alloc( size_t len ) __WINE_ALLOC_SIZE(1);
-static inline void *heap_alloc( size_t len )
-{
- return HeapAlloc( GetProcessHeap(), 0, len );
-}
-
-static inline BOOL heap_free( void *mem )
-{
- return HeapFree( GetProcessHeap(), 0, mem );
-}
-
-/* Taken from Wine advapi32/registry.c */
-
-/******************************************************************************
- * RegDeleteTreeW [ADVAPI32.@]
- *
- */
-LSTATUS WINAPI RegDeleteTreeW(HKEY hKey, LPCWSTR lpszSubKey)
-{
- LONG ret;
- DWORD dwMaxSubkeyLen, dwMaxValueLen;
- DWORD dwMaxLen, dwSize;
- WCHAR szNameBuf[MAX_PATH], *lpszName = szNameBuf;
- HKEY hSubKey = hKey;
-
- if(lpszSubKey)
- {
- ret = RegOpenKeyExW(hKey, lpszSubKey, 0, KEY_READ, &hSubKey);
- if (ret) return ret;
- }
-
- /* Get highest length for keys, values */
- ret = RegQueryInfoKeyW(hSubKey, NULL, NULL, NULL, NULL,
- &dwMaxSubkeyLen, NULL, NULL, &dwMaxValueLen, NULL, NULL, NULL);
- if (ret) goto cleanup;
-
- dwMaxSubkeyLen++;
- dwMaxValueLen++;
- dwMaxLen = max(dwMaxSubkeyLen, dwMaxValueLen);
- if (dwMaxLen > sizeof(szNameBuf)/sizeof(WCHAR))
- {
- /* Name too big: alloc a buffer for it */
- if (!(lpszName = heap_alloc( dwMaxLen*sizeof(WCHAR))))
- {
- ret = ERROR_NOT_ENOUGH_MEMORY;
- goto cleanup;
- }
- }
-
-
- /* Recursively delete all the subkeys */
- while (TRUE)
- {
- dwSize = dwMaxLen;
- if (RegEnumKeyExW(hSubKey, 0, lpszName, &dwSize, NULL,
- NULL, NULL, NULL)) break;
-
- ret = RegDeleteTreeW(hSubKey, lpszName);
- if (ret) goto cleanup;
- }
-
- if (lpszSubKey)
- ret = RegDeleteKeyW(hKey, lpszSubKey);
- else
- while (TRUE)
- {
- dwSize = dwMaxLen;
- if (RegEnumValueW(hKey, 0, lpszName, &dwSize,
- NULL, NULL, NULL, NULL)) break;
-
- ret = RegDeleteValueW(hKey, lpszName);
- if (ret) goto cleanup;
- }
-
-cleanup:
- /* Free buffer if allocated */
- if (lpszName != szNameBuf)
- heap_free( lpszName);
- if(lpszSubKey)
- RegCloseKey(hSubKey);
- return ret;
-}
-
-/******************************************************************************
- * RegDeleteTreeA [ADVAPI32.@]
- *
- */
-LSTATUS WINAPI RegDeleteTreeA(HKEY hKey, LPCSTR lpszSubKey)
-{
- LONG ret;
- UNICODE_STRING lpszSubKeyW;
-
- if (lpszSubKey) RtlCreateUnicodeStringFromAsciiz( &lpszSubKeyW, lpszSubKey);
- else lpszSubKeyW.Buffer = NULL;
- ret = RegDeleteTreeW( hKey, lpszSubKeyW.Buffer);
- RtlFreeUnicodeString( &lpszSubKeyW );
- return ret;
-}
diff --git a/dll/win32/advapi32_vista/RegLoadMUIString.c
b/dll/win32/advapi32_vista/RegLoadMUIString.c
deleted file mode 100644
index 8d80949660c..00000000000
--- a/dll/win32/advapi32_vista/RegLoadMUIString.c
+++ /dev/null
@@ -1,195 +0,0 @@
-#include "advapi32_vista.h"
-
-#include <winuser.h>
-#include <wine/debug.h>
-#include <wine/unicode.h>
-
-WINE_DEFAULT_DEBUG_CHANNEL(reg);
-
-/******************************************************************************
- * load_string [Internal]
- *
- * This is basically a copy of user32/resource.c's LoadStringW. Necessary to
- * avoid importing user32, which is higher level than advapi32. Helper for
- * RegLoadMUIString.
- */
-static int load_string(HINSTANCE hModule, UINT resId, LPWSTR pwszBuffer, INT cMaxChars)
-{
- HGLOBAL hMemory;
- HRSRC hResource;
- WCHAR *pString;
- int idxString;
-
- /* Negative values have to be inverted. */
- if (HIWORD(resId) == 0xffff)
- resId = (UINT)(-((INT)resId));
-
- /* Load the resource into memory and get a pointer to it. */
- hResource = FindResourceW(hModule, MAKEINTRESOURCEW(LOWORD(resId >> 4) + 1),
(LPWSTR)RT_STRING);
- if (!hResource) return 0;
- hMemory = LoadResource(hModule, hResource);
- if (!hMemory) return 0;
- pString = LockResource(hMemory);
-
- /* Strings are length-prefixed. Lowest nibble of resId is an index. */
- idxString = resId & 0xf;
- while (idxString--) pString += *pString + 1;
-
- /* If no buffer is given, return length of the string. */
- if (!pwszBuffer) return *pString;
-
- /* Else copy over the string, respecting the buffer size. */
- cMaxChars = (*pString < cMaxChars) ? *pString : (cMaxChars - 1);
- if (cMaxChars >= 0)
- {
- memcpy(pwszBuffer, pString+1, cMaxChars * sizeof(WCHAR));
- pwszBuffer[cMaxChars] = L'\0';
- }
-
- return cMaxChars;
-}
-
-/************************************************************************
- * RegLoadMUIStringW
- *
- * @implemented
- */
-LONG WINAPI
-RegLoadMUIStringW(IN HKEY hKey,
- IN LPCWSTR pszValue OPTIONAL,
- OUT LPWSTR pszOutBuf,
- IN DWORD cbOutBuf,
- OUT LPDWORD pcbData OPTIONAL,
- IN DWORD Flags,
- IN LPCWSTR pszDirectory OPTIONAL)
-{
- DWORD dwValueType, cbData;
- LPWSTR pwszTempBuffer = NULL, pwszExpandedBuffer = NULL;
- LONG result;
-
- /* Parameter sanity checks. */
- if (!hKey || !pszOutBuf)
- return ERROR_INVALID_PARAMETER;
-
- if (pszDirectory && *pszDirectory)
- {
- FIXME("BaseDir parameter not yet supported!\n");
- return ERROR_INVALID_PARAMETER;
- }
-
- /* Check for value existence and correctness of it's type, allocate a buffer and
load it. */
- result = RegQueryValueExW(hKey, pszValue, NULL, &dwValueType, NULL,
&cbData);
- if (result != ERROR_SUCCESS) goto cleanup;
- if (!(dwValueType == REG_SZ || dwValueType == REG_EXPAND_SZ) || !cbData)
- {
- result = ERROR_FILE_NOT_FOUND;
- goto cleanup;
- }
- pwszTempBuffer = HeapAlloc(GetProcessHeap(), 0, cbData);
- if (!pwszTempBuffer)
- {
- result = ERROR_NOT_ENOUGH_MEMORY;
- goto cleanup;
- }
- result = RegQueryValueExW(hKey, pszValue, NULL, &dwValueType,
(LPBYTE)pwszTempBuffer, &cbData);
- if (result != ERROR_SUCCESS) goto cleanup;
-
- /* Expand environment variables, if appropriate, or copy the original string over.
*/
- if (dwValueType == REG_EXPAND_SZ)
- {
- cbData = ExpandEnvironmentStringsW(pwszTempBuffer, NULL, 0) * sizeof(WCHAR);
- if (!cbData) goto cleanup;
- pwszExpandedBuffer = HeapAlloc(GetProcessHeap(), 0, cbData);
- if (!pwszExpandedBuffer)
- {
- result = ERROR_NOT_ENOUGH_MEMORY;
- goto cleanup;
- }
- ExpandEnvironmentStringsW(pwszTempBuffer, pwszExpandedBuffer, cbData);
- }
- else
- {
- pwszExpandedBuffer = HeapAlloc(GetProcessHeap(), 0, cbData);
- memcpy(pwszExpandedBuffer, pwszTempBuffer, cbData);
- }
-
- /* If the value references a resource based string, parse the value and load the
string.
- * Else just copy over the original value. */
- result = ERROR_SUCCESS;
- if (*pwszExpandedBuffer != L'@') /* '@' is the prefix for resource
based string entries. */
- {
- lstrcpynW(pszOutBuf, pwszExpandedBuffer, cbOutBuf / sizeof(WCHAR));
- }
- else
- {
- WCHAR *pComma = wcsrchr(pwszExpandedBuffer, L',');
- UINT uiStringId;
- HMODULE hModule;
-
- /* Format of the expanded value is 'path_to_dll,-resId' */
- if (!pComma || pComma[1] != L'-')
- {
- result = ERROR_BADKEY;
- goto cleanup;
- }
-
- uiStringId = _wtoi(pComma+2);
- *pComma = L'\0';
-
- hModule = LoadLibraryExW(pwszExpandedBuffer + 1, NULL,
LOAD_LIBRARY_AS_DATAFILE);
- if (!hModule || !load_string(hModule, uiStringId, pszOutBuf, cbOutBuf /
sizeof(WCHAR)))
- result = ERROR_BADKEY;
- FreeLibrary(hModule);
- }
-
-cleanup:
- HeapFree(GetProcessHeap(), 0, pwszTempBuffer);
- HeapFree(GetProcessHeap(), 0, pwszExpandedBuffer);
- return result;
-}
-
-/************************************************************************
- * RegLoadMUIStringA
- *
- * @implemented
- */
-LONG WINAPI
-RegLoadMUIStringA(IN HKEY hKey,
- IN LPCSTR pszValue OPTIONAL,
- OUT LPSTR pszOutBuf,
- IN DWORD cbOutBuf,
- OUT LPDWORD pcbData OPTIONAL,
- IN DWORD Flags,
- IN LPCSTR pszDirectory OPTIONAL)
-{
- UNICODE_STRING valueW, baseDirW;
- WCHAR *pwszBuffer;
- DWORD cbData = cbOutBuf * sizeof(WCHAR);
- LONG result;
-
- valueW.Buffer = baseDirW.Buffer = pwszBuffer = NULL;
- if (!RtlCreateUnicodeStringFromAsciiz(&valueW, pszValue) ||
- !RtlCreateUnicodeStringFromAsciiz(&baseDirW, pszDirectory) ||
- !(pwszBuffer = HeapAlloc(GetProcessHeap(), 0, cbData)))
- {
- result = ERROR_NOT_ENOUGH_MEMORY;
- goto cleanup;
- }
-
- result = RegLoadMUIStringW(hKey, valueW.Buffer, pwszBuffer, cbData, NULL, Flags,
- baseDirW.Buffer);
-
- if (result == ERROR_SUCCESS)
- {
- cbData = WideCharToMultiByte(CP_ACP, 0, pwszBuffer, -1, pszOutBuf, cbOutBuf,
NULL, NULL);
- if (pcbData)
- *pcbData = cbData;
- }
-
-cleanup:
- HeapFree(GetProcessHeap(), 0, pwszBuffer);
- RtlFreeUnicodeString(&baseDirW);
- RtlFreeUnicodeString(&valueW);
-
- return result;
-}
diff --git a/dll/win32/advapi32_vista/RegSetKeyValue.c
b/dll/win32/advapi32_vista/RegSetKeyValue.c
deleted file mode 100644
index 8701eb87df4..00000000000
--- a/dll/win32/advapi32_vista/RegSetKeyValue.c
+++ /dev/null
@@ -1,25 +0,0 @@
-
-#include "advapi32_vista.h"
-
-/* Taken from Wine advapi32/registry.c */
-
-/******************************************************************************
- * RegSetKeyValueW [ADVAPI32.@]
- */
-LONG WINAPI RegSetKeyValueW( HKEY hkey, LPCWSTR subkey, LPCWSTR name, DWORD type, const
void *data, DWORD len )
-{
- HKEY hsubkey = NULL;
- DWORD ret;
-
- //TRACE("(%p,%s,%s,%d,%p,%d)\n", hkey, debugstr_w(subkey),
debugstr_w(name), type, data, len );
-
- if (subkey && subkey[0]) /* need to create the subkey */
- {
- if ((ret = RegCreateKeyW( hkey, subkey, &hsubkey )) != ERROR_SUCCESS) return
ret;
- hkey = hsubkey;
- }
-
- ret = RegSetValueExW( hkey, name, 0, type, (const BYTE*)data, len );
- if (hsubkey) RegCloseKey( hsubkey );
- return ret;
-}