[PATCH 6/6] setupapi/tests: Add tests for SetupDiInstallDeviceInterfaces().

Zebediah Figura z.figura12 at gmail.com
Wed May 22 22:55:58 CDT 2019


---
 dlls/setupapi/tests/devinst.c | 120 ++++++++++++++++++++++++++++++++++
 1 file changed, 120 insertions(+)

diff --git a/dlls/setupapi/tests/devinst.c b/dlls/setupapi/tests/devinst.c
index 4e3ec7894a..fc912d8180 100644
--- a/dlls/setupapi/tests/devinst.c
+++ b/dlls/setupapi/tests/devinst.c
@@ -37,6 +37,7 @@
 /* This is a unique guid for testing purposes */
 static GUID guid = {0x6a55b5a4, 0x3f65, 0x11db, {0xb7,0x04,0x00,0x11,0x95,0x5c,0x2b,0xdb}};
 static GUID guid2 = {0x6a55b5a5, 0x3f65, 0x11db, {0xb7,0x04,0x00,0x11,0x95,0x5c,0x2b,0xdb}};
+static GUID iface_guid = {0xdeadbeef, 0x3f65, 0x11db, {0xb7,0x04,0x00,0x11,0x95,0x5c,0x2b,0xdb}};
 
 BOOL (WINAPI *pSetupDiSetDevicePropertyW)(HDEVINFO, PSP_DEVINFO_DATA, const DEVPROPKEY *, DEVPROPTYPE, const BYTE *, DWORD, DWORD);
 BOOL (WINAPI *pSetupDiGetDevicePropertyW)(HDEVINFO, PSP_DEVINFO_DATA, const DEVPROPKEY *, DEVPROPTYPE *, BYTE *, DWORD, DWORD *, DWORD);
@@ -74,6 +75,16 @@ static void load_resource(const char *name, const char *filename)
     CloseHandle( file );
 }
 
+static void check_reg_str_(int line, HKEY key, const char *value, const char *expect)
+{
+    char data[200];
+    DWORD size = sizeof(data);
+    LONG res = RegQueryValueExA(key, value, NULL, NULL, (BYTE *)data, &size);
+    ok_(__FILE__, line)(!res, "Failed to query value, error %u.\n", res);
+    ok_(__FILE__, line)(!strcmp(data, expect), "Expected value '%s', got '%s'.\n", expect, data);
+}
+#define check_reg_str(a,b,c) check_reg_str_(__LINE__,a,b,c)
+
 static void test_create_device_list_ex(void)
 {
     static const WCHAR machine[] = { 'd','u','m','m','y',0 };
@@ -2857,6 +2868,114 @@ static void test_install_driver_files(void)
     ok(ret, "Failed to delete %s, error %u.\n", path, GetLastError());
 }
 
