Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/setupapi/devinst.c | 14 ++++++++++++++ dlls/setupapi/tests/devinst.c | 20 ++++++++++++++++++++ 2 files changed, 34 insertions(+)
diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c index 11c12b125b..25bde67752 100644 --- a/dlls/setupapi/devinst.c +++ b/dlls/setupapi/devinst.c @@ -4297,6 +4297,20 @@ BOOL WINAPI SetupDiBuildDriverInfoList(HDEVINFO devinfo, SP_DEVINFO_DATA *device } }
+ if (device->driver_count) + { + WCHAR classname[MAX_CLASS_NAME_LEN], guidstr[39]; + GUID class; + + if (SetupDiGetINFClassW(device->drivers[0].inf_path, &class, classname, ARRAY_SIZE(classname), NULL)) + { + device_data->ClassGuid = device->class = class; + SETUPDI_GuidToString(&class, guidstr); + RegSetValueExW(device->key, ClassGUID, 0, REG_SZ, (BYTE *)guidstr, sizeof(guidstr)); + RegSetValueExW(device->key, Class, 0, REG_SZ, (BYTE *)classname, strlenW(classname) * sizeof(WCHAR)); + } + } + return TRUE; }
diff --git a/dlls/setupapi/tests/devinst.c b/dlls/setupapi/tests/devinst.c index a717bc08c6..73fdcb1283 100644 --- a/dlls/setupapi/tests/devinst.c +++ b/dlls/setupapi/tests/devinst.c @@ -2125,12 +2125,14 @@ static void test_driver_list(void) SP_DEVINSTALL_PARAMS_A params = {sizeof(params)}; SP_DRVINFO_DATA_A driver = {sizeof(driver)}; SP_DEVINFO_DATA device = {sizeof(device)}; + char buffer[39]; HDEVINFO set; BOOL ret;
static const char inf_data[] = "[Version]\n" "Signature="$Chicago$"\n" "ClassGuid={6a55b5a4-3f65-11db-b704-0011955c2bdb}\n" + "Class=wine test class 1\n" "[Manufacturer]\n" "mfg1=mfg1_key,NT" MYEXT "\n" "mfg2=mfg2_key,NT" MYEXT "\n" @@ -2157,6 +2159,7 @@ static void test_driver_list(void) static const char inf_data_file1[] = "[Version]\n" "Signature="$Chicago$"\n" "ClassGuid={6a55b5a4-3f65-11db-b704-0011955c2bdb}\n" + "Class=wine test class 1\n" "[Manufacturer]\n" "mfg1=mfg1_key,NT" MYEXT ",NT" WOWEXT "\n" "[mfg1_key.nt" MYEXT "]\n" @@ -2167,6 +2170,7 @@ static void test_driver_list(void) static const char inf_data_file2[] = "[Version]\n" "Signature="$Chicago$"\n" "ClassGuid={6a55b5a5-3f65-11db-b704-0011955c2bdb}\n" + "Class=wine test class 2\n" "[Manufacturer]\n" "mfg1=mfg1_key,NT" MYEXT ",NT" WOWEXT "\n" "[mfg1_key.nt" MYEXT "]\n" @@ -2205,6 +2209,14 @@ static void test_driver_list(void) ret = SetupDiBuildDriverInfoList(set, &device, SPDIT_COMPATDRIVER); ok(ret, "Failed to build driver list, error %#x.\n", GetLastError());
+ ok(IsEqualGUID(&device.ClassGuid, &guid), "Got unexpected class %s.\n", wine_dbgstr_guid(&device.ClassGuid)); + ret = SetupDiGetDeviceRegistryPropertyA(set, &device, SPDRP_CLASSGUID, NULL, (BYTE *)buffer, sizeof(buffer), NULL); + ok(ret, "Failed to get class GUID, error %#x.\n", GetLastError()); + ok(!strcasecmp(buffer, "{6a55b5a4-3f65-11db-b704-0011955c2bdb}"), "Got unexpected class %s.\n", buffer); + ret = SetupDiGetDeviceRegistryPropertyA(set, &device, SPDRP_CLASS, NULL, (BYTE *)buffer, sizeof(buffer), NULL); + ok(ret, "Failed to get class GUID, error %#x.\n", GetLastError()); + ok(!strcmp(buffer, "wine test class 1"), "Got unexpected class %s.\n", buffer); + ret = SetupDiEnumDriverInfoA(set, &device, SPDIT_COMPATDRIVER, 0, &driver); ok(ret, "Failed to enumerate drivers, error %#x.\n", GetLastError()); ok(driver.DriverType == SPDIT_COMPATDRIVER, "Got wrong type %#x.\n", driver.DriverType); @@ -2271,6 +2283,14 @@ static void test_driver_list(void) ret = SetupDiBuildDriverInfoList(set, &device, SPDIT_COMPATDRIVER); ok(ret, "Failed to build driver list, error %#x.\n", GetLastError());
+ ok(IsEqualGUID(&device.ClassGuid, &guid), "Got unexpected class %s.\n", wine_dbgstr_guid(&device.ClassGuid)); + ret = SetupDiGetDeviceRegistryPropertyA(set, &device, SPDRP_CLASSGUID, NULL, (BYTE *)buffer, sizeof(buffer), NULL); + ok(ret, "Failed to get class GUID, error %#x.\n", GetLastError()); + ok(!strcasecmp(buffer, "{6a55b5a4-3f65-11db-b704-0011955c2bdb}"), "Got unexpected class %s.\n", buffer); + ret = SetupDiGetDeviceRegistryPropertyA(set, &device, SPDRP_CLASS, NULL, (BYTE *)buffer, sizeof(buffer), NULL); + ok(ret, "Failed to get class GUID, error %#x.\n", GetLastError()); + ok(!strcmp(buffer, "wine test class 1"), "Got unexpected class %s.\n", buffer); + ret = SetupDiEnumDriverInfoA(set, &device, SPDIT_COMPATDRIVER, 0, &driver); ok(ret, "Failed to enumerate drivers, error %#x.\n", GetLastError()); ok(driver.DriverType == SPDIT_COMPATDRIVER, "Got wrong type %#x.\n", driver.DriverType);