1
0
mirror of https://github.com/wine-mirror/wine synced 2024-06-29 06:14:34 +00:00

setupapi: Don't set RequiredSize when SetupDiGetClassDescription* fails.

Discovered while investigating Bug 56551.
This commit is contained in:
Alex Henrie 2024-04-24 22:35:12 -06:00 committed by Alexandre Julliard
parent 987695a427
commit 6e0b07e8ec
2 changed files with 28 additions and 10 deletions

View File

@ -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;
}
/***********************************************************************

View File

@ -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);