--- 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, ¶ms); + 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, ¶ms); + 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, ¶ms); + ok(ret, "Failed to get device install params, error %#x.\n", GetLastError()); + params.Flags &= ~DI_NOFILECOPY; + ret = SetupDiSetDeviceInstallParamsA(set, &device, ¶ms); + 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(); }