Should I give up?
Vitaliy Margolen
wine-devel at kievinfo.com
Wed Sep 6 08:07:51 CDT 2006
Damjan Jovanovic wrote:
> Hi
>
> My work on the still image system for wine has
> highlighted a bug in setupapi's
> SetupDiOpenClassRegKeyExW(). In short, the registry
> keys for device classes have the form
>
> HKEY_LOCAL_MACHINE\System\CurrentControlSet\
> Class\{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
>
> while wine incorrectly tries to open
> HKEY_LOCAL_MACHINE\System\CurrentControlSet\
> Class\xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
> @@ -1453,21 +1454,30 @@
> if (UuidToStringW((UUID*)ClassGuid, &lpGuidString) != RPC_S_OK)
> {
> RegCloseKey(hClassesKey);
> - return FALSE;
> + return INVALID_HANDLE_VALUE;
> }
Please send this as a separate patch.
>
> + lpBracedGuidString = (LPWSTR) HeapAlloc(GetProcessHeap(), 0,
> + (1 + strlenW(lpGuidString) + 1 + 1) * sizeof(WCHAR));
> + 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);
> +
All that looks messy and way too many calls to strlenW for no reason. Length of GUID
string is known and hard-coded to 36.
lpBracedGuidString = HeapAlloc(GetProcessHeap(), 0, (36 +1+2) * sizeof(WCHAR));
memcpy(lpBracedGuidString + 1, lpGuidString, 36 * sizeof(WCHAR));
lpBracedGuidString[ 0] = '{';
lpBracedGuidString[37] = '}';
lpBracedGuidString[38] = 0;
RpcStringFreeW(&lpGuidString);
> @@ -43,6 +45,7 @@
> {
> pSetupDiCreateDeviceInfoListExW = (void *)GetProcAddress(hSetupAPI, "SetupDiCreateDeviceInfoListExW");
> pSetupDiDestroyDeviceInfoList = (void *)GetProcAddress(hSetupAPI, "SetupDiDestroyDeviceInfoList");
> + pSetupDiOpenClassRegKeyExW = (void *)GetProcAddress(hSetupAPI, "SetupDiOpenClassRegKeyExW");
> }
Please try to test Ascii variants instead of Unicode. This way we will be testing both.
>
> + rpcStatus = UuidCreate(&guid);
> + if (rpcStatus != RPC_S_OK)
> + {
> + ok(FALSE, "failed to generate test guid, error %ld", rpcStatus);
> + return;
> + }
This is not correct. You shouldn't use ok() this way. Also it will already print "Test failed:"
so no need to repeat it again. Instead write something like:
rpcStatus = UuidCreate(&guid);
ok(rpcStatus == RPC_S_OK, "error %ld", rpcStatus);
if (rpcStatus != RPC_S_OK) return;
> + /* Check return value for non-existant key */
> + hkey = pSetupDiOpenClassRegKeyExW(&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);
There is no need for such a long error message. Simple "got %p\n" would be enough.
Also don't forget to test LastError as well.
> + ok(FALSE, "failed creating device key: error %ld\n", ret);
Please use trace() instead.
Vitaliy.
More information about the wine-devel
mailing list