Signed-off-by: Zebediah Figura z.figura12@gmail.com --- include/Makefile.in | 1 + include/newdev.h | 50 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 include/newdev.h
diff --git a/include/Makefile.in b/include/Makefile.in index 979695f5527..8a173a5f28a 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -471,6 +471,7 @@ SOURCES = \ netfw.idl \ netioapi.h \ netlistmgr.idl \ + newdev.h \ nldef.h \ npapi.h \ nserror.h \ diff --git a/include/newdev.h b/include/newdev.h new file mode 100644 index 00000000000..3b6e88ec8b8 --- /dev/null +++ b/include/newdev.h @@ -0,0 +1,50 @@ +/* + * New Device installation API + * + * Copyright 2019 Zebediah Figura + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef __WINE_NEWDEV_H +#define __WINE_NEWDEV_H + +#include "setupapi.h" + +#define INSTALLFLAG_FORCE 0x1 +#define INSTALLFLAG_READONLY 0x2 +#define INSTALLFLAG_NONINTERACTIVE 0x4 +#define INSTALLFLAG_BITS 0x7 + +BOOL WINAPI UpdateDriverForPlugAndPlayDevicesA(HWND parent, const char *hardware_id, const char *inf_path, DWORD flags, BOOL *reboot); +BOOL WINAPI UpdateDriverForPlugAndPlayDevicesW(HWND parent, const WCHAR *hardware_id, const WCHAR *inf_path, DWORD flags, BOOL *reboot); +#define UpdateDriverForPlugAndPlayDevices WINELIB_NAME_AW(UpdateDriverForPlugAndPlayDevices) + +#define DIIRFLAG_INF_ALREADY_COPIED 0x01 +#define DIIRFLAG_FORCE_INF 0x02 +#define DIIRFLAG_HW_USING_THE_INF 0x04 +#define DIIRFLAG_HOTPATCH 0x08 +#define DIIRFLAG_NOBACKUP 0x10 +#define DIIRFLAG_PRE_CONFIGURE_INF 0x20 +#define DIIRFLAG_INSTALL_AS_SET 0x40 +#define DIIRFLAG_BITS (DIIRFLAG_FORCE_INF | DIIRFLAG_HOTPATCH | DIIRFLAG_PRE_CONFIGURE_INF | DIIRFLAG_INSTALL_AS_SET) +#define DIIRFLAG_SYSTEM_BITS (DIIRFLAG_INF_ALREADY_COPIED | DIIRFLAG_FORCE_INF | DIIRFLAG_HW_USING_THE_INF \ + | DIIRFLAG_HOTPATCH | DIIRFLAG_NOBACKUP | DIIRFLAG_PRE_CONFIGURE_INF | DIIRFLAG_INSTALL_AS_SET) + +BOOL WINAPI DiInstallDriverA(HWND parent, const char *inf_path, DWORD flags, BOOL *reboot); +BOOL WINAPI DiInstallDriverW(HWND parent, const WCHAR *inf_path, DWORD flags, BOOL *reboot); +#define DiInstallDriver WINELIB_NAME_AW(DiInstallDriver) + +#endif
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/newdev/main.c | 12 +++++------- dlls/newdev/newdev.spec | 4 ++-- 2 files changed, 7 insertions(+), 9 deletions(-)
diff --git a/dlls/newdev/main.c b/dlls/newdev/main.c index 20725a4a551..b1a5ccf0909 100644 --- a/dlls/newdev/main.c +++ b/dlls/newdev/main.c @@ -25,7 +25,7 @@ #include "winbase.h" #include "winuser.h" #include "winreg.h" -#include "setupapi.h" +#include "newdev.h"
#include "wine/unicode.h" #include "wine/debug.h" @@ -75,19 +75,17 @@ BOOL WINAPI UpdateDriverForPlugAndPlayDevicesW(HWND hwndParent, LPCWSTR Hardware /*********************************************************************** * DiInstallDriverA (NEWDEV.@) */ -BOOL WINAPI DiInstallDriverA(HWND parent, HDEVINFO deviceinfo, PSP_DEVINFO_DATA devicedata, - PSP_DRVINFO_DATA_A driverdata, DWORD flags, BOOL *reboot) +BOOL WINAPI DiInstallDriverA(HWND parent, const char *inf_path, DWORD flags, BOOL *reboot) { - FIXME("Stub! %p %p %p %p 0x%08x %p\n", parent, deviceinfo, devicedata, driverdata, flags, reboot); + FIXME("parent %p, inf_path %s, flags %#x, reboot %p, stub!\n", parent, debugstr_a(inf_path), flags, reboot); return TRUE; }
/*********************************************************************** * DiInstallDriverW (NEWDEV.@) */ -BOOL WINAPI DiInstallDriverW(HWND parent, HDEVINFO deviceinfo, PSP_DEVINFO_DATA devicedata, - PSP_DRVINFO_DATA_W driverdata, DWORD flags, BOOL *reboot) +BOOL WINAPI DiInstallDriverW(HWND parent, const WCHAR *inf_path, DWORD flags, BOOL *reboot) { - FIXME("Stub! %p %p %p %p 0x%08x %p\n", parent, deviceinfo, devicedata, driverdata, flags, reboot); + FIXME("parent %p, inf_path %s, flags %#x, reboot %p, stub!\n", parent, debugstr_w(inf_path), flags, reboot); return TRUE; } diff --git a/dlls/newdev/newdev.spec b/dlls/newdev/newdev.spec index 84303cc1e4c..6d45c7e13ea 100644 --- a/dlls/newdev/newdev.spec +++ b/dlls/newdev/newdev.spec @@ -1,7 +1,7 @@ @ stub DeviceInternetSettingUiW @ stub DiInstallDevice -@ stdcall DiInstallDriverA(long ptr ptr ptr long ptr) -@ stdcall DiInstallDriverW(long ptr ptr ptr long ptr) +@ stdcall DiInstallDriverA(ptr str long ptr) +@ stdcall DiInstallDriverW(ptr wstr long ptr) @ stub DiRollbackDriver @ stub DiShowUpdateDevice @ stub DiUninstallDevice
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/newdev/Makefile.in | 1 + dlls/newdev/main.c | 97 ++++++++++++++++++++++++++++++++++++----- 2 files changed, 88 insertions(+), 10 deletions(-)
diff --git a/dlls/newdev/Makefile.in b/dlls/newdev/Makefile.in index 728dea3218f..c447a388614 100644 --- a/dlls/newdev/Makefile.in +++ b/dlls/newdev/Makefile.in @@ -1,4 +1,5 @@ MODULE = newdev.dll IMPORTLIB = newdev +IMPORTS = setupapi
C_SRCS = main.c diff --git a/dlls/newdev/main.c b/dlls/newdev/main.c index b1a5ccf0909..108aec042ec 100644 --- a/dlls/newdev/main.c +++ b/dlls/newdev/main.c @@ -1,5 +1,5 @@ /* - * NewDev + * New Device installation API * * Copyright 2003 Ulrich Czekalla * @@ -25,12 +25,14 @@ #include "winbase.h" #include "winuser.h" #include "winreg.h" +#include "cfgmgr32.h" #include "newdev.h"
-#include "wine/unicode.h" #include "wine/debug.h" +#include "wine/heap.h" +#include "wine/unicode.h"
-WINE_DEFAULT_DEBUG_CHANNEL(newdev); +WINE_DEFAULT_DEBUG_CHANNEL(setupapi);
/*********************************************************************** * InstallNewDevice (NEWDEV.@) @@ -53,21 +55,96 @@ BOOL WINAPI InstallSelectedDriver(HWND parent, HDEVINFO info, const WCHAR *reser /*********************************************************************** * UpdateDriverForPlugAndPlayDevicesA (NEWDEV.@) */ -BOOL WINAPI UpdateDriverForPlugAndPlayDevicesA(HWND hwndParent, LPCSTR HardwareId, - LPCSTR FullInfPath, DWORD InstallFlags, PBOOL bRebootRequired OPTIONAL) +BOOL WINAPI UpdateDriverForPlugAndPlayDevicesA(HWND parent, const char *hardware_id, + const char *inf_path, DWORD flags, BOOL *reboot) { - FIXME("Stub! %s %s 0x%08x\n", HardwareId, FullInfPath, InstallFlags); - return TRUE; + WCHAR hardware_idW[MAX_DEVICE_ID_LEN]; + WCHAR inf_pathW[MAX_PATH]; + + MultiByteToWideChar(CP_ACP, 0, hardware_id, -1, hardware_idW, ARRAY_SIZE(hardware_idW)); + MultiByteToWideChar(CP_ACP, 0, inf_path, -1, inf_pathW, ARRAY_SIZE(inf_pathW)); + + return UpdateDriverForPlugAndPlayDevicesW(parent, hardware_idW, inf_pathW, flags, reboot); }
+static BOOL hardware_id_matches(const WCHAR *id, const WCHAR *device_ids) +{ + while (*device_ids) + { + if (!strcmpW(id, device_ids)) + return TRUE; + device_ids += strlenW(device_ids) + 1; + } + return FALSE; +}
/*********************************************************************** * UpdateDriverForPlugAndPlayDevicesW (NEWDEV.@) */ -BOOL WINAPI UpdateDriverForPlugAndPlayDevicesW(HWND hwndParent, LPCWSTR HardwareId, - LPCWSTR FullInfPath, DWORD InstallFlags, PBOOL bRebootRequired OPTIONAL) +BOOL WINAPI UpdateDriverForPlugAndPlayDevicesW(HWND parent, const WCHAR *hardware_id, + const WCHAR *inf_path, DWORD flags, BOOL *reboot) { - FIXME("Stub! %s %s 0x%08x\n", debugstr_w(HardwareId), debugstr_w(FullInfPath), InstallFlags); + SP_DEVINSTALL_PARAMS_W params = {sizeof(params)}; + SP_DEVINFO_DATA device = {sizeof(device)}; + WCHAR *device_ids = NULL; + DWORD size = 0, i, j; + HDEVINFO set; + + static const DWORD dif_list[] = + { + DIF_SELECTBESTCOMPATDRV, + DIF_ALLOW_INSTALL, + DIF_INSTALLDEVICEFILES, + DIF_REGISTER_COINSTALLERS, + DIF_INSTALLINTERFACES, + DIF_INSTALLDEVICE, + DIF_NEWDEVICEWIZARD_FINISHINSTALL, + }; + + TRACE("parent %p, hardware_id %s, inf_path %s, flags %#x, reboot %p.\n", + parent, debugstr_w(hardware_id), debugstr_w(inf_path), flags, reboot); + + if (flags) + FIXME("Unhandled flags %#x.\n", flags); + + if (reboot) *reboot = FALSE; + + if ((set = SetupDiGetClassDevsW(NULL, NULL, 0, DIGCF_ALLCLASSES)) == INVALID_HANDLE_VALUE) + return FALSE; + + for (i = 0; SetupDiEnumDeviceInfo(set, i, &device); ++i) + { + if (!SetupDiGetDeviceRegistryPropertyW(set, &device, SPDRP_HARDWAREID, NULL, (BYTE *)device_ids, size, &size)) + { + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) + continue; + device_ids = heap_realloc(device_ids, size); + SetupDiGetDeviceRegistryPropertyW(set, &device, SPDRP_HARDWAREID, NULL, (BYTE *)device_ids, size, NULL); + } + + if (!hardware_id_matches(hardware_id, device_ids)) + continue; + + if (!SetupDiGetDeviceInstallParamsW(set, &device, ¶ms)) + continue; + + strcpyW(params.DriverPath, inf_path); + params.Flags |= DI_ENUMSINGLEINF; + if (!SetupDiSetDeviceInstallParamsW(set, &device, ¶ms)) + continue; + + if (!SetupDiBuildDriverInfoList(set, &device, SPDIT_COMPATDRIVER)) + continue; + + for (j = 0; j < ARRAY_SIZE(dif_list); ++j) + { + if (!SetupDiCallClassInstaller(dif_list[j], set, &device) && GetLastError() != ERROR_DI_DO_DEFAULT) + break; + } + } + + SetupDiDestroyDeviceInfoList(set); + heap_free(device_ids); return TRUE; }
--- configure | 1 + configure.ac | 1 + dlls/newdev/tests/Makefile.in | 7 ++ dlls/newdev/tests/coinst.c | 61 +++++++++++++++ dlls/newdev/tests/coinst.spec | 2 + dlls/newdev/tests/newdev.c | 136 ++++++++++++++++++++++++++++++++++ 6 files changed, 208 insertions(+) create mode 100644 dlls/newdev/tests/Makefile.in create mode 100644 dlls/newdev/tests/coinst.c create mode 100644 dlls/newdev/tests/coinst.spec create mode 100644 dlls/newdev/tests/newdev.c
diff --git a/configure b/configure index dc1d02e0ab8..4aadcc7e029 100755 --- a/configure +++ b/configure @@ -20437,6 +20437,7 @@ wine_fn_config_makefile dlls/netcfgx/tests enable_tests wine_fn_config_makefile dlls/netprofm enable_netprofm wine_fn_config_makefile dlls/netprofm/tests enable_tests wine_fn_config_makefile dlls/newdev enable_newdev +wine_fn_config_makefile dlls/newdev/tests enable_tests wine_fn_config_makefile dlls/ninput enable_ninput wine_fn_config_makefile dlls/ninput/tests enable_tests wine_fn_config_makefile dlls/normaliz enable_normaliz diff --git a/configure.ac b/configure.ac index 426dea30e74..50b5ccc2c5e 100644 --- a/configure.ac +++ b/configure.ac @@ -3484,6 +3484,7 @@ WINE_CONFIG_MAKEFILE(dlls/netcfgx/tests) WINE_CONFIG_MAKEFILE(dlls/netprofm) WINE_CONFIG_MAKEFILE(dlls/netprofm/tests) WINE_CONFIG_MAKEFILE(dlls/newdev) +WINE_CONFIG_MAKEFILE(dlls/newdev/tests) WINE_CONFIG_MAKEFILE(dlls/ninput) WINE_CONFIG_MAKEFILE(dlls/ninput/tests) WINE_CONFIG_MAKEFILE(dlls/normaliz) diff --git a/dlls/newdev/tests/Makefile.in b/dlls/newdev/tests/Makefile.in new file mode 100644 index 00000000000..73e5367fae8 --- /dev/null +++ b/dlls/newdev/tests/Makefile.in @@ -0,0 +1,7 @@ +TESTDLL = newdev.dll +IMPORTS = advapi32 newdev setupapi + +SOURCES = \ + coinst.c \ + coinst.spec \ + newdev.c diff --git a/dlls/newdev/tests/coinst.c b/dlls/newdev/tests/coinst.c new file mode 100644 index 00000000000..32df62c16fe --- /dev/null +++ b/dlls/newdev/tests/coinst.c @@ -0,0 +1,61 @@ +/* + * Test class installer DLL + * + * Copyright 2018 Zebediah Figura + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include <stdio.h> +#include <stdarg.h> +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "winreg.h" +#include "setupapi.h" + +void (*ok_callback)(const char *file, int line, int condition, const char *msg); + +static void ok_(const char *file, int line, int condition, const char *format, ...) +{ + va_list args; + char buffer[300]; + va_start(args, format); + vsnprintf(buffer, sizeof(buffer), format, args); + (*ok_callback)(file, line, condition, buffer); + va_end(args); +} +#define ok(condition, ...) ok_(__FILE__, __LINE__, condition, __VA_ARGS__) + +static const DWORD msg_list[] = +{ + DIF_SELECTBESTCOMPATDRV, + DIF_ALLOW_INSTALL, + DIF_INSTALLDEVICEFILES, + DIF_REGISTER_COINSTALLERS, + DIF_INSTALLINTERFACES, + DIF_INSTALLDEVICE, + DIF_NEWDEVICEWIZARD_FINISHINSTALL, + DIF_DESTROYPRIVATEDATA, +}; + +static unsigned int msg_index; + +DWORD WINAPI ClassInstall(DI_FUNCTION msg, HDEVINFO set, SP_DEVINFO_DATA *device) +{ + ok(msg == msg_list[msg_index], "%d: Expected message %#x, got %#x.\n", msg_index, msg_list[msg_index], msg); + msg_index++; + return ERROR_DI_DO_DEFAULT; +} diff --git a/dlls/newdev/tests/coinst.spec b/dlls/newdev/tests/coinst.spec new file mode 100644 index 00000000000..a5272ec3c70 --- /dev/null +++ b/dlls/newdev/tests/coinst.spec @@ -0,0 +1,2 @@ +@ stdcall ClassInstall(long ptr ptr) +@ extern ok_callback diff --git a/dlls/newdev/tests/newdev.c b/dlls/newdev/tests/newdev.c new file mode 100644 index 00000000000..5c49b272761 --- /dev/null +++ b/dlls/newdev/tests/newdev.c @@ -0,0 +1,136 @@ +/* + * Unit tests for newdev.dll + * + * Copyright 2019 Zebediah Figura + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include <stdarg.h> + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "winreg.h" +#include "newdev.h" +#include "wine/test.h" + +static void load_resource(const char *name, const char *filename) +{ + DWORD written; + HANDLE file; + HRSRC res; + void *ptr; + + file = CreateFileA(filename, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0); + ok(file != INVALID_HANDLE_VALUE, "file creation failed, at %s, error %d\n", filename, GetLastError()); + + res = FindResourceA(NULL, name, "TESTDLL"); + ok( res != 0, "couldn't find resource\n" ); + ptr = LockResource( LoadResource( GetModuleHandleA(NULL), res )); + WriteFile( file, ptr, SizeofResource( GetModuleHandleA(NULL), res ), &written, NULL ); + ok( written == SizeofResource( GetModuleHandleA(NULL), res ), "couldn't write resource\n" ); + CloseHandle( file ); +} + +static void ok_callback(const char *file, int line, int condition, const char *msg) +{ + ok_(file, line)(condition, msg); +} + +static const GUID device_class = {0x12344321}; + +static void test_update_driver(void) +{ + static const char inf_data[] = "[Version]\n" + "Signature="$Chicago$"\n" + "ClassGuid={12344321-0000-0000-0000-000000000000}\n" + "[Manufacturer]\n" + "mfg1=mfg1_key\n" + "[mfg1_key]\n" + "desc1=dev1,bogus_hardware_id\n" + "[mfg1_key]\n" + "desc1=dev1,bogus_hardware_id\n" + "[dev1]\n" + "[dev1.Services]\n" + "AddService=,2\n"; + static const char hardware_id[] = "bogus_hardware_id\0"; + static const char regdata[] = "winetest_coinst.dll\0"; + void (**pok_callback)(const char *file, int line, int condition, const char *msg); + SP_DEVINFO_DATA device = {sizeof(device)}; + char inf_path[MAX_PATH]; + BOOL ret, reboot; + HMODULE coinst; + HKEY class_key; + HDEVINFO set; + HANDLE file; + DWORD size; + LONG res; + + GetTempPathA(MAX_PATH, inf_path); + strcat(inf_path, "newdev_test.inf"); + file = CreateFileA(inf_path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0); + ok(file != INVALID_HANDLE_VALUE, "Failed to create %s, error %u.\n", inf_path, GetLastError()); + ret = WriteFile(file, inf_data, strlen(inf_data), &size, NULL); + ok(ret && size == strlen(inf_data), "Failed to write INF file, error %u.\n", GetLastError()); + CloseHandle(file); + + load_resource("coinst.dll", "C:\windows\system32\winetest_coinst.dll"); + + coinst = LoadLibraryA("winetest_coinst.dll"); + pok_callback = (void *)GetProcAddress(coinst, "ok_callback"); + *pok_callback = ok_callback; + + res = RegCreateKeyA(HKEY_LOCAL_MACHINE, "System\CurrentControlSet\Control\Class" + "\{12344321-0000-0000-0000-000000000000}", &class_key); + ok(!res, "Failed to create class key, error %u.\n", res); + res = RegSetValueExA(class_key, "Installer32", 0, REG_SZ, (BYTE *)regdata, sizeof(regdata)); + ok(!res, "Failed to set registry value, error %u.\n", res); + + set = SetupDiCreateDeviceInfoList(&device_class, NULL); + ok(set != INVALID_HANDLE_VALUE, "Failed to create device list, error %#x.\n", GetLastError()); + + ret = SetupDiCreateDeviceInfoA(set, "root\bogus\0000", &device_class, 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 = SetupDiRegisterDeviceInfo(set, &device, 0, NULL, NULL, NULL); + ok(ret, "Failed to register device, error %#x.\n", GetLastError()); + + ret = UpdateDriverForPlugAndPlayDevicesA(NULL, hardware_id, inf_path, 0, &reboot); + ok(ret, "UpdateDriverForPlugAndPlayDevices() failed, error %#x.\n", GetLastError()); + + ret = SetupDiRemoveDevice(set, &device); + ok(ret, "Failed to remove device, error %#x.\n", GetLastError()); + + SetupDiDestroyDeviceInfoList(set); + + FreeLibrary(coinst); + + ret = DeleteFileA("C:\windows\system32\winetest_coinst.dll"); + ok(ret, "Failed to delete file, error %u.\n", GetLastError()); + ret = DeleteFileA(inf_path); + ok(ret, "Failed to delete %s, error %u.\n", inf_path, GetLastError()); + res = RegDeleteKeyA(class_key, ""); + ok(!res, "Failed to delete class key, error %u.\n", res); + RegCloseKey(class_key); +} + +START_TEST(newdev) +{ + test_update_driver(); +}
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=52983
Your paranoid android.
=== w2003std (32 bit report) ===
newdev: newdev: Timeout
=== wvistau64 (32 bit report) ===
newdev: newdev.c:115: Test failed: UpdateDriverForPlugAndPlayDevices() failed, error 0xe0000235.
=== wvistau64_zh_CN (32 bit report) ===
newdev: newdev.c:115: Test failed: UpdateDriverForPlugAndPlayDevices() failed, error 0xe0000235.
=== wvistau64_fr (32 bit report) ===
newdev: newdev.c:115: Test failed: UpdateDriverForPlugAndPlayDevices() failed, error 0xe0000235.
=== wvistau64_he (32 bit report) ===
newdev: newdev.c:115: Test failed: UpdateDriverForPlugAndPlayDevices() failed, error 0xe0000235.
=== w2008s64 (32 bit report) ===
newdev: newdev.c:115: Test failed: UpdateDriverForPlugAndPlayDevices() failed, error 0xe0000235.
=== w7u (32 bit report) ===
newdev: newdev: Timeout
=== w7pro64 (32 bit report) ===
newdev: newdev.c:115: Test failed: UpdateDriverForPlugAndPlayDevices() failed, error 0xe0000235.
=== w8 (32 bit report) ===
newdev: newdev: Timeout
=== w8adm (32 bit report) ===
newdev: newdev.c:38: Test failed: file creation failed, at C:\windows\system32\winetest_coinst.dll, error 5 newdev.c:44: Test failed: couldn't write resource 0c7c:newdev: unhandled exception c0000005 at 00401909
=== w864 (32 bit report) ===
newdev: newdev.c:115: Test failed: UpdateDriverForPlugAndPlayDevices() failed, error 0xe0000235.
=== w1064v1507 (32 bit report) ===
newdev: newdev.c:115: Test failed: UpdateDriverForPlugAndPlayDevices() failed, error 0x103.
=== w1064v1809 (32 bit report) ===
newdev: newdev.c:115: Test failed: UpdateDriverForPlugAndPlayDevices() failed, error 0xe0000235.
=== wvistau64 (64 bit report) ===
newdev: coinst.c:58: Test failed: 1: Expected message 0x18, got 0xc. newdev.c:115: Test failed: UpdateDriverForPlugAndPlayDevices() failed, error 0x103.
Report errors: newdev:newdev contains a misplaced failure message for coinst
=== w2008s64 (64 bit report) ===
newdev: coinst.c:58: Test failed: 1: Expected message 0x18, got 0xc. newdev.c:115: Test failed: UpdateDriverForPlugAndPlayDevices() failed, error 0x103.
Report errors: newdev:newdev contains a misplaced failure message for coinst
=== w7pro64 (64 bit report) ===
newdev: newdev.c:115: Test failed: UpdateDriverForPlugAndPlayDevices() failed, error 0x103. newdev.c:129: Test failed: Failed to delete class key, error 5.
=== w864 (64 bit report) ===
newdev: coinst.c:58: Test failed: 1: Expected message 0x18, got 0xc. newdev.c:115: Test failed: UpdateDriverForPlugAndPlayDevices() failed, error 0x103.
Report errors: newdev:newdev contains a misplaced failure message for coinst
=== w1064v1507 (64 bit report) ===
newdev: coinst.c:58: Test failed: 1: Expected message 0x18, got 0xc. newdev.c:115: Test failed: UpdateDriverForPlugAndPlayDevices() failed, error 0x103.
Report errors: newdev:newdev contains a misplaced failure message for coinst
=== w1064v1809 (64 bit report) ===
newdev: coinst.c:58: Test failed: 1: Expected message 0x18, got 0xc. newdev.c:115: Test failed: UpdateDriverForPlugAndPlayDevices() failed, error 0x103.
Report errors: newdev:newdev contains a misplaced failure message for coinst