| Index: device/usb/usb_service_impl.cc
|
| diff --git a/device/usb/usb_service_impl.cc b/device/usb/usb_service_impl.cc
|
| index dd5cc9054d1adbd5977b0049efec672239a004c7..97700078d0d6e5aa113a7b36031924f719777818 100644
|
| --- a/device/usb/usb_service_impl.cc
|
| +++ b/device/usb/usb_service_impl.cc
|
| @@ -27,6 +27,7 @@
|
| #include <usbiodef.h>
|
|
|
| #include "base/strings/string_util.h"
|
| +#include "device/core/device_info_query_win.h"
|
| #endif // OS_WIN
|
|
|
| #if defined(USE_UDEV)
|
| @@ -53,96 +54,33 @@ const int kControlTransferTimeout = 60000; // 1 minute
|
|
|
| #if defined(OS_WIN)
|
|
|
| -// Wrapper around a HDEVINFO that automatically destroys it.
|
| -class ScopedDeviceInfoList {
|
| - public:
|
| - explicit ScopedDeviceInfoList(HDEVINFO handle) : handle_(handle) {}
|
| -
|
| - ~ScopedDeviceInfoList() {
|
| - if (valid()) {
|
| - SetupDiDestroyDeviceInfoList(handle_);
|
| - }
|
| - }
|
| -
|
| - bool valid() { return handle_ != INVALID_HANDLE_VALUE; }
|
| -
|
| - HDEVINFO get() { return handle_; }
|
| -
|
| - private:
|
| - HDEVINFO handle_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(ScopedDeviceInfoList);
|
| -};
|
| -
|
| -// Wrapper around an SP_DEVINFO_DATA that initializes it properly and
|
| -// automatically deletes it.
|
| -class ScopedDeviceInfo {
|
| - public:
|
| - ScopedDeviceInfo() {
|
| - memset(&dev_info_data_, 0, sizeof(dev_info_data_));
|
| - dev_info_data_.cbSize = sizeof(dev_info_data_);
|
| - }
|
| -
|
| - ~ScopedDeviceInfo() {
|
| - if (dev_info_set_ != INVALID_HANDLE_VALUE) {
|
| - SetupDiDeleteDeviceInfo(dev_info_set_, &dev_info_data_);
|
| - }
|
| - }
|
| -
|
| - // Once the SP_DEVINFO_DATA has been populated it must be freed using the
|
| - // HDEVINFO it was created from.
|
| - void set_valid(HDEVINFO dev_info_set) {
|
| - DCHECK(dev_info_set_ == INVALID_HANDLE_VALUE);
|
| - DCHECK(dev_info_set != INVALID_HANDLE_VALUE);
|
| - dev_info_set_ = dev_info_set;
|
| - }
|
| -
|
| - PSP_DEVINFO_DATA get() { return &dev_info_data_; }
|
| -
|
| - private:
|
| - HDEVINFO dev_info_set_ = INVALID_HANDLE_VALUE;
|
| - SP_DEVINFO_DATA dev_info_data_;
|
| -};
|
| -
|
| bool IsWinUsbInterface(const std::string& device_path) {
|
| - ScopedDeviceInfoList dev_info_list(SetupDiCreateDeviceInfoList(NULL, NULL));
|
| - if (!dev_info_list.valid()) {
|
| + DeviceInfoQueryWin device_info_query;
|
| + if (!device_info_query.device_info_list_valid()) {
|
| USB_PLOG(ERROR) << "Failed to create a device information set";
|
| return false;
|
| }
|
|
|
| - // This will add the device to |dev_info_list| so we can query driver info.
|
| - if (!SetupDiOpenDeviceInterfaceA(dev_info_list.get(), device_path.c_str(), 0,
|
| - NULL)) {
|
| + // This will add the device so we can query driver info.
|
| + if (!device_info_query.AddDevice(device_path.c_str())) {
|
| USB_PLOG(ERROR) << "Failed to get device interface data for "
|
| << device_path;
|
| return false;
|
| }
|
|
|
| - ScopedDeviceInfo dev_info;
|
| - if (!SetupDiEnumDeviceInfo(dev_info_list.get(), 0, dev_info.get())) {
|
| + if (!device_info_query.GetDeviceInfo()) {
|
| USB_PLOG(ERROR) << "Failed to get device info for " << device_path;
|
| return false;
|
| }
|
| - dev_info.set_valid(dev_info_list.get());
|
|
|
| - DWORD reg_data_type;
|
| - BYTE buffer[256];
|
| - if (!SetupDiGetDeviceRegistryPropertyA(dev_info_list.get(), dev_info.get(),
|
| - SPDRP_SERVICE, ®_data_type,
|
| - &buffer[0], sizeof buffer, NULL)) {
|
| + std::string buffer;
|
| + if (!device_info_query.GetDeviceStringProperty(SPDRP_SERVICE, &buffer)) {
|
| USB_PLOG(ERROR) << "Failed to get device service property";
|
| return false;
|
| }
|
| - if (reg_data_type != REG_SZ) {
|
| - USB_LOG(ERROR) << "Unexpected data type for driver service: "
|
| - << reg_data_type;
|
| - return false;
|
| - }
|
|
|
| USB_LOG(DEBUG) << "Driver for " << device_path << " is " << buffer << ".";
|
| - if (base::StartsWith(reinterpret_cast<const char*>(buffer), "WinUSB",
|
| - base::CompareCase::INSENSITIVE_ASCII))
|
| + if (base::StartsWith(buffer, "WinUSB", base::CompareCase::INSENSITIVE_ASCII))
|
| return true;
|
| return false;
|
| }
|
|
|