[PATCH 6/7] setupapi: Set the device class in SetupDiBuildDriverInfoList().

Zebediah Figura z.figura12 at gmail.com
Mon May 20 23:55:48 CDT 2019


Signed-off-by: Zebediah Figura <z.figura12 at 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);
-- 
2.21.0




More information about the wine-devel mailing list