Merge pull request #13744 from JoshuaVandaele/windows-specific-getdevicename

Host: Implement a Windows-only implementation of `GetDeviceNameFromVIDPID`
This commit is contained in:
Jordan Woyak
2025-06-15 15:44:31 -05:00
committed by GitHub
4 changed files with 90 additions and 27 deletions

View File

@ -10,6 +10,7 @@
#ifdef _WIN32
#include <windows.h>
#include <SetupAPI.h>
#define strerror_r(err, buf, len) strerror_s(buf, len, err)
@ -91,5 +92,28 @@ std::optional<std::wstring> GetModuleName(void* hInstance)
name.resize(size);
return name;
}
std::wstring GetDeviceProperty(const HDEVINFO& device_info, const PSP_DEVINFO_DATA device_data,
const DEVPROPKEY* requested_property)
{
DWORD required_size = 0;
DEVPROPTYPE device_property_type;
BOOL result;
result = SetupDiGetDeviceProperty(device_info, device_data, requested_property,
&device_property_type, nullptr, 0, &required_size, 0);
if (!result && GetLastError() != ERROR_INSUFFICIENT_BUFFER)
return std::wstring();
std::vector<TCHAR> unicode_buffer(required_size / sizeof(TCHAR));
result = SetupDiGetDeviceProperty(
device_info, device_data, requested_property, &device_property_type,
reinterpret_cast<PBYTE>(unicode_buffer.data()), required_size, nullptr, 0);
if (!result)
return std::wstring();
return std::wstring(unicode_buffer.data());
}
#endif
} // namespace Common

View File

@ -5,6 +5,12 @@
#include <optional>
#include <string>
#ifdef _WIN32
#include <SetupAPI.h>
#include <cfgmgr32.h>
#include <devpropdef.h>
#endif
#include "Common/CommonTypes.h"
#ifndef _WIN32
@ -58,5 +64,9 @@ std::string GetWin32ErrorString(unsigned long error_code);
// Obtains a full path to the specified module.
std::optional<std::wstring> GetModuleName(void* hInstance);
// Obtains a device property and returns it as a wide string.
std::wstring GetDeviceProperty(const HANDLE& device_info, const PSP_DEVINFO_DATA device_data,
const DEVPROPKEY* requested_property);
#endif
} // namespace Common