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.