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;
+}