[PATCH] setupapi: Store the class and reference string keys in the device_iface structure.
Zebediah Figura
z.figura12 at gmail.com
Mon Nov 26 19:26:43 CST 2018
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/setupapi/devinst.c | 62 ++++++++++++-------------------------------------
1 file changed, 15 insertions(+), 47 deletions(-)
diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c
index 1f020b9b8e..64c04131b0 100644
--- a/dlls/setupapi/devinst.c
+++ b/dlls/setupapi/devinst.c
@@ -93,6 +93,7 @@ static const WCHAR Phantom[] = {'P','h','a','n','t','o','m',0};
static const WCHAR SymbolicLink[] = {'S','y','m','b','o','l','i','c','L','i','n','k',0};
static const WCHAR Control[] = {'C','o','n','t','r','o','l',0};
static const WCHAR Linked[] = {'L','i','n','k','e','d',0};
+static const WCHAR emptyW[] = {0};
/* is used to identify if a DeviceInfoSet pointer is
valid or not */
@@ -126,6 +127,8 @@ struct device_iface
struct device *device;
GUID class;
DWORD flags;
+ HKEY class_key;
+ HKEY refstr_key;
struct list entry;
};
@@ -377,7 +380,7 @@ static struct device_iface *SETUPDI_CreateDeviceInterface(struct device *device,
{
struct device_iface *iface = NULL;
WCHAR *refstr2 = NULL, *symlink = NULL, *path = NULL;
- HKEY key = NULL;
+ HKEY key;
LONG ret;
TRACE("%p %s %s\n", device, debugstr_guid(class), debugstr_w(refstr));
@@ -422,9 +425,10 @@ static struct device_iface *SETUPDI_CreateDeviceInterface(struct device *device,
}
RegSetValueExW(key, DeviceInstance, 0, REG_SZ, (BYTE *)device->instanceId,
lstrlenW(device->instanceId) * sizeof(WCHAR));
- RegCloseKey(key);
heap_free(path);
+ iface->class_key = key;
+
if (!(path = get_refstr_key_path(iface)))
{
SetLastError(ERROR_OUTOFMEMORY);
@@ -442,9 +446,10 @@ static struct device_iface *SETUPDI_CreateDeviceInterface(struct device *device,
if (is_linked(key))
iface->flags |= SPINT_ACTIVE;
- RegCloseKey(key);
heap_free(path);
+ iface->refstr_key = key;
+
list_add_tail(&device->interfaces, &iface->entry);
return iface;
@@ -554,7 +559,6 @@ static BOOL SETUPDI_SetDeviceRegistryPropertyW(struct device *device,
static void SETUPDI_RemoveDevice(struct device *device)
{
struct device_iface *iface, *next;
- WCHAR *path;
if (device->key != INVALID_HANDLE_VALUE)
RegCloseKey(device->key);
@@ -576,11 +580,10 @@ static void SETUPDI_RemoveDevice(struct device *device)
struct device_iface, entry)
{
list_remove(&iface->entry);
- if (device->phantom && (path = get_refstr_key_path(iface)))
- {
- RegDeleteKeyW(HKEY_LOCAL_MACHINE, path);
- heap_free(path);
- }
+ if (device->phantom)
+ RegDeleteKeyW(iface->refstr_key, emptyW);
+ RegCloseKey(iface->refstr_key);
+ RegCloseKey(iface->class_key);
heap_free(iface->refstr);
heap_free(iface->symlink);
heap_free(iface);
@@ -2486,8 +2489,7 @@ HKEY WINAPI SetupDiCreateDeviceInterfaceRegKeyW(HDEVINFO devinfo,
HINF hinf, const WCHAR *section)
{
struct device_iface *iface;
- HKEY refstr_key, params_key;
- WCHAR *path;
+ HKEY params_key;
LONG ret;
TRACE("devinfo %p, iface_data %p, reserved %d, access %#x, hinf %p, section %s.\n",
@@ -2501,24 +2503,8 @@ HKEY WINAPI SetupDiCreateDeviceInterfaceRegKeyW(HDEVINFO devinfo,
return INVALID_HANDLE_VALUE;
}
- if (!(path = get_refstr_key_path(iface)))
- {
- SetLastError(ERROR_OUTOFMEMORY);
- return INVALID_HANDLE_VALUE;
- }
-
- ret = RegCreateKeyExW(HKEY_LOCAL_MACHINE, path, 0, NULL, 0, 0, NULL,
- &refstr_key, NULL);
- heap_free(path);
- if (ret)
- {
- SetLastError(ret);
- return INVALID_HANDLE_VALUE;
- }
-
- ret = RegCreateKeyExW(refstr_key, DeviceParameters, 0, NULL, 0, access,
+ ret = RegCreateKeyExW(iface->refstr_key, DeviceParameters, 0, NULL, 0, access,
NULL, ¶ms_key, NULL);
- RegCloseKey(refstr_key);
if (ret)
{
SetLastError(ret);
@@ -2535,8 +2521,6 @@ BOOL WINAPI SetupDiDeleteDeviceInterfaceRegKey(HDEVINFO devinfo,
SP_DEVICE_INTERFACE_DATA *iface_data, DWORD reserved)
{
struct device_iface *iface;
- HKEY refstr_key;
- WCHAR *path;
LONG ret;
TRACE("devinfo %p, iface_data %p, reserved %d.\n", devinfo, iface_data, reserved);
@@ -2544,23 +2528,7 @@ BOOL WINAPI SetupDiDeleteDeviceInterfaceRegKey(HDEVINFO devinfo,
if (!(iface = get_device_iface(devinfo, iface_data)))
return FALSE;
- if (!(path = get_refstr_key_path(iface)))
- {
- SetLastError(ERROR_OUTOFMEMORY);
- return FALSE;
- }
-
- ret = RegCreateKeyExW(HKEY_LOCAL_MACHINE, path, 0, NULL, 0, 0, NULL,
- &refstr_key, NULL);
- heap_free(path);
- if (ret)
- {
- SetLastError(ret);
- return FALSE;
- }
-
- ret = RegDeleteKeyW(refstr_key, DeviceParameters);
- RegCloseKey(refstr_key);
+ ret = RegDeleteKeyW(iface->refstr_key, DeviceParameters);
if (ret)
{
SetLastError(ret);
--
2.14.1
More information about the wine-devel
mailing list