Zebediah Figura : setupapi: Implement SetupDiRemoveDeviceInterface().
Alexandre Julliard
julliard at winehq.org
Mon Dec 3 15:28:52 CST 2018
Module: wine
Branch: master
Commit: 3ff98740346e69247b572b0a3e9b71c32b0abcf4
URL: https://source.winehq.org/git/wine.git/?a=commit;h=3ff98740346e69247b572b0a3e9b71c32b0abcf4
Author: Zebediah Figura <z.figura12 at gmail.com>
Date: Fri Nov 30 16:42:10 2018 -0600
setupapi: Implement SetupDiRemoveDeviceInterface().
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/setupapi/devinst.c | 28 ++++++++++++++++++++++++----
dlls/setupapi/tests/devinst.c | 2 --
2 files changed, 24 insertions(+), 6 deletions(-)
diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c
index b3d7099..cc05623 100644
--- a/dlls/setupapi/devinst.c
+++ b/dlls/setupapi/devinst.c
@@ -556,6 +556,19 @@ static BOOL SETUPDI_SetDeviceRegistryPropertyW(struct device *device,
return FALSE;
}
+static void remove_device_iface(struct device_iface *iface)
+{
+ RegDeleteTreeW(iface->refstr_key, NULL);
+ RegDeleteKeyW(iface->refstr_key, emptyW);
+ RegCloseKey(iface->refstr_key);
+ iface->refstr_key = NULL;
+ /* Also remove the class key if it's empty. */
+ RegDeleteKeyW(iface->class_key, emptyW);
+ RegCloseKey(iface->class_key);
+ iface->class_key = NULL;
+ iface->flags |= SPINT_REMOVED;
+}
+
static void SETUPDI_RemoveDevice(struct device *device)
{
struct device_iface *iface, *next;
@@ -1537,11 +1550,18 @@ BOOL WINAPI SetupDiRemoveDevice(
/***********************************************************************
* SetupDiRemoveDeviceInterface (SETUPAPI.@)
*/
-BOOL WINAPI SetupDiRemoveDeviceInterface(HDEVINFO info, PSP_DEVICE_INTERFACE_DATA data)
+BOOL WINAPI SetupDiRemoveDeviceInterface(HDEVINFO devinfo, SP_DEVICE_INTERFACE_DATA *iface_data)
{
- FIXME("(%p, %p): stub\n", info, data);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+ struct device_iface *iface;
+
+ TRACE("devinfo %p, iface_data %p.\n", devinfo, iface_data);
+
+ if (!(iface = get_device_iface(devinfo, iface_data)))
+ return FALSE;
+
+ remove_device_iface(iface);
+
+ return TRUE;
}
/***********************************************************************
diff --git a/dlls/setupapi/tests/devinst.c b/dlls/setupapi/tests/devinst.c
index 338393e..fbc62dc 100644
--- a/dlls/setupapi/tests/devinst.c
+++ b/dlls/setupapi/tests/devinst.c
@@ -552,7 +552,6 @@ static void check_device_iface_(int line, HDEVINFO set, SP_DEVINFO_DATA *device,
ok_(__FILE__, line)(ret, "Failed to enumerate interfaces, error %#x.\n", GetLastError());
ok_(__FILE__, line)(IsEqualGUID(&iface.InterfaceClassGuid, class),
"Got unexpected class %s.\n", wine_dbgstr_guid(&iface.InterfaceClassGuid));
-todo_wine_if(flags & SPINT_REMOVED)
ok_(__FILE__, line)(iface.Flags == flags, "Got unexpected flags %#x.\n", iface.Flags);
ret = SetupDiGetDeviceInterfaceDetailA(set, &iface, detail, sizeof(buffer), NULL, NULL);
ok_(__FILE__, line)(ret, "Failed to get interface detail, error %#x.\n", GetLastError());
@@ -656,7 +655,6 @@ static void test_device_iface(void)
ret = SetupDiEnumDeviceInterfaces(set, &device, &guid2, 0, &iface);
ok(ret, "Failed to enumerate interfaces, error %#x.\n", GetLastError());
ret = SetupDiRemoveDeviceInterface(set, &iface);
-todo_wine
ok(ret, "Failed to remove interface, error %#x.\n", GetLastError());
check_device_iface(set, &device, &guid2, 0, SPINT_REMOVED, "\\\\?\\ROOT#LEGACY_BOGUS#0000#{6A55B5A5-3F65-11DB-B704-0011955C2BDB}");
More information about the wine-cvs
mailing list