Implement DuplicateString and QueryRegistryValue.
Modified: trunk/reactos/include/wine/setupapi.h
Modified: trunk/reactos/lib/setupapi/misc.c
Modified: trunk/reactos/lib/setupapi/setupapi.spec

Modified: trunk/reactos/include/wine/setupapi.h
--- trunk/reactos/include/wine/setupapi.h	2005-01-24 11:53:36 UTC (rev 13247)
+++ trunk/reactos/include/wine/setupapi.h	2005-01-24 14:17:30 UTC (rev 13248)
@@ -613,11 +613,12 @@
 #define SPDRP_MAXIMUM_PROPERTY            0x00000023
 
 
-VOID     WINAPI MyFree( LPVOID lpMem );
-LPVOID   WINAPI MyMalloc( DWORD dwSize );
-LPVOID   WINAPI MyRealloc( LPVOID lpSrc, DWORD dwSize );
+LPWSTR   WINAPI DuplicateString(LPCWSTR lpSrc);
+VOID     WINAPI MyFree(LPVOID lpMem);
+LPVOID   WINAPI MyMalloc(DWORD dwSize);
+LPVOID   WINAPI MyRealloc(LPVOID lpSrc, DWORD dwSize);
 
-LONG     WINAPI QueryRegistryValue( HKEY, LPCWSTR, LPBYTE *, LPDWORD, LPDWORD );
+LONG     WINAPI QueryRegistryValue(HKEY, LPCWSTR, LPBYTE *, LPDWORD, LPDWORD);
 
 void     WINAPI InstallHinfSectionA( HWND hwnd, HINSTANCE handle, LPCSTR cmdline, INT show );
 void     WINAPI InstallHinfSectionW( HWND hwnd, HINSTANCE handle, LPCWSTR cmdline, INT show );

Modified: trunk/reactos/lib/setupapi/misc.c
--- trunk/reactos/lib/setupapi/misc.c	2005-01-24 11:53:36 UTC (rev 13247)
+++ trunk/reactos/lib/setupapi/misc.c	2005-01-24 14:17:30 UTC (rev 13248)
@@ -91,3 +91,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;
+
+    wcscpy(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;
+}

Modified: trunk/reactos/lib/setupapi/setupapi.spec
--- trunk/reactos/lib/setupapi/setupapi.spec	2005-01-24 11:53:36 UTC (rev 13247)
+++ trunk/reactos/lib/setupapi/setupapi.spec	2005-01-24 14:17:30 UTC (rev 13248)
@@ -21,7 +21,7 @@
 @ stub DelimStringToMultiSz
 @ stub DestroyTextFileReadBuffer
 @ stub DoesUserHavePrivilege
-@ stub DuplicateString
+@ stdcall DuplicateString(wstr)
 @ stub EnablePrivilege
 @ stub ExtensionPropSheetPageProc
 @ stub FileExists
@@ -46,7 +46,7 @@
 @ stub OpenAndMapFileForRead
 @ stub OutOfMemory
 @ stub QueryMultiSzValueToArray
-@ stub QueryRegistryValue
+@ stdcall QueryRegistryValue(long wstr ptr ptr ptr)
 @ stub ReadAsciiOrUnicodeTextFile
 @ stub RegistryDelnode
 @ stub RetreiveFileSecurity