From 5e65536376ab4b2085cb34a69c6d01bb7fbf9ea8 Mon Sep 17 00:00:00 2001 From: Jordan Woyak Date: Tue, 14 Oct 2025 22:39:17 -0500 Subject: WindowsDevice: Add GetDeviceInterfaceList function and NullTerminatedStringList template. --- Source/Core/Common/WindowsDevice.cpp | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'Source/Core/Common/WindowsDevice.cpp') diff --git a/Source/Core/Common/WindowsDevice.cpp b/Source/Core/Common/WindowsDevice.cpp index 405ea5e25b..9102f24b93 100644 --- a/Source/Core/Common/WindowsDevice.cpp +++ b/Source/Core/Common/WindowsDevice.cpp @@ -83,6 +83,36 @@ std::optional GetDeviceInterfaceStringProperty(LPCWSTR iface, DEVPROP_TYPE_STRING); } +NullTerminatedStringList GetDeviceInterfaceList(LPGUID iface_class_guid, DEVINSTID device_id, + ULONG flags) +{ + while (true) + { + ULONG list_size = 0; + const auto size_result = + CM_Get_Device_Interface_List_Size(&list_size, iface_class_guid, device_id, flags); + if (size_result != CR_SUCCESS || list_size == 0) + list_size = 1; + + auto buffer = std::make_unique_for_overwrite(list_size); + const auto list_result = + CM_Get_Device_Interface_List(iface_class_guid, device_id, buffer.get(), list_size, flags); + + // "A new device can be added to the system causing the size returned to no longer be valid." + // Microsoft recommends trying again in a loop. + if (list_result == CR_BUFFER_SMALL) + continue; + + if (list_result != CR_SUCCESS) + { + ERROR_LOG_FMT(COMMON, "CM_Get_Device_Interface_List: {}", list_result); + buffer[0] = 0; + } + + return {std::move(buffer)}; + } +} + } // namespace Common #endif -- cgit v1.2.3