[PATCH 3/4] setupapi: Also remove the driver key in remove_device().
Zebediah Figura
z.figura12 at gmail.com
Tue Jan 22 20:38:35 CST 2019
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/setupapi/devinst.c | 9 ++++-
dlls/setupapi/tests/devinst.c | 70 +----------------------------------
2 files changed, 10 insertions(+), 69 deletions(-)
diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c
index a16c461a47..b16d2d7bfe 100644
--- a/dlls/setupapi/devinst.c
+++ b/dlls/setupapi/devinst.c
@@ -637,7 +637,14 @@ static void remove_device(struct device *device)
{
WCHAR id[MAX_DEVICE_ID_LEN], *p;
struct device_iface *iface;
- HKEY enum_key;
+ HKEY enum_key, driver_key;
+
+ if ((driver_key = open_driver_key(device, KEY_ALL_ACCESS)) != INVALID_HANDLE_VALUE)
+ {
+ RegDeleteTreeW(driver_key, NULL);
+ RegDeleteKeyW(driver_key, emptyW);
+ RegCloseKey(driver_key);
+ }
LIST_FOR_EACH_ENTRY(iface, &device->interfaces, struct device_iface, entry)
{
diff --git a/dlls/setupapi/tests/devinst.c b/dlls/setupapi/tests/devinst.c
index 6aa5a1e277..c08af1659c 100644
--- a/dlls/setupapi/tests/devinst.c
+++ b/dlls/setupapi/tests/devinst.c
@@ -37,72 +37,6 @@
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 LSTATUS devinst_RegDeleteTreeW(HKEY hKey, LPCWSTR lpszSubKey)
-{
- LONG ret;
- DWORD dwMaxSubkeyLen, dwMaxValueLen;
- DWORD dwMaxLen, dwSize;
- WCHAR szNameBuf[MAX_PATH], *lpszName = szNameBuf;
- HKEY hSubKey = hKey;
-
- if(lpszSubKey)
- {
- ret = RegOpenKeyExW(hKey, lpszSubKey, 0, KEY_READ, &hSubKey);
- if (ret) return ret;
- }
-
- /* Get highest length for keys, values */
- ret = RegQueryInfoKeyW(hSubKey, NULL, NULL, NULL, NULL,
- &dwMaxSubkeyLen, NULL, NULL, &dwMaxValueLen, NULL, NULL, NULL);
- if (ret) goto cleanup;
-
- dwMaxSubkeyLen++;
- dwMaxValueLen++;
- dwMaxLen = max(dwMaxSubkeyLen, dwMaxValueLen);
- if (dwMaxLen > ARRAY_SIZE(szNameBuf))
- {
- /* Name too big: alloc a buffer for it */
- if (!(lpszName = HeapAlloc( GetProcessHeap(), 0, dwMaxLen*sizeof(WCHAR))))
- {
- ret = ERROR_NOT_ENOUGH_MEMORY;
- goto cleanup;
- }
- }
-
-
- /* Recursively delete all the subkeys */
- while (TRUE)
- {
- dwSize = dwMaxLen;
- if (RegEnumKeyExW(hSubKey, 0, lpszName, &dwSize, NULL,
- NULL, NULL, NULL)) break;
-
- ret = devinst_RegDeleteTreeW(hSubKey, lpszName);
- if (ret) goto cleanup;
- }
-
- if (lpszSubKey)
- ret = RegDeleteKeyW(hKey, lpszSubKey);
- else
- while (TRUE)
- {
- dwSize = dwMaxLen;
- if (RegEnumValueW(hKey, 0, lpszName, &dwSize,
- NULL, NULL, NULL, NULL)) break;
-
- ret = RegDeleteValueW(hKey, lpszName);
- if (ret) goto cleanup;
- }
-
-cleanup:
- /* Free buffer if allocated */
- if (lpszName != szNameBuf)
- HeapFree( GetProcessHeap(), 0, lpszName);
- if(lpszSubKey)
- RegCloseKey(hSubKey);
- return ret;
-}
-
static void test_create_device_list_ex(void)
{
static const WCHAR machine[] = { 'd','u','m','m','y',0 };
@@ -890,8 +824,8 @@ todo_wine {
ok(ret, "Failed to remove device, error %#x.\n", GetLastError());
SetupDiDestroyDeviceInfoList(set);
- /* remove once Wine is fixed */
- devinst_RegDeleteTreeW(HKEY_LOCAL_MACHINE, classKey);
+ res = RegDeleteKeyW(HKEY_LOCAL_MACHINE, classKey);
+ ok(!res, "Failed to delete key, error %u.\n", res);
}
static void test_register_device_iface(void)
--
2.17.1
More information about the wine-devel
mailing list