From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/setupapi/Makefile.in | 2 +- dlls/setupapi/devinst.c | 52 ++++++++++++--------------------------- 2 files changed, 17 insertions(+), 37 deletions(-) diff --git a/dlls/setupapi/Makefile.in b/dlls/setupapi/Makefile.in index 4a2d1109707..c98dd4313ee 100644 --- a/dlls/setupapi/Makefile.in +++ b/dlls/setupapi/Makefile.in @@ -1,7 +1,7 @@ EXTRADEFS = -D_SETUPAPI_ MODULE = setupapi.dll IMPORTLIB = setupapi -IMPORTS = uuid advapi32 rpcrt4 kernelbase +IMPORTS = cfgmgr32 uuid advapi32 rpcrt4 kernelbase DELAYIMPORTS = cabinet shell32 wintrust ole32 comdlg32 user32 SOURCES = \ diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c index 9b79b7c88da..f863df56ebf 100644 --- a/dlls/setupapi/devinst.c +++ b/dlls/setupapi/devinst.c @@ -3800,9 +3800,10 @@ HKEY WINAPI SetupDiOpenClassRegKeyExA(const GUID *class, REGSAM access, DWORD fl HKEY WINAPI SetupDiOpenClassRegKeyExW(const GUID *class, REGSAM access, DWORD flags, const WCHAR *machine_name, void *reserved) { - const WCHAR *key_name; + DWORD open_flags = 0; + GUID guid = {0}; + CONFIGRET ret; HKEY key; - LONG ret; TRACE("class %s, access %#lx, flags %#lx, machine_name %s, reserved %p.\n", debugstr_guid(class), access, flags, debugstr_w(machine_name), reserved); @@ -3813,14 +3814,10 @@ HKEY WINAPI SetupDiOpenClassRegKeyExW(const GUID *class, REGSAM access, DWORD fl return INVALID_HANDLE_VALUE; } - if (flags == DIOCR_INSTALLER) - { - key_name = ControlClass; - } - else if (flags == DIOCR_INTERFACE) - { - key_name = DeviceClasses; - } + if (flags & DIOCR_INSTALLER) + open_flags = CM_OPEN_CLASS_KEY_INSTALLER; + else if (flags & DIOCR_INTERFACE) + open_flags = CM_OPEN_CLASS_KEY_INTERFACE; else { ERR("Invalid flags parameter!\n"); @@ -3828,36 +3825,19 @@ HKEY WINAPI SetupDiOpenClassRegKeyExW(const GUID *class, REGSAM access, DWORD fl return INVALID_HANDLE_VALUE; } - if (!class) + if (class) { - if ((ret = RegOpenKeyExW(HKEY_LOCAL_MACHINE, key_name, 0, access, &key))) - { - SetLastError(ret); - key = INVALID_HANDLE_VALUE; - } + guid = *class; + class = &guid; } - else - { - WCHAR guid_str[39]; - HKEY root; - SETUPDI_GuidToString(class, guid_str); - - if (!(ret = RegOpenKeyExW(HKEY_LOCAL_MACHINE, key_name, 0, access, &root))) - { - if ((ret = RegOpenKeyExW(root, guid_str, 0, access, &key))) - { - SetLastError(ret); - key = INVALID_HANDLE_VALUE; - } - RegCloseKey(root); - } - else - { - SetLastError(ret); - key = INVALID_HANDLE_VALUE; - } + if ((ret = CM_Open_Class_Key_ExW((GUID *)class, NULL, access, + RegDisposition_OpenExisting, &key, open_flags, NULL))) + { + SetLastError(CM_MapCrToWin32Err(ret, ERROR_INVALID_PARAMETER)); + return INVALID_HANDLE_VALUE; } + return key; } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10149