Hi
I've tried submitting a patch to wine-patches 3 times now in the past 3 weeks, and not only has it not been applied, but I never even got any feedback.
Please tell me what I am doing wrong.
The latest patch is below.
Thank you Damjan
--- Damjan Jovanovic dj015@yahoo.com wrote:
Date: Thu, 3 Aug 2006 23:49:11 -0700 (PDT) From: Damjan Jovanovic dj015@yahoo.com To: wine-patches@winehq.org Subject: setupapi: test+patch for SetupDiOpenClassRegKeyExW (try 3)
wine's SetupDiOpenClassRegKeyExW returns FALSE instead of INVALID_HANDLE_VALUE in several places, and doesn't brace the GUID string like it should. The test reveals these problems, and the patch fixes them.
ChangeLog:
- Fixed returns values, braced GUID string, and
added a test, for SetupDiOpenClassRegKeyExW.
Damjan Jovanovic (dj015@yahoo.com)
a/dlls/setupapi/tests/Makefile.in 2006-07-10 18:01:08.000000000 +0200 +++ b/dlls/setupapi/tests/Makefile.in 2006-08-04 16:15:05.000000000 +0200 @@ -3,7 +3,7 @@ SRCDIR = @srcdir@ VPATH = @srcdir@ TESTDLL = setupapi.dll -IMPORTS = setupapi kernel32 +IMPORTS = setupapi kernel32 advapi32 rpcrt4
CTESTS = \ devinst.c \ --- a/dlls/setupapi/tests/devinst.c 2006-08-03 10:07:11.000000000 +0200 +++ b/dlls/setupapi/tests/devinst.c 2006-08-04 17:57:57.000000000 +0200 @@ -27,6 +27,7 @@ #include "winuser.h" #include "winreg.h" #include "setupapi.h" +#include "rpc.h"
#include "wine/test.h"
@@ -63,7 +64,85 @@ ok(ret, "SetupDiDestroyDeviceInfoList failed : %ld\n", error); }
+static void test_SetupDiOpenClassRegKeyExW() +{
- GUID guid;
- RPC_STATUS rpcStatus;
- HKEY hkey;
- WCHAR *unbracedGuid;
- WCHAR *bracedGuid;
- rpcStatus = UuidCreate(&guid);
- if (rpcStatus != RPC_S_OK)
- {
ok(FALSE, "failed to generate test guid,
error %ld", rpcStatus);
return;
- }
- /* Check return value for non-existant key */
- hkey = SetupDiOpenClassRegKeyExW(&guid,
KEY_ALL_ACCESS,
DIOCR_INSTALLER, NULL, NULL);
- ok(hkey == INVALID_HANDLE_VALUE,
"invalid return value %p from
SetupDiOpenClassRegKeyExW "
"for non-existant key, expected %p\n",
hkey, INVALID_HANDLE_VALUE);
- rpcStatus = UuidToStringW(&guid,
&unbracedGuid);
- if (rpcStatus != RPC_S_OK)
- {
ok(FALSE, "failed to get string form of
guid, error %ld", rpcStatus);
return;
- }
- bracedGuid = HeapAlloc(GetProcessHeap(), 0,
(lstrlenW(unbracedGuid) + 3) *
sizeof(WCHAR));
- if (bracedGuid != NULL)
- {
HKEY classesKey;
bracedGuid[0] = (WCHAR) '{';
memcpy(&bracedGuid[1], unbracedGuid,
lstrlenW(unbracedGuid) *
sizeof(WCHAR));
bracedGuid[1 + lstrlenW(unbracedGuid)] =
(WCHAR) '}';
bracedGuid[1 + lstrlenW(unbracedGuid) + 1]
= (WCHAR) 0;
SetLastError(0xdeadbeef);
classesKey =
SetupDiOpenClassRegKeyExW(NULL, KEY_ALL_ACCESS,
DIOCR_INSTALLER, NULL, NULL);
ok(classesKey != INVALID_HANDLE_VALUE,
"failed to open the device classes
registry key: error %ld\n",
GetLastError());
if (classesKey != INVALID_HANDLE_VALUE)
{
DWORD ret;
HKEY classKey;
ret = RegCreateKeyW(classesKey,
bracedGuid, &classKey);
if (ret == ERROR_SUCCESS)
{
RegCloseKey(classKey);
SetLastError(0xdeadbeef);
classKey =
SetupDiOpenClassRegKeyExW(&guid, KEY_ALL_ACCESS,
DIOCR_INSTALLER, NULL, NULL);
/* wine does incorrectly return
FALSE, so ... */
ok(classKey != FALSE && classKey !=
INVALID_HANDLE_VALUE,
"failed opening class key,
error %ld\n", GetLastError());
RegCloseKey(classKey);
RegDeleteKeyW(classesKey,
bracedGuid);
}
else
ok(FALSE, "failed creating device
key: error %ld\n", ret);
RegCloseKey(classesKey);
}
HeapFree(GetProcessHeap(), 0, bracedGuid);
- }
- else
ok(FALSE, "failed to allocate memory for
braced guid\n");
- RpcStringFreeW(&unbracedGuid);
+}
START_TEST(devinst) { test_SetupDiCreateDeviceInfoListEx();
- test_SetupDiOpenClassRegKeyExW();
} --- a/dlls/setupapi/devinst.c 2006-08-03 10:07:11.000000000 +0200 +++ b/dlls/setupapi/devinst.c 2006-08-04 18:10:06.000000000 +0200 @@ -1393,6 +1393,7 @@ PVOID Reserved) { LPWSTR lpGuidString;
- LPWSTR lpBracedGuidString; HKEY hClassesKey; HKEY hClassKey; LPCWSTR lpKeyName;
@@ -1433,21 +1434,37 @@ if (UuidToStringW((UUID*)ClassGuid, &lpGuidString) != RPC_S_OK) { RegCloseKey(hClassesKey);
- return FALSE;
- return INVALID_HANDLE_VALUE;
- }
- lpBracedGuidString =
HeapAlloc(GetProcessHeap(), 0,
(strlenW(lpGuidString) + 3) *
sizeof(WCHAR));
- if (lpBracedGuidString == NULL)
- {
RpcStringFreeW(&lpGuidString);
RegCloseKey(hClassesKey);
}return INVALID_HANDLE_VALUE;
- lpBracedGuidString[0] = (WCHAR) '{';
- memcpy(&lpBracedGuidString[1], lpGuidString,
strlenW(lpGuidString) * sizeof(WCHAR));
- lpBracedGuidString[1 + strlenW(lpGuidString)] =
(WCHAR) '}';
- lpBracedGuidString[1 + strlenW(lpGuidString) +
1] = (WCHAR) 0;
RpcStringFreeW(&lpGuidString);
if (RegOpenKeyExW(hClassesKey,
lpGuidString,
{lpBracedGuidString, 0, KEY_ALL_ACCESS, &hClassKey))
- RpcStringFreeW(&lpGuidString);
- HeapFree(GetProcessHeap(), 0, lpBracedGuidString); RegCloseKey(hClassesKey);
- return FALSE;
- return INVALID_HANDLE_VALUE; }
- RpcStringFreeW(&lpGuidString);
- HeapFree(GetProcessHeap(), 0,
lpBracedGuidString); RegCloseKey(hClassesKey);
return hClassKey;
__________________________________________________ Do You Yahoo!? Tired of spam? Yahoo! Mail has the best spam protection around http://mail.yahoo.com
--- a/dlls/setupapi/tests/Makefile.in 2006-07-10 18:01:08.000000000 +0200 +++ b/dlls/setupapi/tests/Makefile.in 2006-08-04 16:15:05.000000000 +0200 @@ -3,7 +3,7 @@ SRCDIR = @srcdir@ VPATH = @srcdir@ TESTDLL = setupapi.dll -IMPORTS = setupapi kernel32 +IMPORTS = setupapi kernel32 advapi32 rpcrt4
CTESTS = \ devinst.c \ --- a/dlls/setupapi/tests/devinst.c 2006-08-03 10:07:11.000000000 +0200 +++ b/dlls/setupapi/tests/devinst.c 2006-08-04 17:57:57.000000000 +0200 @@ -27,6 +27,7 @@ #include "winuser.h" #include "winreg.h" #include "setupapi.h" +#include "rpc.h"
#include "wine/test.h"
@@ -63,7 +64,85 @@ ok(ret, "SetupDiDestroyDeviceInfoList failed : %ld\n", error); }
+static void test_SetupDiOpenClassRegKeyExW() +{ + GUID guid; + RPC_STATUS rpcStatus; + HKEY hkey; + WCHAR *unbracedGuid; + WCHAR *bracedGuid; + + rpcStatus = UuidCreate(&guid); + if (rpcStatus != RPC_S_OK) + { + ok(FALSE, "failed to generate test guid, error %ld", rpcStatus); + return; + } + + /* Check return value for non-existant key */ + hkey = SetupDiOpenClassRegKeyExW(&guid, KEY_ALL_ACCESS, + DIOCR_INSTALLER, NULL, NULL); + ok(hkey == INVALID_HANDLE_VALUE, + "invalid return value %p from SetupDiOpenClassRegKeyExW " + "for non-existant key, expected %p\n", hkey, INVALID_HANDLE_VALUE); + + rpcStatus = UuidToStringW(&guid, &unbracedGuid); + if (rpcStatus != RPC_S_OK) + { + ok(FALSE, "failed to get string form of guid, error %ld", rpcStatus); + return; + } + + bracedGuid = HeapAlloc(GetProcessHeap(), 0, + (lstrlenW(unbracedGuid) + 3) * sizeof(WCHAR)); + if (bracedGuid != NULL) + { + HKEY classesKey; + + bracedGuid[0] = (WCHAR) '{'; + memcpy(&bracedGuid[1], unbracedGuid, + lstrlenW(unbracedGuid) * sizeof(WCHAR)); + bracedGuid[1 + lstrlenW(unbracedGuid)] = (WCHAR) '}'; + bracedGuid[1 + lstrlenW(unbracedGuid) + 1] = (WCHAR) 0; + + SetLastError(0xdeadbeef); + classesKey = SetupDiOpenClassRegKeyExW(NULL, KEY_ALL_ACCESS, + DIOCR_INSTALLER, NULL, NULL); + ok(classesKey != INVALID_HANDLE_VALUE, + "failed to open the device classes registry key: error %ld\n", + GetLastError()); + if (classesKey != INVALID_HANDLE_VALUE) + { + DWORD ret; + HKEY classKey; + ret = RegCreateKeyW(classesKey, bracedGuid, &classKey); + if (ret == ERROR_SUCCESS) + { + RegCloseKey(classKey); + SetLastError(0xdeadbeef); + classKey = SetupDiOpenClassRegKeyExW(&guid, KEY_ALL_ACCESS, + DIOCR_INSTALLER, NULL, NULL); + /* wine does incorrectly return FALSE, so ... */ + ok(classKey != FALSE && classKey != INVALID_HANDLE_VALUE, + "failed opening class key, error %ld\n", GetLastError()); + RegCloseKey(classKey); + RegDeleteKeyW(classesKey, bracedGuid); + } + else + ok(FALSE, "failed creating device key: error %ld\n", ret); + RegCloseKey(classesKey); + } + + HeapFree(GetProcessHeap(), 0, bracedGuid); + } + else + ok(FALSE, "failed to allocate memory for braced guid\n"); + + RpcStringFreeW(&unbracedGuid); +} + START_TEST(devinst) { test_SetupDiCreateDeviceInfoListEx(); + test_SetupDiOpenClassRegKeyExW(); } --- a/dlls/setupapi/devinst.c 2006-08-03 10:07:11.000000000 +0200 +++ b/dlls/setupapi/devinst.c 2006-08-04 18:10:06.000000000 +0200 @@ -1393,6 +1393,7 @@ PVOID Reserved) { LPWSTR lpGuidString; + LPWSTR lpBracedGuidString; HKEY hClassesKey; HKEY hClassKey; LPCWSTR lpKeyName; @@ -1433,21 +1434,37 @@ if (UuidToStringW((UUID*)ClassGuid, &lpGuidString) != RPC_S_OK) { RegCloseKey(hClassesKey); - return FALSE; + return INVALID_HANDLE_VALUE; + } + + lpBracedGuidString = HeapAlloc(GetProcessHeap(), 0, + (strlenW(lpGuidString) + 3) * sizeof(WCHAR)); + if (lpBracedGuidString == NULL) + { + RpcStringFreeW(&lpGuidString); + RegCloseKey(hClassesKey); + return INVALID_HANDLE_VALUE; } + lpBracedGuidString[0] = (WCHAR) '{'; + memcpy(&lpBracedGuidString[1], lpGuidString, + strlenW(lpGuidString) * sizeof(WCHAR)); + lpBracedGuidString[1 + strlenW(lpGuidString)] = (WCHAR) '}'; + lpBracedGuidString[1 + strlenW(lpGuidString) + 1] = (WCHAR) 0; + + RpcStringFreeW(&lpGuidString);
if (RegOpenKeyExW(hClassesKey, - lpGuidString, + lpBracedGuidString, 0, KEY_ALL_ACCESS, &hClassKey)) { - RpcStringFreeW(&lpGuidString); + HeapFree(GetProcessHeap(), 0, lpBracedGuidString); RegCloseKey(hClassesKey); - return FALSE; + return INVALID_HANDLE_VALUE; }
- RpcStringFreeW(&lpGuidString); + HeapFree(GetProcessHeap(), 0, lpBracedGuidString); RegCloseKey(hClassesKey);
return hClassKey;