Zebediah Figura : setupapi: Add a basic implementation of SetupDiCallClassInstaller().
Alexandre Julliard
julliard at winehq.org
Wed May 22 15:52:07 CDT 2019
Module: wine
Branch: master
Commit: 43ee138d4747722cfc7d27e59014a47c3003a898
URL: https://source.winehq.org/git/wine.git/?a=commit;h=43ee138d4747722cfc7d27e59014a47c3003a898
Author: Zebediah Figura <z.figura12 at gmail.com>
Date: Wed May 22 11:15:38 2019 -0500
setupapi: Add a basic implementation of SetupDiCallClassInstaller().
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/setupapi/devinst.c | 33 ++++++++++++++++++++++-------
dlls/setupapi/tests/devinst.c | 48 +++++++++++++++++++++++++++++++++++++++++++
include/setupapi.h | 1 +
3 files changed, 75 insertions(+), 7 deletions(-)
diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c
index 5c6ec55..721ca3e 100644
--- a/dlls/setupapi/devinst.c
+++ b/dlls/setupapi/devinst.c
@@ -3520,15 +3520,34 @@ BOOL WINAPI SetupDiSetClassInstallParamsW(
}
/***********************************************************************
- * SetupDiCallClassInstaller (SETUPAPI.@)
+ * SetupDiCallClassInstaller (SETUPAPI.@)
*/
-BOOL WINAPI SetupDiCallClassInstaller(
- DI_FUNCTION InstallFunction,
- HDEVINFO DeviceInfoSet,
- PSP_DEVINFO_DATA DeviceInfoData)
+BOOL WINAPI SetupDiCallClassInstaller(DI_FUNCTION function, HDEVINFO devinfo, SP_DEVINFO_DATA *device_data)
{
- FIXME("%d %p %p\n", InstallFunction, DeviceInfoSet, DeviceInfoData);
- return FALSE;
+ TRACE("function %#x, devinfo %p, device_data %p.\n", function, devinfo, device_data);
+
+ switch (function)
+ {
+ case DIF_REGISTERDEVICE:
+ return SetupDiRegisterDeviceInfo(devinfo, device_data, 0, NULL, NULL, NULL);
+ case DIF_REMOVE:
+ return SetupDiRemoveDevice(devinfo, device_data);
+ case DIF_SELECTBESTCOMPATDRV:
+ return SetupDiSelectBestCompatDrv(devinfo, device_data);
+ case DIF_REGISTER_COINSTALLERS:
+ return SetupDiRegisterCoDeviceInstallers(devinfo, device_data);
+ case DIF_FINISHINSTALL_ACTION:
+ case DIF_INSTALLDEVICE:
+ case DIF_INSTALLDEVICEFILES:
+ case DIF_INSTALLINTERFACES:
+ case DIF_PROPERTYCHANGE:
+ case DIF_SELECTDEVICE:
+ case DIF_UNREMOVE:
+ FIXME("Unhandled function %#x.\n", function);
+ default:
+ SetLastError(ERROR_DI_DO_DEFAULT);
+ return FALSE;
+ }
}
/***********************************************************************
diff --git a/dlls/setupapi/tests/devinst.c b/dlls/setupapi/tests/devinst.c
index f9631c7..a2ccef1 100644
--- a/dlls/setupapi/tests/devinst.c
+++ b/dlls/setupapi/tests/devinst.c
@@ -2336,6 +2336,53 @@ static void test_driver_list(void)
DeleteFileA("C:/windows/inf/wine_test2.pnf");
}
+static BOOL device_is_registered(HDEVINFO set, SP_DEVINFO_DATA *device)
+{
+ HKEY key = SetupDiOpenDevRegKey(set, device, DICS_FLAG_GLOBAL, 0, DIREG_DRV, 0);
+ ok(key == INVALID_HANDLE_VALUE, "Expected failure.\n");
+ RegCloseKey(key);
+ return GetLastError() == ERROR_KEY_DOES_NOT_EXIST;
+}
+
+static void test_call_class_installer(void)
+{
+ SP_DEVINFO_DATA device = {sizeof(device)};
+ HDEVINFO set;
+ BOOL ret;
+
+ if (wow64)
+ {
+ skip("SetupDiCallClassInstaller() does not work on WoW64.\n");
+ return;
+ }
+
+ set = SetupDiCreateDeviceInfoList(&guid, NULL);
+ ok(set != INVALID_HANDLE_VALUE, "Failed to create device list, error %#x.\n", GetLastError());
+ ret = SetupDiCreateDeviceInfoA(set, "Root\\LEGACY_BOGUS\\0000", &guid, NULL, NULL, 0, &device);
+ ok(ret, "Failed to create device, error %#x.\n", GetLastError());
+
+ ok(!device_is_registered(set, &device), "Expected device not to be registered.\n");
+ ret = SetupDiCallClassInstaller(DIF_REGISTERDEVICE, set, &device);
+ ok(ret, "Failed to call class installer, error %#x.\n", GetLastError());
+ ok(device_is_registered(set, &device), "Expected device to be registered.\n");
+
+ /* This is probably not failure per se, but rather an indication that no
+ * class installer was called and no default handler exists. */
+ ret = SetupDiCallClassInstaller(DIF_ALLOW_INSTALL, set, &device);
+ ok(!ret, "Expected failure.\n");
+ ok(GetLastError() == ERROR_DI_DO_DEFAULT, "Got unexpected error %#x.\n", GetLastError());
+
+ ret = SetupDiCallClassInstaller(0xdeadbeef, set, &device);
+ ok(!ret, "Expected failure.\n");
+ ok(GetLastError() == ERROR_DI_DO_DEFAULT, "Got unexpected error %#x.\n", GetLastError());
+
+ ret = SetupDiCallClassInstaller(DIF_REMOVE, set, &device);
+ ok(ret, "Failed to call class installer, error %#x.\n", GetLastError());
+ ok(!device_is_registered(set, &device), "Expected device not to be registered.\n");
+
+ SetupDiDestroyDeviceInfoList(set);
+}
+
START_TEST(devinst)
{
static BOOL (WINAPI *pIsWow64Process)(HANDLE, BOOL *);
@@ -2372,4 +2419,5 @@ START_TEST(devinst)
test_device_interface_key();
test_device_install_params();
test_driver_list();
+ test_call_class_installer();
}
diff --git a/include/setupapi.h b/include/setupapi.h
index 4491617..818cc12 100644
--- a/include/setupapi.h
+++ b/include/setupapi.h
@@ -1106,6 +1106,7 @@ DECL_WINELIB_SETUPAPI_TYPE_AW(PSP_INF_SIGNER_INFO)
#define DIF_POWERMESSAGEWAKE 0x27
#define DIF_ADDREMOTEPROPERTYPAGE_ADVANCED 0x28
#define DIF_UPDATEDRIVER_UI 0x29
+#define DIF_FINISHINSTALL_ACTION 0x2a
#define DIF_RESERVED2 0x30
/* Directory ids */
More information about the wine-cvs
mailing list