[PATCH 0/6] MR10149: setupapi: Reimplement some class functions using cfgmgr32.
From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/setupapi/devinst.c | 102 ++++++++++++++-------------------------- 1 file changed, 36 insertions(+), 66 deletions(-) diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c index b7ef248feb3..9b79b7c88da 100644 --- a/dlls/setupapi/devinst.c +++ b/dlls/setupapi/devinst.c @@ -3770,121 +3770,91 @@ BOOL WINAPI SetupDiInstallClassW( /*********************************************************************** * SetupDiOpenClassRegKey (SETUPAPI.@) */ -HKEY WINAPI SetupDiOpenClassRegKey( - const GUID* ClassGuid, - REGSAM samDesired) +HKEY WINAPI SetupDiOpenClassRegKey(const GUID *class, REGSAM access) { - return SetupDiOpenClassRegKeyExW(ClassGuid, samDesired, - DIOCR_INSTALLER, NULL, NULL); + return SetupDiOpenClassRegKeyExW(class, access, DIOCR_INSTALLER, NULL, NULL); } /*********************************************************************** * SetupDiOpenClassRegKeyExA (SETUPAPI.@) */ -HKEY WINAPI SetupDiOpenClassRegKeyExA( - const GUID* ClassGuid, - REGSAM samDesired, - DWORD Flags, - PCSTR MachineName, - PVOID Reserved) +HKEY WINAPI SetupDiOpenClassRegKeyExA(const GUID *class, REGSAM access, DWORD flags, + const char *machine_nameA, void *reserved) { - PWSTR MachineNameW = NULL; - HKEY hKey; + WCHAR *machine_nameW = strdupAtoW(machine_nameA); + HKEY hkey; - TRACE("\n"); + TRACE("class %s, access %#lx, flags %#lx, machine_nameA %s, reserved %p.\n", debugstr_guid(class), + access, flags, debugstr_a(machine_nameA), reserved); - if (MachineName) - { - MachineNameW = MultiByteToUnicode(MachineName, CP_ACP); - if (MachineNameW == NULL) - return INVALID_HANDLE_VALUE; - } - - hKey = SetupDiOpenClassRegKeyExW(ClassGuid, samDesired, - Flags, MachineNameW, Reserved); - - MyFree(MachineNameW); - - return hKey; + hkey = SetupDiOpenClassRegKeyExW(class, access, flags, machine_nameW, reserved); + free(machine_nameW); + return hkey; } /*********************************************************************** * SetupDiOpenClassRegKeyExW (SETUPAPI.@) */ -HKEY WINAPI SetupDiOpenClassRegKeyExW( - const GUID* ClassGuid, - REGSAM samDesired, - DWORD Flags, - PCWSTR MachineName, - PVOID Reserved) +HKEY WINAPI SetupDiOpenClassRegKeyExW(const GUID *class, REGSAM access, DWORD flags, + const WCHAR *machine_name, void *reserved) { - HKEY hClassesKey; + const WCHAR *key_name; HKEY key; - LPCWSTR lpKeyName; - LONG l; + LONG ret; - if (MachineName && *MachineName) + TRACE("class %s, access %#lx, flags %#lx, machine_name %s, reserved %p.\n", debugstr_guid(class), + access, flags, debugstr_w(machine_name), reserved); + + if (machine_name && *machine_name) { FIXME("Remote access not supported yet!\n"); return INVALID_HANDLE_VALUE; } - if (Flags == DIOCR_INSTALLER) + if (flags == DIOCR_INSTALLER) { - lpKeyName = ControlClass; + key_name = ControlClass; } - else if (Flags == DIOCR_INTERFACE) + else if (flags == DIOCR_INTERFACE) { - lpKeyName = DeviceClasses; + key_name = DeviceClasses; } else { - ERR("Invalid Flags parameter!\n"); + ERR("Invalid flags parameter!\n"); SetLastError(ERROR_INVALID_PARAMETER); return INVALID_HANDLE_VALUE; } - if (!ClassGuid) + if (!class) { - if ((l = RegOpenKeyExW(HKEY_LOCAL_MACHINE, - lpKeyName, - 0, - samDesired, - &hClassesKey))) + if ((ret = RegOpenKeyExW(HKEY_LOCAL_MACHINE, key_name, 0, access, &key))) { - SetLastError(l); - hClassesKey = INVALID_HANDLE_VALUE; + SetLastError(ret); + key = INVALID_HANDLE_VALUE; } - key = hClassesKey; } else { - WCHAR bracedGuidString[39]; + WCHAR guid_str[39]; + HKEY root; - SETUPDI_GuidToString(ClassGuid, bracedGuidString); + SETUPDI_GuidToString(class, guid_str); - if (!(l = RegOpenKeyExW(HKEY_LOCAL_MACHINE, - lpKeyName, - 0, - samDesired, - &hClassesKey))) + if (!(ret = RegOpenKeyExW(HKEY_LOCAL_MACHINE, key_name, 0, access, &root))) { - if ((l = RegOpenKeyExW(hClassesKey, - bracedGuidString, - 0, - samDesired, - &key))) + if ((ret = RegOpenKeyExW(root, guid_str, 0, access, &key))) { - SetLastError(l); + SetLastError(ret); key = INVALID_HANDLE_VALUE; } - RegCloseKey(hClassesKey); + RegCloseKey(root); } else { - SetLastError(l); + SetLastError(ret); key = INVALID_HANDLE_VALUE; } } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10149
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
From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/setupapi/devinst.c | 209 ++++++++++++++-------------------------- 1 file changed, 74 insertions(+), 135 deletions(-) diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c index f863df56ebf..540f51b9f52 100644 --- a/dlls/setupapi/devinst.c +++ b/dlls/setupapi/devinst.c @@ -1141,176 +1141,115 @@ BOOL WINAPI SetupDiBuildClassInfoListExW( /*********************************************************************** * SetupDiClassGuidsFromNameA (SETUPAPI.@) */ -BOOL WINAPI SetupDiClassGuidsFromNameA( - LPCSTR ClassName, - LPGUID ClassGuidList, - DWORD ClassGuidListSize, - PDWORD RequiredSize) +BOOL WINAPI SetupDiClassGuidsFromNameA(const char *class_name, GUID *guids, DWORD guids_size, DWORD *guid_count) { - return SetupDiClassGuidsFromNameExA(ClassName, ClassGuidList, - ClassGuidListSize, RequiredSize, - NULL, NULL); + return SetupDiClassGuidsFromNameExA(class_name, guids, guids_size, guid_count, NULL, NULL); } /*********************************************************************** * SetupDiClassGuidsFromNameW (SETUPAPI.@) */ -BOOL WINAPI SetupDiClassGuidsFromNameW( - LPCWSTR ClassName, - LPGUID ClassGuidList, - DWORD ClassGuidListSize, - PDWORD RequiredSize) +BOOL WINAPI SetupDiClassGuidsFromNameW(const WCHAR *class_name, GUID *guids, DWORD guids_size, DWORD *guid_count) { - return SetupDiClassGuidsFromNameExW(ClassName, ClassGuidList, - ClassGuidListSize, RequiredSize, - NULL, NULL); + return SetupDiClassGuidsFromNameExW(class_name, guids, guids_size, guid_count, NULL, NULL); } /*********************************************************************** * SetupDiClassGuidsFromNameExA (SETUPAPI.@) */ -BOOL WINAPI SetupDiClassGuidsFromNameExA( - LPCSTR ClassName, - LPGUID ClassGuidList, - DWORD ClassGuidListSize, - PDWORD RequiredSize, - LPCSTR MachineName, - PVOID Reserved) +BOOL WINAPI SetupDiClassGuidsFromNameExA(const char *class_nameA, GUID *guids, DWORD guids_size, + DWORD *guid_count, const char *machine_nameA, void *reserved) { - LPWSTR ClassNameW = NULL; - LPWSTR MachineNameW = NULL; - BOOL bResult; - - ClassNameW = MultiByteToUnicode(ClassName, CP_ACP); - if (ClassNameW == NULL) - return FALSE; - - if (MachineName) - { - MachineNameW = MultiByteToUnicode(MachineName, CP_ACP); - if (MachineNameW == NULL) - { - MyFree(ClassNameW); - return FALSE; - } - } - - bResult = SetupDiClassGuidsFromNameExW(ClassNameW, ClassGuidList, - ClassGuidListSize, RequiredSize, - MachineNameW, Reserved); + WCHAR *class_nameW = strdupAtoW(class_nameA), *machine_nameW = strdupAtoW(machine_nameA); + BOOL ret; - MyFree(MachineNameW); - MyFree(ClassNameW); + TRACE("class_nameA %s, guids %p, guids_size %#lx, guid_count %p, machine_nameA %s, reserved %p.\n", + debugstr_a(class_nameA), guids, guids_size, guid_count, debugstr_a(machine_nameA), reserved); - return bResult; + ret = SetupDiClassGuidsFromNameExW(class_nameW, guids, guids_size, guid_count, machine_nameW, reserved); + free(class_nameW); + free(machine_nameW); + return ret; } /*********************************************************************** * SetupDiClassGuidsFromNameExW (SETUPAPI.@) */ -BOOL WINAPI SetupDiClassGuidsFromNameExW( - LPCWSTR ClassName, - LPGUID ClassGuidList, - DWORD ClassGuidListSize, - PDWORD RequiredSize, - LPCWSTR MachineName, - PVOID Reserved) +BOOL WINAPI SetupDiClassGuidsFromNameExW(const WCHAR *class_name, GUID *guids, DWORD guids_size, + DWORD *guid_count, const WCHAR *machine_name, void *reserved) { - WCHAR szKeyName[40]; - WCHAR szClassName[256]; - HKEY hClassesKey; - HKEY hClassKey; - DWORD dwLength; - DWORD dwIndex; - LONG lError; - DWORD dwGuidListIndex = 0; + DWORD len, index, guid_index = 0; + WCHAR key_name[40], buffer[256]; + HKEY hkey, class_key; + LONG err; - if (RequiredSize != NULL) - *RequiredSize = 0; + TRACE("class_name %s, guids %p, guids_size %#lx, guid_count %p, machine_name %s, reserved " + "%p.\n", + debugstr_w(class_name), guids, guids_size, guid_count, debugstr_w(machine_name), reserved); - hClassesKey = SetupDiOpenClassRegKeyExW(NULL, - KEY_ALL_ACCESS, - DIOCR_INSTALLER, - MachineName, - Reserved); - if (hClassesKey == INVALID_HANDLE_VALUE) - { - return FALSE; - } + if (guid_count) + *guid_count = 0; - for (dwIndex = 0; ; dwIndex++) + hkey = SetupDiOpenClassRegKeyExW(NULL, KEY_ALL_ACCESS, DIOCR_INSTALLER, machine_name, reserved); + if (hkey == INVALID_HANDLE_VALUE) + return FALSE; + + for (index = 0;; index++) { - dwLength = ARRAY_SIZE(szKeyName); - lError = RegEnumKeyExW(hClassesKey, - dwIndex, - szKeyName, - &dwLength, - NULL, - NULL, - NULL, - NULL); - TRACE("RegEnumKeyExW() returns %ld\n", lError); - if (lError == ERROR_SUCCESS || lError == ERROR_MORE_DATA) - { - TRACE("Key name: %p\n", szKeyName); + len = ARRAY_SIZE(key_name); + err = RegEnumKeyExW(hkey, index, key_name, &len, NULL, NULL, NULL, NULL); + TRACE("RegEnumKeyExW() returns %ld\n", err); + if (err == ERROR_SUCCESS || err == ERROR_MORE_DATA) + { + TRACE("Key name: %p\n", key_name); - if (RegOpenKeyExW(hClassesKey, - szKeyName, - 0, - KEY_ALL_ACCESS, - &hClassKey)) - { - RegCloseKey(hClassesKey); - return FALSE; - } + if (RegOpenKeyExW(hkey, key_name, 0, KEY_ALL_ACCESS, &class_key)) + { + RegCloseKey(hkey); + return FALSE; + } - dwLength = sizeof(szClassName); - if (!RegQueryValueExW(hClassKey, - L"Class", - NULL, - NULL, - (LPBYTE)szClassName, - &dwLength)) - { - TRACE("Class name: %p\n", szClassName); + len = sizeof(buffer); + if (!RegQueryValueExW(class_key, L"Class", NULL, NULL, (LPBYTE)buffer, &len)) + { + TRACE("Class name: %p\n", buffer); - if (wcsicmp(szClassName, ClassName) == 0) - { - TRACE("Found matching class name\n"); - - TRACE("Guid: %p\n", szKeyName); - if (dwGuidListIndex < ClassGuidListSize) - { - if (szKeyName[0] == '{' && szKeyName[37] == '}') - { - szKeyName[37] = 0; - } - TRACE("Guid: %p\n", &szKeyName[1]); - - UuidFromStringW(&szKeyName[1], - &ClassGuidList[dwGuidListIndex]); - } - - dwGuidListIndex++; - } - } + if (wcsicmp(buffer, class_name) == 0) + { + TRACE("Found matching class name\n"); - RegCloseKey(hClassKey); - } + TRACE("Guid: %p\n", key_name); + if (guid_index < guids_size) + { + if (key_name[0] == '{' && key_name[37] == '}') + { + key_name[37] = 0; + } + TRACE("Guid: %p\n", &key_name[1]); - if (lError != ERROR_SUCCESS) - break; + UuidFromStringW(&key_name[1], &guids[guid_index]); + } + + guid_index++; + } + } + + RegCloseKey(class_key); + } + + if (err != ERROR_SUCCESS) + break; } - RegCloseKey(hClassesKey); + RegCloseKey(hkey); - if (RequiredSize != NULL) - *RequiredSize = dwGuidListIndex; + if (guid_count) + *guid_count = guid_index; - if (ClassGuidListSize < dwGuidListIndex) + if (guids_size < guid_index) { - SetLastError(ERROR_INSUFFICIENT_BUFFER); - return FALSE; + SetLastError(ERROR_INSUFFICIENT_BUFFER); + return FALSE; } return TRUE; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10149
From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/setupapi/devinst.c | 74 +++++++++++++---------------------------- 1 file changed, 24 insertions(+), 50 deletions(-) diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c index 540f51b9f52..c379b870124 100644 --- a/dlls/setupapi/devinst.c +++ b/dlls/setupapi/devinst.c @@ -1178,10 +1178,9 @@ BOOL WINAPI SetupDiClassGuidsFromNameExA(const char *class_nameA, GUID *guids, D BOOL WINAPI SetupDiClassGuidsFromNameExW(const WCHAR *class_name, GUID *guids, DWORD guids_size, DWORD *guid_count, const WCHAR *machine_name, void *reserved) { - DWORD len, index, guid_index = 0; - WCHAR key_name[40], buffer[256]; - HKEY hkey, class_key; - LONG err; + DWORD guid_index = 0; + CONFIGRET ret; + GUID guid; TRACE("class_name %s, guids %p, guids_size %#lx, guid_count %p, machine_name %s, reserved " "%p.\n", @@ -1190,58 +1189,33 @@ BOOL WINAPI SetupDiClassGuidsFromNameExW(const WCHAR *class_name, GUID *guids, D if (guid_count) *guid_count = 0; - hkey = SetupDiOpenClassRegKeyExW(NULL, KEY_ALL_ACCESS, DIOCR_INSTALLER, machine_name, reserved); - if (hkey == INVALID_HANDLE_VALUE) + if (machine_name && *machine_name) + { + FIXME("Remote access not supported yet!\n"); + SetLastError(ERROR_INVALID_MACHINENAME); return FALSE; + } - for (index = 0;; index++) + for (UINT i = 0; !(ret = CM_Enumerate_Classes(i, &guid, CM_ENUMERATE_CLASSES_INSTALLER)); i++) { - len = ARRAY_SIZE(key_name); - err = RegEnumKeyExW(hkey, index, key_name, &len, NULL, NULL, NULL, NULL); - TRACE("RegEnumKeyExW() returns %ld\n", err); - if (err == ERROR_SUCCESS || err == ERROR_MORE_DATA) - { - TRACE("Key name: %p\n", key_name); - - if (RegOpenKeyExW(hkey, key_name, 0, KEY_ALL_ACCESS, &class_key)) - { - RegCloseKey(hkey); - return FALSE; - } - - len = sizeof(buffer); - if (!RegQueryValueExW(class_key, L"Class", NULL, NULL, (LPBYTE)buffer, &len)) - { - TRACE("Class name: %p\n", buffer); - - if (wcsicmp(buffer, class_name) == 0) - { - TRACE("Found matching class name\n"); - - TRACE("Guid: %p\n", key_name); - if (guid_index < guids_size) - { - if (key_name[0] == '{' && key_name[37] == '}') - { - key_name[37] = 0; - } - TRACE("Guid: %p\n", &key_name[1]); - - UuidFromStringW(&key_name[1], &guids[guid_index]); - } + WCHAR buffer[MAX_CLASS_NAME_LEN]; + ULONG size = sizeof(buffer); + DEVPROPTYPE type; - guid_index++; - } - } - - RegCloseKey(class_key); - } - - if (err != ERROR_SUCCESS) + if ((ret = CM_Get_Class_PropertyW(&guid, &DEVPKEY_NAME, &type, (BYTE *)buffer, &size, 0))) break; + if (!wcsicmp(buffer, class_name)) + { + if (guid_index < guids_size) + guids[guid_index] = guid; + guid_index++; + } + } + if (ret && ret != CR_NO_SUCH_VALUE) + { + SetLastError(CM_MapCrToWin32Err(ret, ERROR_GEN_FAILURE)); + return FALSE; } - - RegCloseKey(hkey); if (guid_count) *guid_count = guid_index; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10149
From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/setupapi/devinst.c | 272 +++++++++++++--------------------------- 1 file changed, 85 insertions(+), 187 deletions(-) diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c index c379b870124..ab259541517 100644 --- a/dlls/setupapi/devinst.c +++ b/dlls/setupapi/devinst.c @@ -917,222 +917,120 @@ static struct device *get_devnode_device(DEVINST devnode, HDEVINFO *set, SP_DEVI /*********************************************************************** * SetupDiBuildClassInfoList (SETUPAPI.@) - * - * Returns a list of setup class GUIDs that identify the classes - * that are installed on a local machine. - * - * PARAMS - * Flags [I] control exclusion of classes from the list. - * ClassGuidList [O] pointer to a GUID-typed array that receives a list of setup class GUIDs. - * ClassGuidListSize [I] The number of GUIDs in the array (ClassGuidList). - * RequiredSize [O] pointer, which receives the number of GUIDs that are returned. - * - * RETURNS - * Success: TRUE. - * Failure: FALSE. */ -BOOL WINAPI SetupDiBuildClassInfoList( - DWORD Flags, - LPGUID ClassGuidList, - DWORD ClassGuidListSize, - PDWORD RequiredSize) +BOOL WINAPI SetupDiBuildClassInfoList(DWORD flags, GUID *guids, DWORD guids_size, DWORD *guid_count) { - TRACE("\n"); - return SetupDiBuildClassInfoListExW(Flags, ClassGuidList, - ClassGuidListSize, RequiredSize, - NULL, NULL); + return SetupDiBuildClassInfoListExW(flags, guids, guids_size, guid_count, NULL, NULL); } /*********************************************************************** * SetupDiBuildClassInfoListExA (SETUPAPI.@) - * - * Returns a list of setup class GUIDs that identify the classes - * that are installed on a local or remote machine. - * - * PARAMS - * Flags [I] control exclusion of classes from the list. - * ClassGuidList [O] pointer to a GUID-typed array that receives a list of setup class GUIDs. - * ClassGuidListSize [I] The number of GUIDs in the array (ClassGuidList). - * RequiredSize [O] pointer, which receives the number of GUIDs that are returned. - * MachineName [I] name of a remote machine. - * Reserved [I] must be NULL. - * - * RETURNS - * Success: TRUE. - * Failure: FALSE. */ -BOOL WINAPI SetupDiBuildClassInfoListExA( - DWORD Flags, - LPGUID ClassGuidList, - DWORD ClassGuidListSize, - PDWORD RequiredSize, - LPCSTR MachineName, - PVOID Reserved) +BOOL WINAPI SetupDiBuildClassInfoListExA(DWORD flags, GUID *guids, DWORD guids_size, + DWORD *guid_count, const char *machine_nameA, void *reserved) { - LPWSTR MachineNameW = NULL; - BOOL bResult; - - TRACE("\n"); - - if (MachineName) - { - MachineNameW = MultiByteToUnicode(MachineName, CP_ACP); - if (MachineNameW == NULL) return FALSE; - } + WCHAR *machine_nameW = strdupAtoW(machine_nameA); + BOOL ret; - bResult = SetupDiBuildClassInfoListExW(Flags, ClassGuidList, - ClassGuidListSize, RequiredSize, - MachineNameW, Reserved); + TRACE("flags %#lx, guids %p, guids_size %#lx, guid_count %p, machine_nameA %s, reserved %p.\n", + flags, guids, guids_size, guid_count, debugstr_a(machine_nameA), reserved); - MyFree(MachineNameW); - - return bResult; + ret = SetupDiBuildClassInfoListExW(flags, guids, guids_size, guid_count, machine_nameW, reserved); + free(machine_nameW); + return ret; } /*********************************************************************** * SetupDiBuildClassInfoListExW (SETUPAPI.@) - * - * Returns a list of setup class GUIDs that identify the classes - * that are installed on a local or remote machine. - * - * PARAMS - * Flags [I] control exclusion of classes from the list. - * ClassGuidList [O] pointer to a GUID-typed array that receives a list of setup class GUIDs. - * ClassGuidListSize [I] The number of GUIDs in the array (ClassGuidList). - * RequiredSize [O] pointer, which receives the number of GUIDs that are returned. - * MachineName [I] name of a remote machine. - * Reserved [I] must be NULL. - * - * RETURNS - * Success: TRUE. - * Failure: FALSE. */ -BOOL WINAPI SetupDiBuildClassInfoListExW( - DWORD Flags, - LPGUID ClassGuidList, - DWORD ClassGuidListSize, - PDWORD RequiredSize, - LPCWSTR MachineName, - PVOID Reserved) +BOOL WINAPI SetupDiBuildClassInfoListExW(DWORD flags, GUID *guids, DWORD guids_size, + DWORD *guid_count, const WCHAR *machine_name, void *reserved) { - WCHAR szKeyName[40]; - HKEY hClassesKey; - HKEY hClassKey; - DWORD dwLength; - DWORD dwIndex; - LONG lError; - DWORD dwGuidListIndex = 0; + DWORD len, index, guid_index = 0; + HKEY root_key, class_key; + WCHAR key_name[40]; + LONG err; - TRACE("\n"); + TRACE("flags %#lx, guids %p, guids_size %#lx, guid_count %p, machine_name %s, reserved %p.\n", + flags, guids, guids_size, guid_count, debugstr_w(machine_name), reserved); - if (RequiredSize != NULL) - *RequiredSize = 0; + if (guid_count) + *guid_count = 0; - hClassesKey = SetupDiOpenClassRegKeyExW(NULL, - KEY_ALL_ACCESS, - DIOCR_INSTALLER, - MachineName, - Reserved); - if (hClassesKey == INVALID_HANDLE_VALUE) + root_key = SetupDiOpenClassRegKeyExW(NULL, KEY_ALL_ACCESS, DIOCR_INSTALLER, machine_name, reserved); + if (root_key == INVALID_HANDLE_VALUE) { - return FALSE; + return FALSE; } - for (dwIndex = 0; ; dwIndex++) + for (index = 0;; index++) { - dwLength = 40; - lError = RegEnumKeyExW(hClassesKey, - dwIndex, - szKeyName, - &dwLength, - NULL, - NULL, - NULL, - NULL); - TRACE("RegEnumKeyExW() returns %ld\n", lError); - if (lError == ERROR_SUCCESS || lError == ERROR_MORE_DATA) - { - TRACE("Key name: %p\n", szKeyName); - - if (RegOpenKeyExW(hClassesKey, - szKeyName, - 0, - KEY_ALL_ACCESS, - &hClassKey)) - { - RegCloseKey(hClassesKey); - return FALSE; - } - - if (!RegQueryValueExW(hClassKey, - L"NoUseClass", - NULL, - NULL, - NULL, - NULL)) - { - TRACE("'NoUseClass' value found!\n"); - RegCloseKey(hClassKey); - continue; - } - - if ((Flags & DIBCI_NOINSTALLCLASS) && - (!RegQueryValueExW(hClassKey, - L"NoInstallClass", - NULL, - NULL, - NULL, - NULL))) - { - TRACE("'NoInstallClass' value found!\n"); - RegCloseKey(hClassKey); - continue; - } - - if ((Flags & DIBCI_NODISPLAYCLASS) && - (!RegQueryValueExW(hClassKey, - L"NoDisplayClass", - NULL, - NULL, - NULL, - NULL))) - { - TRACE("'NoDisplayClass' value found!\n"); - RegCloseKey(hClassKey); - continue; - } - - RegCloseKey(hClassKey); - - TRACE("Guid: %p\n", szKeyName); - if (dwGuidListIndex < ClassGuidListSize) - { - if (szKeyName[0] == '{' && szKeyName[37] == '}') - { - szKeyName[37] = 0; - } - TRACE("Guid: %p\n", &szKeyName[1]); - - UuidFromStringW(&szKeyName[1], - &ClassGuidList[dwGuidListIndex]); - } - - dwGuidListIndex++; - } + len = 40; + err = RegEnumKeyExW(root_key, index, key_name, &len, NULL, NULL, NULL, NULL); + TRACE("RegEnumKeyExW() returns %ld\n", err); + if (err == ERROR_SUCCESS || err == ERROR_MORE_DATA) + { + TRACE("Key name: %p\n", key_name); + + if (RegOpenKeyExW(root_key, key_name, 0, KEY_ALL_ACCESS, &class_key)) + { + RegCloseKey(root_key); + return FALSE; + } - if (lError != ERROR_SUCCESS) - break; + if (!RegQueryValueExW(class_key, L"NoUseClass", NULL, NULL, NULL, NULL)) + { + TRACE("'NoUseClass' value found!\n"); + RegCloseKey(class_key); + continue; + } + + if ((flags & DIBCI_NOINSTALLCLASS) && + !RegQueryValueExW(class_key, L"NoInstallClass", NULL, NULL, NULL, NULL)) + { + TRACE("'NoInstallClass' value found!\n"); + RegCloseKey(class_key); + continue; + } + + if ((flags & DIBCI_NODISPLAYCLASS) && + !RegQueryValueExW(class_key, L"NoDisplayClass", NULL, NULL, NULL, NULL)) + { + TRACE("'NoDisplayClass' value found!\n"); + RegCloseKey(class_key); + continue; + } + + RegCloseKey(class_key); + + TRACE("Guid: %p\n", key_name); + if (guid_index < guids_size) + { + if (key_name[0] == '{' && key_name[37] == '}') + { + key_name[37] = 0; + } + TRACE("Guid: %p\n", &key_name[1]); + + UuidFromStringW(&key_name[1], &guids[guid_index]); + } + + guid_index++; + } + + if (err != ERROR_SUCCESS) + break; } - RegCloseKey(hClassesKey); + RegCloseKey(root_key); - if (RequiredSize != NULL) - *RequiredSize = dwGuidListIndex; + if (guid_count) + *guid_count = guid_index; - if (ClassGuidListSize < dwGuidListIndex) + if (guids_size < guid_index) { - SetLastError(ERROR_INSUFFICIENT_BUFFER); - return FALSE; + SetLastError(ERROR_INSUFFICIENT_BUFFER); + return FALSE; } return TRUE; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10149
From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/setupapi/devinst.c | 83 ++++++++++------------------------------- 1 file changed, 19 insertions(+), 64 deletions(-) diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c index ab259541517..10b2176c25f 100644 --- a/dlls/setupapi/devinst.c +++ b/dlls/setupapi/devinst.c @@ -946,10 +946,9 @@ BOOL WINAPI SetupDiBuildClassInfoListExA(DWORD flags, GUID *guids, DWORD guids_s BOOL WINAPI SetupDiBuildClassInfoListExW(DWORD flags, GUID *guids, DWORD guids_size, DWORD *guid_count, const WCHAR *machine_name, void *reserved) { - DWORD len, index, guid_index = 0; - HKEY root_key, class_key; - WCHAR key_name[40]; - LONG err; + DWORD guid_index = 0; + CONFIGRET ret; + GUID guid; TRACE("flags %#lx, guids %p, guids_size %#lx, guid_count %p, machine_name %s, reserved %p.\n", flags, guids, guids_size, guid_count, debugstr_w(machine_name), reserved); @@ -957,73 +956,29 @@ BOOL WINAPI SetupDiBuildClassInfoListExW(DWORD flags, GUID *guids, DWORD guids_s if (guid_count) *guid_count = 0; - root_key = SetupDiOpenClassRegKeyExW(NULL, KEY_ALL_ACCESS, DIOCR_INSTALLER, machine_name, reserved); - if (root_key == INVALID_HANDLE_VALUE) - { - return FALSE; - } - - for (index = 0;; index++) + for (UINT i = 0; !(ret = CM_Enumerate_Classes(i, &guid, CM_ENUMERATE_CLASSES_INSTALLER)); i++) { - len = 40; - err = RegEnumKeyExW(root_key, index, key_name, &len, NULL, NULL, NULL, NULL); - TRACE("RegEnumKeyExW() returns %ld\n", err); - if (err == ERROR_SUCCESS || err == ERROR_MORE_DATA) - { - TRACE("Key name: %p\n", key_name); - - if (RegOpenKeyExW(root_key, key_name, 0, KEY_ALL_ACCESS, &class_key)) - { - RegCloseKey(root_key); - return FALSE; - } - - if (!RegQueryValueExW(class_key, L"NoUseClass", NULL, NULL, NULL, NULL)) - { - TRACE("'NoUseClass' value found!\n"); - RegCloseKey(class_key); - continue; - } - - if ((flags & DIBCI_NOINSTALLCLASS) && - !RegQueryValueExW(class_key, L"NoInstallClass", NULL, NULL, NULL, NULL)) - { - TRACE("'NoInstallClass' value found!\n"); - RegCloseKey(class_key); - continue; - } - - if ((flags & DIBCI_NODISPLAYCLASS) && - !RegQueryValueExW(class_key, L"NoDisplayClass", NULL, NULL, NULL, NULL)) - { - TRACE("'NoDisplayClass' value found!\n"); - RegCloseKey(class_key); - continue; - } - - RegCloseKey(class_key); + DEVPROPTYPE type; + ULONG size; + BYTE value; - TRACE("Guid: %p\n", key_name); - if (guid_index < guids_size) - { - if (key_name[0] == '{' && key_name[37] == '}') - { - key_name[37] = 0; - } - TRACE("Guid: %p\n", &key_name[1]); + size = sizeof(value); + if (!CM_Get_Class_PropertyW(&guid, &DEVPKEY_DeviceClass_NoUseClass, &type, &value, &size, 0) && value) + continue; - UuidFromStringW(&key_name[1], &guids[guid_index]); - } + size = sizeof(value); + if ((flags & DIBCI_NOINSTALLCLASS) && !CM_Get_Class_PropertyW(&guid, &DEVPKEY_DeviceClass_NoInstallClass, &type, &value, &size, 0) && value) + continue; - guid_index++; - } + size = sizeof(value); + if ((flags & DIBCI_NOINSTALLCLASS) && !CM_Get_Class_PropertyW(&guid, &DEVPKEY_DeviceClass_NoDisplayClass, &type, &value, &size, 0) && value) + continue; - if (err != ERROR_SUCCESS) - break; + if (guid_index < guids_size) + guids[guid_index] = guid; + guid_index++; } - RegCloseKey(root_key); - if (guid_count) *guid_count = guid_index; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10149
participants (2)
-
Rémi Bernon -
Rémi Bernon (@rbernon)