[PATCH 2/4] setupapi: Handle error translation in SetupDiOpenDevRegKey().
Zebediah Figura
z.figura12 at gmail.com
Sun Feb 24 22:08:18 CST 2019
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/setupapi/devinst.c | 36 ++++++++++++++++-------------------
dlls/setupapi/tests/devinst.c | 2 --
2 files changed, 16 insertions(+), 22 deletions(-)
diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c
index 1fc494617d..a117d26158 100644
--- a/dlls/setupapi/devinst.c
+++ b/dlls/setupapi/devinst.c
@@ -514,9 +514,9 @@ static HKEY SETUPDI_CreateDevKey(struct device *device)
return key;
}
-static HKEY open_driver_key(struct device *device, REGSAM access)
+static LONG open_driver_key(struct device *device, REGSAM access, HKEY *key)
{
- HKEY class_key, key;
+ HKEY class_key;
WCHAR path[50];
DWORD size = sizeof(path);
LONG l;
@@ -525,23 +525,21 @@ static HKEY open_driver_key(struct device *device, REGSAM access)
KEY_CREATE_SUB_KEY, NULL, &class_key, NULL)))
{
ERR("Failed to open driver class root key, error %u.\n", l);
- SetLastError(l);
- return INVALID_HANDLE_VALUE;
+ return l;
}
if (!(l = RegGetValueW(device->key, NULL, Driver, RRF_RT_REG_SZ, NULL, path, &size)))
{
- if (!(l = RegOpenKeyExW(class_key, path, 0, access, &key)))
+ if (!(l = RegOpenKeyExW(class_key, path, 0, access, key)))
{
RegCloseKey(class_key);
- return key;
+ return l;
}
ERR("Failed to open driver key, error %u.\n", l);
}
RegCloseKey(class_key);
- SetLastError(ERROR_KEY_DOES_NOT_EXIST);
- return INVALID_HANDLE_VALUE;
+ return l;
}
static HKEY create_driver_key(struct device *device)
@@ -554,7 +552,7 @@ static HKEY create_driver_key(struct device *device)
DWORD dispos;
LONG l;
- if ((key = open_driver_key(device, KEY_READ | KEY_WRITE)) != INVALID_HANDLE_VALUE)
+ if (!open_driver_key(device, KEY_READ | KEY_WRITE, &key))
return key;
if ((l = RegCreateKeyExW(HKEY_LOCAL_MACHINE, ControlClass, 0, NULL, 0,
@@ -593,16 +591,14 @@ static BOOL delete_driver_key(struct device *device)
HKEY key;
LONG l;
- if ((key = open_driver_key(device, KEY_READ | KEY_WRITE)) != INVALID_HANDLE_VALUE)
+ if (!(l = open_driver_key(device, KEY_READ | KEY_WRITE, &key)))
{
l = RegDeleteKeyW(key, emptyW);
RegCloseKey(key);
-
- SetLastError(l);
- return !l;
}
- return FALSE;
+ SetLastError(l);
+ return !l;
}
struct PropertyMapEntry
@@ -3611,17 +3607,17 @@ HKEY WINAPI SetupDiOpenDevRegKey(HDEVINFO devinfo, SP_DEVINFO_DATA *device_data,
switch (KeyType)
{
case DIREG_DEV:
- if ((l = RegOpenKeyExW(device->key, DeviceParameters, 0, samDesired, &key)))
- key = INVALID_HANDLE_VALUE;
- SetLastError(l);
+ l = RegOpenKeyExW(device->key, DeviceParameters, 0, samDesired, &key);
break;
case DIREG_DRV:
- key = open_driver_key(device, samDesired);
+ l = open_driver_key(device, samDesired, &key);
break;
default:
- WARN("unknown KeyType %d\n", KeyType);
+ FIXME("Unhandled type %#x.\n", KeyType);
+ l = ERROR_CALL_NOT_IMPLEMENTED;
}
- return key;
+ SetLastError(l == ERROR_FILE_NOT_FOUND ? ERROR_KEY_DOES_NOT_EXIST : l);
+ return l ? INVALID_HANDLE_VALUE : key;
}
/***********************************************************************
diff --git a/dlls/setupapi/tests/devinst.c b/dlls/setupapi/tests/devinst.c
index 2657252c03..85900b2612 100644
--- a/dlls/setupapi/tests/devinst.c
+++ b/dlls/setupapi/tests/devinst.c
@@ -1163,7 +1163,6 @@ todo_wine {
key = SetupDiOpenDevRegKey(set, &device, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ);
ok(key == INVALID_HANDLE_VALUE, "Expected failure.\n");
-todo_wine
ok(GetLastError() == ERROR_KEY_DOES_NOT_EXIST, "Got unexpected error %#x.\n", GetLastError());
res = RegOpenKeyA(HKEY_LOCAL_MACHINE, params_key_path, &key);
@@ -1192,7 +1191,6 @@ todo_wine
key = SetupDiOpenDevRegKey(set, &device, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ);
ok(key == INVALID_HANDLE_VALUE, "Expected failure.\n");
-todo_wine
ok(GetLastError() == ERROR_KEY_DOES_NOT_EXIST, "Got unexpected error %#x.\n", GetLastError());
res = RegOpenKeyA(HKEY_LOCAL_MACHINE, params_key_path, &key);
--
2.20.1
More information about the wine-devel
mailing list