diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c index 019505b01ec..9bbc1afb3ac 100644 --- a/dlls/setupapi/devinst.c +++ b/dlls/setupapi/devinst.c @@ -2119,7 +2119,7 @@ BOOL WINAPI SetupDiGetClassDescriptionExA( { HKEY hKey; DWORD dwLength; - BOOL ret; + LSTATUS ls; hKey = SetupDiOpenClassRegKeyExA(ClassGuid, KEY_ALL_ACCESS, @@ -2133,11 +2133,11 @@ BOOL WINAPI SetupDiGetClassDescriptionExA( } dwLength = ClassDescriptionSize; - ret = !RegQueryValueExA( hKey, NULL, NULL, NULL, - (LPBYTE)ClassDescription, &dwLength ); - if (RequiredSize) *RequiredSize = dwLength; + ls = RegQueryValueExA(hKey, NULL, NULL, NULL, (BYTE *)ClassDescription, &dwLength); RegCloseKey(hKey); - return ret; + if ((!ls || ls == ERROR_MORE_DATA) && RequiredSize) + *RequiredSize = dwLength; + return !ls; } /*********************************************************************** @@ -2153,7 +2153,7 @@ BOOL WINAPI SetupDiGetClassDescriptionExW( { HKEY hKey; DWORD dwLength; - BOOL ret; + LSTATUS ls; hKey = SetupDiOpenClassRegKeyExW(ClassGuid, KEY_ALL_ACCESS, @@ -2167,11 +2167,11 @@ BOOL WINAPI SetupDiGetClassDescriptionExW( } dwLength = ClassDescriptionSize * sizeof(WCHAR); - ret = !RegQueryValueExW( hKey, NULL, NULL, NULL, - (LPBYTE)ClassDescription, &dwLength ); - if (RequiredSize) *RequiredSize = dwLength / sizeof(WCHAR); + ls = RegQueryValueExW(hKey, NULL, NULL, NULL, (BYTE *)ClassDescription, &dwLength); RegCloseKey(hKey); - return ret; + if ((!ls || ls == ERROR_MORE_DATA) && RequiredSize) + *RequiredSize = dwLength / sizeof(WCHAR); + return !ls; } /*********************************************************************** diff --git a/dlls/setupapi/tests/devinst.c b/dlls/setupapi/tests/devinst.c index e54605d6987..1d8df5faea1 100644 --- a/dlls/setupapi/tests/devinst.c +++ b/dlls/setupapi/tests/devinst.c @@ -162,6 +162,8 @@ static void test_install_class(void) '1','1','d','b','-','b','7','0','4','-', '0','0','1','1','9','5','5','c','2','b','d','b','}',0}; char tmpfile[MAX_PATH]; + char buf[32]; + DWORD size; BOOL ret; static const char inf_data[] = @@ -195,12 +197,28 @@ static void test_install_class(void) ok(!ret, "Expected failure.\n"); ok(GetLastError() == ERROR_FILE_NOT_FOUND, "Got unexpected error %#lx.\n", GetLastError()); + size = 123; + SetLastError(0xdeadbeef); + ret = SetupDiGetClassDescriptionA(&guid, buf, sizeof(buf), &size); + ok(!ret, "Expected failure.\n"); + ok(size == 123, "Expected 123, got %ld.\n", size); + todo_wine + ok(GetLastError() == ERROR_NOT_FOUND /* win7 */ || GetLastError() == ERROR_INVALID_CLASS /* win10 */, + "Got unexpected error %#lx.\n", GetLastError()); + /* The next call will succeed. Information is put into the registry but the * location(s) is/are depending on the Windows version. */ ret = SetupDiInstallClassA(NULL, tmpfile, 0, NULL); ok(ret, "Failed to install class, error %#lx.\n", GetLastError()); + SetLastError(0xdeadbeef); + ret = SetupDiGetClassDescriptionA(&guid, buf, sizeof(buf), &size); + ok(ret == TRUE, "Failed to get class description.\n"); + ok(size == sizeof("Wine test devices"), "Expected %Iu, got %lu.\n", sizeof("Wine test devices"), size); + ok(!strcmp(buf, "Wine test devices"), "Got unexpected class description %s.\n", debugstr_a(buf)); + todo_wine ok(!GetLastError(), "Got unexpected error %#lx.\n", GetLastError()); + ret = RegDeleteKeyW(HKEY_LOCAL_MACHINE, classKey); ok(!ret, "Failed to delete class key, error %lu.\n", GetLastError()); DeleteFileA(tmpfile);