[PATCH 0/5] MR10242: setupapi: Implement more functions on top of cfgmgr32.
From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/setupapi/devinst.c | 101 +++++++++++++++------------------------- 1 file changed, 37 insertions(+), 64 deletions(-) diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c index 10b2176c25f..7598c5cce18 100644 --- a/dlls/setupapi/devinst.c +++ b/dlls/setupapi/devinst.c @@ -1864,96 +1864,69 @@ BOOL WINAPI SetupDiGetActualSectionToInstallW(HINF hinf, const WCHAR *section, W /*********************************************************************** * SetupDiGetClassDescriptionA (SETUPAPI.@) */ -BOOL WINAPI SetupDiGetClassDescriptionA( - const GUID* ClassGuid, - PSTR ClassDescription, - DWORD ClassDescriptionSize, - PDWORD RequiredSize) +BOOL WINAPI SetupDiGetClassDescriptionA(const GUID *class, char *buffer, DWORD buffer_len, DWORD *required_len) { - return SetupDiGetClassDescriptionExA(ClassGuid, ClassDescription, - ClassDescriptionSize, - RequiredSize, NULL, NULL); + return SetupDiGetClassDescriptionExA(class, buffer, buffer_len, required_len, NULL, NULL); } /*********************************************************************** * SetupDiGetClassDescriptionW (SETUPAPI.@) */ -BOOL WINAPI SetupDiGetClassDescriptionW( - const GUID* ClassGuid, - PWSTR ClassDescription, - DWORD ClassDescriptionSize, - PDWORD RequiredSize) +BOOL WINAPI SetupDiGetClassDescriptionW(const GUID *class, PWSTR buffer, DWORD buffer_len, DWORD *required_len) { - return SetupDiGetClassDescriptionExW(ClassGuid, ClassDescription, - ClassDescriptionSize, - RequiredSize, NULL, NULL); + return SetupDiGetClassDescriptionExW(class, buffer, buffer_len, required_len, NULL, NULL); } /*********************************************************************** * SetupDiGetClassDescriptionExA (SETUPAPI.@) */ -BOOL WINAPI SetupDiGetClassDescriptionExA( - const GUID* ClassGuid, - PSTR ClassDescription, - DWORD ClassDescriptionSize, - PDWORD RequiredSize, - PCSTR MachineName, - PVOID Reserved) +BOOL WINAPI SetupDiGetClassDescriptionExA(const GUID *class, char *buffer, DWORD buffer_len, + DWORD *required_len, const char *machine_nameA, void *reserved) { - HKEY hKey; - DWORD dwLength; - LSTATUS ls; + WCHAR *bufferW, *machine_nameW = strdupAtoW(machine_nameA); + ULONG lenW = 0, lenA = *required_len; + BOOL ret; - hKey = SetupDiOpenClassRegKeyExA(ClassGuid, - KEY_ALL_ACCESS, - DIOCR_INSTALLER, - MachineName, - Reserved); - if (hKey == INVALID_HANDLE_VALUE) - { - WARN("SetupDiOpenClassRegKeyExA() failed (Error %lu)\n", GetLastError()); - return FALSE; - } + TRACE("class %s, buffer %p, buffer_len %#lx, required_len %p, machine_nameA %s, reserved %p.\n", + debugstr_guid(class), buffer, buffer_len, required_len, debugstr_a(machine_nameA), reserved); - dwLength = ClassDescriptionSize; - ls = RegQueryValueExA(hKey, NULL, NULL, NULL, (BYTE *)ClassDescription, &dwLength); - RegCloseKey(hKey); - if ((!ls || ls == ERROR_MORE_DATA) && RequiredSize) - *RequiredSize = dwLength; - return !ls; + ret = SetupDiGetClassDescriptionExW(class, NULL, 0, &lenW, machine_nameW, reserved); + bufferW = lenW ? malloc(lenW) : NULL; + if (bufferW && (ret = SetupDiGetClassDescriptionExW(class, bufferW, lenW, &lenW, machine_nameW, reserved)) && lenW) + lenA = WideCharToMultiByte(CP_ACP, 0, bufferW, lenW, buffer, buffer_len, NULL, NULL); + free(bufferW); + free(machine_nameW); + + if (required_len) + *required_len = lenA; + return ret && buffer_len >= lenA; } /*********************************************************************** * SetupDiGetClassDescriptionExW (SETUPAPI.@) */ -BOOL WINAPI SetupDiGetClassDescriptionExW( - const GUID* ClassGuid, - PWSTR ClassDescription, - DWORD ClassDescriptionSize, - PDWORD RequiredSize, - PCWSTR MachineName, - PVOID Reserved) +BOOL WINAPI SetupDiGetClassDescriptionExW(const GUID *class, WCHAR *buffer, DWORD buffer_len, + DWORD *required_len, const WCHAR *machine_name, void *reserved) { - HKEY hKey; - DWORD dwLength; + HKEY hkey; + DWORD len; LSTATUS ls; - hKey = SetupDiOpenClassRegKeyExW(ClassGuid, - KEY_ALL_ACCESS, - DIOCR_INSTALLER, - MachineName, - Reserved); - if (hKey == INVALID_HANDLE_VALUE) + TRACE("class %s, buffer %p, buffer_len %#lx, required_len %p, machine_name %s, reserved %p.\n", + debugstr_guid(class), buffer, buffer_len, required_len, debugstr_w(machine_name), reserved); + + hkey = SetupDiOpenClassRegKeyExW(class, KEY_ALL_ACCESS, DIOCR_INSTALLER, machine_name, reserved); + if (hkey == INVALID_HANDLE_VALUE) { - WARN("SetupDiOpenClassRegKeyExW() failed (Error %lu)\n", GetLastError()); - return FALSE; + WARN("SetupDiOpenClassRegKeyExW() failed (Error %lu)\n", GetLastError()); + return FALSE; } - dwLength = ClassDescriptionSize * sizeof(WCHAR); - ls = RegQueryValueExW(hKey, NULL, NULL, NULL, (BYTE *)ClassDescription, &dwLength); - RegCloseKey(hKey); - if ((!ls || ls == ERROR_MORE_DATA) && RequiredSize) - *RequiredSize = dwLength / sizeof(WCHAR); + len = buffer_len * sizeof(WCHAR); + ls = RegQueryValueExW(hkey, NULL, NULL, NULL, (BYTE *)buffer, &len); + RegCloseKey(hkey); + if ((!ls || ls == ERROR_MORE_DATA) && required_len) + *required_len = len / sizeof(WCHAR); return !ls; } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10242
From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/setupapi/devinst.c | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c index 7598c5cce18..fa8067725be 100644 --- a/dlls/setupapi/devinst.c +++ b/dlls/setupapi/devinst.c @@ -1908,26 +1908,19 @@ BOOL WINAPI SetupDiGetClassDescriptionExA(const GUID *class, char *buffer, DWORD BOOL WINAPI SetupDiGetClassDescriptionExW(const GUID *class, WCHAR *buffer, DWORD buffer_len, DWORD *required_len, const WCHAR *machine_name, void *reserved) { - HKEY hkey; - DWORD len; - LSTATUS ls; + DEVPROPTYPE type; + CONFIGRET ret; + ULONG size; TRACE("class %s, buffer %p, buffer_len %#lx, required_len %p, machine_name %s, reserved %p.\n", debugstr_guid(class), buffer, buffer_len, required_len, debugstr_w(machine_name), reserved); - hkey = SetupDiOpenClassRegKeyExW(class, KEY_ALL_ACCESS, DIOCR_INSTALLER, machine_name, reserved); - if (hkey == INVALID_HANDLE_VALUE) - { - WARN("SetupDiOpenClassRegKeyExW() failed (Error %lu)\n", GetLastError()); - return FALSE; - } + size = buffer_len * sizeof(WCHAR); + ret = CM_Get_Class_PropertyW(class, &DEVPKEY_DeviceClass_Name, &type, (BYTE *)buffer, &size, 0); + if ((!ret || ret == CR_BUFFER_SMALL) && required_len) + *required_len = size / sizeof(WCHAR); - len = buffer_len * sizeof(WCHAR); - ls = RegQueryValueExW(hkey, NULL, NULL, NULL, (BYTE *)buffer, &len); - RegCloseKey(hkey); - if ((!ls || ls == ERROR_MORE_DATA) && required_len) - *required_len = len / sizeof(WCHAR); - return !ls; + return !ret; } /*********************************************************************** -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10242
From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/setupapi/devinst.c | 200 ------------------------------------ dlls/setupapi/setupapi.spec | 16 +-- 2 files changed, 8 insertions(+), 208 deletions(-) diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c index fa8067725be..bb06423f789 100644 --- a/dlls/setupapi/devinst.c +++ b/dlls/setupapi/devinst.c @@ -4562,206 +4562,6 @@ CONFIGRET WINAPI CM_Get_Device_ID_List_SizeA(ULONG *len, const char *filter, ULO return CM_Get_Device_ID_List_Size_ExA(len, filter, flags, NULL); } -static CONFIGRET get_device_interface_list(const GUID *class_guid, DEVINSTID_W device_id, WCHAR *buffer, ULONG *len, - ULONG flags) -{ - const ULONG supported_flags = CM_GET_DEVICE_INTERFACE_LIST_ALL_DEVICES; - - SP_DEVICE_INTERFACE_DATA iface = {sizeof(iface)}; - SP_DEVINFO_DATA device = { sizeof(device) }; - ULONG query_flags = DIGCF_DEVICEINTERFACE; - unsigned int i, id_len; - HDEVINFO set; - ULONG needed; - WCHAR *p; - - if (!len || (buffer && !*len)) - return CR_INVALID_POINTER; - - needed = 1; - - if (buffer) - *buffer = 0; - if (flags & ~supported_flags) - FIXME("Flags %#lx are not supported.\n", flags); - - if (!buffer) - *len = 0; - - if (!buffer) - *len = needed; - - if (!(flags & CM_GET_DEVICE_INTERFACE_LIST_ALL_DEVICES)) query_flags |= DIGCF_PRESENT; - set = SetupDiGetClassDevsW(class_guid, device_id, NULL, query_flags); - if (set == INVALID_HANDLE_VALUE) - return CR_SUCCESS; - - p = buffer; - for (i = 0; SetupDiEnumDeviceInterfaces(set, NULL, class_guid, i, &iface); ++i) - { - struct device_iface *device_iface; - device_iface = get_device_iface(set, &iface); - id_len = wcslen(device_iface->symlink) + 1; - needed += id_len; - if (buffer) - { - if (needed > *len) - { - SetupDiDestroyDeviceInfoList(set); - *buffer = 0; - return CR_BUFFER_SMALL; - } - memcpy(p, device_iface->symlink, sizeof(*p) * id_len); - p += id_len; - } - } - SetupDiDestroyDeviceInfoList(set); - *len = needed; - if (buffer) - *p = 0; - return CR_SUCCESS; -} - -/*********************************************************************** - * CM_Get_Device_Interface_List_Size_ExW (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Get_Device_Interface_List_Size_ExW(PULONG len, LPGUID class, DEVINSTID_W id, - ULONG flags, HMACHINE machine) -{ - TRACE("%p %s %s 0x%08lx %p\n", len, debugstr_guid(class), debugstr_w(id), flags, machine); - - if (machine) - FIXME("machine %p.\n", machine); - - return get_device_interface_list(class, id, NULL, len, flags); -} - -/*********************************************************************** - * CM_Get_Device_Interface_List_SizeW (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Get_Device_Interface_List_SizeW(PULONG len, LPGUID class, DEVINSTID_W id, ULONG flags) -{ - TRACE("%p %s %s 0x%08lx\n", len, debugstr_guid(class), debugstr_w(id), flags); - return get_device_interface_list(class, id, NULL, len, flags); -} - -/*********************************************************************** - * CM_Get_Device_Interface_List_W (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Get_Device_Interface_List_ExW(LPGUID class, DEVINSTID_W id, PZZWSTR buffer, ULONG len, ULONG flags, - HMACHINE machine) -{ - TRACE("%s %s %p %lu %#lx\n", debugstr_guid(class), debugstr_w(id), buffer, len, flags); - - if (machine) - FIXME("machine %p.\n", machine); - - return get_device_interface_list(class, id, buffer, &len, flags); -} - -/*********************************************************************** - * CM_Get_Device_Interface_List_W (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Get_Device_Interface_ListW(LPGUID class, DEVINSTID_W id, PZZWSTR buffer, ULONG len, ULONG flags) -{ - TRACE("%s %s %p %lu %#lx\n", debugstr_guid(class), debugstr_w(id), buffer, len, flags); - - return get_device_interface_list(class, id, buffer, &len, flags); -} - -/*********************************************************************** - * CM_Get_Device_Interface_List_SizeA (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Get_Device_Interface_List_SizeA(PULONG len, LPGUID class, DEVINSTID_A id, - ULONG flags) -{ - return CM_Get_Device_Interface_List_Size_ExA(len, class, id, flags, NULL); -} - -/*********************************************************************** - * CM_Get_Device_Interface_List_Size_ExA (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Get_Device_Interface_List_Size_ExA(PULONG len, LPGUID class, DEVINSTID_A id, - ULONG flags, HMACHINE machine) -{ - WCHAR *wid = NULL; - unsigned int slen; - CONFIGRET ret; - - TRACE("%p %s %s 0x%08lx %p\n", len, debugstr_guid(class), debugstr_a(id), flags, machine); - - if (machine) - FIXME("machine %p.\n", machine); - - if (id) - { - slen = strlen(id) + 1; - if (!(wid = malloc(slen * sizeof(*wid)))) - return CR_OUT_OF_MEMORY; - MultiByteToWideChar(CP_ACP, 0, id, slen, wid, slen); - } - ret = CM_Get_Device_Interface_List_SizeW(len, class, wid, flags); - free(wid); - return ret; -} - -/*********************************************************************** - * CM_Get_Device_Interface_List_ExA (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Get_Device_Interface_List_ExA(LPGUID class, DEVINSTID_A id, PZZSTR buffer, ULONG len, ULONG flags, - HMACHINE machine) -{ - WCHAR *wbuffer, *wid = NULL, *p; - unsigned int slen; - CONFIGRET ret; - - TRACE("%s %s %p %lu 0x%08lx %p\n", debugstr_guid(class), debugstr_a(id), buffer, len, flags, machine); - - if (machine) - FIXME("machine %p.\n", machine); - - if (!buffer || !len) - return CR_INVALID_POINTER; - - if (!(wbuffer = malloc(len * sizeof(*wbuffer)))) - return CR_OUT_OF_MEMORY; - - if (id) - { - slen = strlen(id) + 1; - if (!(wid = malloc(slen * sizeof(*wid)))) - { - free(wbuffer); - return CR_OUT_OF_MEMORY; - } - MultiByteToWideChar(CP_ACP, 0, id, slen, wid, slen); - } - - if (!(ret = CM_Get_Device_Interface_List_ExW(class, wid, wbuffer, len, flags, machine))) - { - p = wbuffer; - while (*p) - { - slen = wcslen(p) + 1; - WideCharToMultiByte(CP_ACP, 0, p, slen, buffer, slen, NULL, NULL); - p += slen; - buffer += slen; - } - *buffer = 0; - } - free(wid); - free(wbuffer); - return ret; -} - -/*********************************************************************** - * CM_Get_Device_Interface_ListA (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Get_Device_Interface_ListA(LPGUID class, DEVINSTID_A id, PZZSTR buffer, ULONG len, ULONG flags) -{ - return CM_Get_Device_Interface_List_ExA(class, id, buffer, len, flags, NULL); -} - /*********************************************************************** * SetupDiGetINFClassA (SETUPAPI.@) */ diff --git a/dlls/setupapi/setupapi.spec b/dlls/setupapi/setupapi.spec index a690d6538b3..6bfe922a1d7 100644 --- a/dlls/setupapi/setupapi.spec +++ b/dlls/setupapi/setupapi.spec @@ -93,14 +93,14 @@ @ stdcall CM_Get_Device_Interface_AliasW(wstr ptr ptr ptr long) @ stub CM_Get_Device_Interface_Alias_ExA @ stub CM_Get_Device_Interface_Alias_ExW -@ stdcall CM_Get_Device_Interface_ListA(ptr ptr ptr long long) -@ stdcall CM_Get_Device_Interface_ListW(ptr ptr ptr long long) -@ stdcall CM_Get_Device_Interface_List_ExA(ptr ptr ptr long long ptr) -@ stdcall CM_Get_Device_Interface_List_ExW(ptr ptr ptr long long ptr) -@ stdcall CM_Get_Device_Interface_List_SizeA(ptr ptr str long) -@ stdcall CM_Get_Device_Interface_List_SizeW(ptr ptr wstr long) -@ stdcall CM_Get_Device_Interface_List_Size_ExA(ptr ptr str long ptr) -@ stdcall CM_Get_Device_Interface_List_Size_ExW(ptr ptr wstr long ptr) +@ stdcall CM_Get_Device_Interface_ListA(ptr ptr ptr long long) cfgmgr32.CM_Get_Device_Interface_ListA +@ stdcall CM_Get_Device_Interface_ListW(ptr ptr ptr long long) cfgmgr32.CM_Get_Device_Interface_ListW +@ stdcall CM_Get_Device_Interface_List_ExA(ptr ptr ptr long long ptr) cfgmgr32.CM_Get_Device_Interface_List_ExA +@ stdcall CM_Get_Device_Interface_List_ExW(ptr ptr ptr long long ptr) cfgmgr32.CM_Get_Device_Interface_List_ExW +@ stdcall CM_Get_Device_Interface_List_SizeA(ptr ptr str long) cfgmgr32.CM_Get_Device_Interface_List_SizeA +@ stdcall CM_Get_Device_Interface_List_SizeW(ptr ptr wstr long) cfgmgr32.CM_Get_Device_Interface_List_SizeW +@ stdcall CM_Get_Device_Interface_List_Size_ExA(ptr ptr str long ptr) cfgmgr32.CM_Get_Device_Interface_List_Size_ExA +@ stdcall CM_Get_Device_Interface_List_Size_ExW(ptr ptr wstr long ptr) cfgmgr32.CM_Get_Device_Interface_List_Size_ExW @ stub CM_Get_First_Log_Conf @ stub CM_Get_First_Log_Conf_Ex @ stub CM_Get_Global_State -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10242
From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/setupapi/devinst.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c index bb06423f789..424115d3313 100644 --- a/dlls/setupapi/devinst.c +++ b/dlls/setupapi/devinst.c @@ -872,7 +872,7 @@ static struct device *create_device(struct DeviceInfoSet *set, device->phantom = phantom; list_init(&device->interfaces); device->class = *class; - device->devnode = alloc_devinst_for_device_id(device->instanceId); + CM_Locate_DevNodeW(&device->devnode, device->instanceId, 0); device->removed = FALSE; list_add_tail(&set->devices, &device->entry); device->params.cbSize = sizeof(SP_DEVINSTALL_PARAMS_W); @@ -4319,7 +4319,8 @@ CONFIGRET WINAPI CM_Locate_DevNode_ExA(DEVINST *devinst, DEVINSTID_A device_id, */ CONFIGRET WINAPI CM_Locate_DevNode_ExW(DEVINST *devinst, DEVINSTID_W device_id, ULONG flags, HMACHINE machine) { - DEVINST ret; + HKEY enum_hkey, device_hkey; + LSTATUS status; TRACE("%p %s %#lx %p.\n", devinst, debugstr_w(device_id), flags, machine); @@ -4339,13 +4340,15 @@ CONFIGRET WINAPI CM_Locate_DevNode_ExW(DEVINST *devinst, DEVINSTID_W device_id, return CR_CALL_NOT_IMPLEMENTED; } - if ((ret = get_devinst_for_device_id(device_id)) < devinst_table_size && devinst_table[ret]) - { - *devinst = ret; - return CR_SUCCESS; - } + RegCreateKeyExW(HKEY_LOCAL_MACHINE, Enum, 0, NULL, 0, KEY_READ, NULL, &enum_hkey, NULL); + if (!(status = RegOpenKeyExW(enum_hkey, device_id, 0, KEY_READ, &device_hkey))) + RegCloseKey(device_hkey); + RegCloseKey(enum_hkey); + if (status) + return CR_NO_SUCH_DEVNODE; - return CR_NO_SUCH_DEVNODE; + *devinst = alloc_devinst_for_device_id(device_id); + return CR_SUCCESS; } static CONFIGRET get_device_id_list(const WCHAR *filter, WCHAR *buffer, ULONG *len, ULONG flags) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10242
From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/setupapi/devinst.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c index 424115d3313..de628d81bd2 100644 --- a/dlls/setupapi/devinst.c +++ b/dlls/setupapi/devinst.c @@ -896,9 +896,11 @@ static struct device *create_device(struct DeviceInfoSet *set, static struct device *get_devnode_device(DEVINST devnode, HDEVINFO *set, SP_DEVINFO_DATA *data) { + WCHAR instance_id[MAX_PATH]; + data->cbSize = sizeof(*data); *set = NULL; - if (devnode >= devinst_table_size || !devinst_table[devnode]) + if (CM_Get_Device_IDW(devnode, instance_id, ARRAY_SIZE(instance_id), 0)) { WARN("device node %lu not found\n", devnode); return NULL; @@ -906,7 +908,7 @@ static struct device *get_devnode_device(DEVINST devnode, HDEVINFO *set, SP_DEVI *set = SetupDiCreateDeviceInfoListExW(NULL, NULL, NULL, NULL); if (*set == INVALID_HANDLE_VALUE) return NULL; - if (!SetupDiOpenDeviceInfoW(*set, devinst_table[devnode], NULL, 0, data)) + if (!SetupDiOpenDeviceInfoW(*set, instance_id, NULL, 0, data)) { SetupDiDestroyDeviceInfoList(*set); *set = NULL; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10242
participants (2)
-
Rémi Bernon -
Rémi Bernon (@rbernon)