Implement DuplicateString and QueryRegistryValue.
diff --git a/dlls/setupapi/misc.c b/dlls/setupapi/misc.c
index 277276a..dfbe49b 100644
--- a/dlls/setupapi/misc.c
+++ b/dlls/setupapi/misc.c
@@ -27,6 +27,8 @@
#include "winreg.h"
#include "setupapi.h"
+#include "wine/unicode.h"
+
/**************************************************************************
* MyFree [SETUPAPI.@]
@@ -91,3 +93,82 @@
return HeapReAlloc(GetProcessHeap(), 0, lpSrc, dwSize);
}
+
+
+/**************************************************************************
+ * DuplicateString [SETUPAPI.@]
+ *
+ * Duplicates a unicode string.
+ *
+ * PARAMS
+ * lpSrc [I] pointer to the unicode string that will be duplicated
+ *
+ * RETURNS
+ * Success: pointer to the duplicated unicode string
+ * Failure: NULL
+ *
+ * NOTES
+ * Call MyFree() to release the duplicated string.
+ */
+
+LPWSTR WINAPI DuplicateString(LPCWSTR lpSrc)
+{
+ LPWSTR lpDst;
+
+ lpDst = MyMalloc((lstrlenW(lpSrc) + 1) * sizeof(WCHAR));
+ if (lpDst == NULL)
+ return NULL;
+
+ strcpyW(lpDst, lpSrc);
+
+ return lpDst;
+}
+
+
+/**************************************************************************
+ * QueryRegistryValue [SETUPAPI.@]
+ *
+ * Retrieves value data from the registry and allocates memory for the
+ * value data.
+ *
+ * PARAMS
+ * hKey [I] Handle of the key to query
+ * lpValueName [I] Name of value under hkey to query
+ * lpData [O] Destination for the values contents,
+ * lpType [O] Destination for the value type
+ * lpcbData [O] Destination for the size of data
+ *
+ * RETURNS
+ * Success: ERROR_SUCCESS
+ * Failure: Otherwise
+ *
+ * NOTES
+ * Use MyFree to release the lpData buffer.
+ */
+
+LONG WINAPI QueryRegistryValue(HKEY hKey,
+ LPCWSTR lpValueName,
+ LPBYTE *lpData,
+ LPDWORD lpType,
+ LPDWORD lpcbData)
+{
+ LONG lError;
+
+ /* Get required buffer size */
+ *lpcbData = 0;
+ lError = RegQueryValueExW(hKey, lpValueName, 0, lpType, NULL, lpcbData);
+ if (lError != ERROR_SUCCESS)
+ return lError;
+
+ /* Allocate buffer */
+ *lpData = MyMalloc(*lpcbData);
+ if (*lpData == NULL)
+ return ERROR_NOT_ENOUGH_MEMORY;
+
+ /* Query registry value */
+ lError = RegQueryValueExW(hKey, lpValueName, 0, lpType, *lpData, lpcbData);
+ if (lError != ERROR_SUCCESS)
+ MyFree(*lpData);
+
+ return lError;
+}