+static void test_install_device_ifaces(void)
+{
+    static const char hardware_id[] = "bogus_hardware_id\0";
+    SP_DEVICE_INTERFACE_DATA iface = {sizeof(iface)};
+    SP_DEVINSTALL_PARAMS_A params = {sizeof(params)};
+    SP_DEVINFO_DATA device = {sizeof(device)};
+    char dir[MAX_PATH], path[MAX_PATH];
+    HKEY iface_key;
+    HDEVINFO set;
+    BOOL ret;
+    LONG res;
+
+    static const char inf_data[] = "[Version]\n"
+            "Signature=\"$Chicago$\"\n"
+            "ClassGuid={6a55b5a4-3f65-11db-b704-0011955c2bdb}\n"
+            "[Manufacturer]\n"
+            "mfg1=mfg1_key,NT" MYEXT ",NT" WOWEXT "\n"
+            "[mfg1_key.nt" MYEXT "]\n"
+            "desc1=dev1,bogus_hardware_id\n"
+            "[mfg1_key.nt" WOWEXT "]\n"
+            "desc1=dev1,bogus_hardware_id\n"
+            "[dev1.Interfaces]\n"
+            "AddInterface={deadbeef-3f65-11db-b704-0011955c2bdb},qux,dev1_iface\n"
+            "[dev1_iface]\n"
+            "CopyFiles=dev1_copy\n"
+            "AddReg=dev1_addreg\n"
+            "[dev1_copy]\n"
+            "setupapi_test_one.txt\n"
+            "[dev1_addreg]\n"
+            "HKR,,foo,,bar\n";
+
+    GetTempPathA(sizeof(dir), dir);
+    sprintf(path, "%s/setupapi_test_one.txt", dir);
+    create_file(path, "");
+    sprintf(path, "%s/setupapi_test.inf", dir);
+    create_file(path, inf_data);
+
+    set = SetupDiCreateDeviceInfoList(&guid, NULL);
+    ok(set != INVALID_HANDLE_VALUE, "Failed to create device list, error %#x.\n", GetLastError());
+    ret = SetupDiCreateDeviceInfoA(set, "Root\\BOGUS\\0000", &guid, NULL, NULL, 0, &device);
+    ok(ret, "Failed to create device, error %#x.\n", GetLastError());
+    ret = SetupDiSetDeviceRegistryPropertyA(set, &device, SPDRP_HARDWAREID,
+            (const BYTE *)hardware_id, sizeof(hardware_id));
+    ok(ret, "Failed to set hardware ID, error %#x.\n", GetLastError());
+
+    ret = SetupDiGetDeviceInstallParamsA(set, &device, &params);
+    ok(ret, "Failed to get device install params, error %#x.\n", GetLastError());
+    strcpy(params.DriverPath, path);
+    params.Flags = DI_ENUMSINGLEINF | DI_NOFILECOPY;
+    ret = SetupDiSetDeviceInstallParamsA(set, &device, &params);
+    ok(ret, "Failed to set device install params, error %#x.\n", GetLastError());
+    ret = SetupDiBuildDriverInfoList(set, &device, SPDIT_COMPATDRIVER);
+    ok(ret, "Failed to build driver list, error %#x.\n", GetLastError());
+    ret = SetupDiSelectBestCompatDrv(set, &device);
+    ok(ret, "Failed to select driver, error %#x.\n", GetLastError());
+
+    ret = SetupDiInstallDeviceInterfaces(set, &device);
+    ok(ret, "Failed to install driver files, error %#x.\n", GetLastError());
+
+    check_device_iface(set, &device, &iface_guid, 0, 0, "\\\\?\\ROOT#BOGUS#0000#{DEADBEEF-3F65-11DB-B704-0011955C2BDB}\\qux");
+
+    ret = SetupDiEnumDeviceInterfaces(set, &device, &iface_guid, 0, &iface);
+    ok(ret, "Failed to enumerate interfaces, error %#x.\n", GetLastError());
+    iface_key = SetupDiOpenDeviceInterfaceRegKey(set, &iface, 0, KEY_READ);
+    ok(iface_key != INVALID_HANDLE_VALUE, "Failed to open interface key, error %#x.\n", GetLastError());
+    check_reg_str(iface_key, "foo", "bar");
+    RegCloseKey(iface_key);
+
+    RegDeleteValueA(iface_key, "foo");
+
+    /* We set DI_NOFILECOPY, so nothing should have been copied. */
+    ret = GetFileAttributesA("C:/windows/system32/setupapi_test_one.txt");
+    ok(ret == INVALID_FILE_ATTRIBUTES, "Expected file not to be installed.\n");
+
+    ret = SetupDiGetDeviceInstallParamsA(set, &device, &params);
+    ok(ret, "Failed to get device install params, error %#x.\n", GetLastError());
+    params.Flags &= ~DI_NOFILECOPY;
+    ret = SetupDiSetDeviceInstallParamsA(set, &device, &params);
+    ok(ret, "Failed to set device install params, error %#x.\n", GetLastError());
+
+    ret = SetupDiInstallDeviceInterfaces(set, &device);
+    ok(ret, "Failed to install driver files, error %#x.\n", GetLastError());
+
+    check_device_iface(set, &device, &iface_guid, 0, 0, "\\\\?\\ROOT#BOGUS#0000#{DEADBEEF-3F65-11DB-B704-0011955C2BDB}\\qux");
+
+    ret = SetupDiEnumDeviceInterfaces(set, &device, &iface_guid, 0, &iface);
+    ok(ret, "Failed to enumerate interfaces, error %#x.\n", GetLastError());
+    iface_key = SetupDiOpenDeviceInterfaceRegKey(set, &iface, 0, KEY_READ);
+    ok(iface_key != INVALID_HANDLE_VALUE, "Failed to open interface key, error %#x.\n", GetLastError());
+    check_reg_str(iface_key, "foo", "bar");
+    RegCloseKey(iface_key);
+
+    ret = DeleteFileA("C:/windows/system32/setupapi_test_one.txt");
+    ok(ret, "Failed to delete file, error %u.\n", GetLastError());
+
+    SetupDiDestroyDeviceInfoList(set);
+
+    sprintf(path, "%s/setupapi_test_one.txt", dir);
+    ret = DeleteFileA(path);
+    ok(ret, "Failed to delete %s, error %u.\n", path, GetLastError());
+    sprintf(path, "%s/setupapi_test.inf", dir);
+    ret = DeleteFileA(path);
+    ok(ret, "Failed to delete %s, error %u.\n", path, GetLastError());
+    res = RegDeleteKeyA(HKEY_LOCAL_MACHINE, "System\\CurrentControlSet\\Control\\"
+            "DeviceClasses\\{deadbeef-3f65-11db-b704-0011955c2bdb}");
+    ok(!res, "Failed to delete interface class key, error %u.\n", res);
+}
+
 START_TEST(devinst)
 {
     static BOOL (WINAPI *pIsWow64Process)(HANDLE, BOOL *);
@@ -2895,4 +3014,5 @@ START_TEST(devinst)
     test_driver_list();
     test_call_class_installer();
     test_install_driver_files();
+    test_install_device_ifaces();
 }
-- 
2.21.0




More information about the wine-devel mailing list