device_info_query_win.cc 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // Copyright 2015 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "device/base/device_info_query_win.h"
  5. #include <stddef.h>
  6. #include <string.h>
  7. #include "base/strings/string_util.h"
  8. #include "base/strings/utf_string_conversions.h"
  9. namespace device {
  10. DeviceInfoQueryWin::DeviceInfoQueryWin()
  11. : device_info_list_(SetupDiCreateDeviceInfoList(nullptr, nullptr)) {
  12. memset(&device_info_data_, 0, sizeof(device_info_data_));
  13. }
  14. DeviceInfoQueryWin::~DeviceInfoQueryWin() {
  15. if (device_info_list_valid()) {
  16. // Release |device_info_data_| only when it is valid.
  17. if (device_info_data_.cbSize != 0)
  18. SetupDiDeleteDeviceInfo(device_info_list_, &device_info_data_);
  19. SetupDiDestroyDeviceInfoList(device_info_list_);
  20. }
  21. }
  22. bool DeviceInfoQueryWin::AddDevice(const std::wstring& device_path) {
  23. return SetupDiOpenDeviceInterface(device_info_list_, device_path.c_str(), 0,
  24. nullptr) != FALSE;
  25. }
  26. bool DeviceInfoQueryWin::GetDeviceInfo() {
  27. DCHECK_EQ(0U, device_info_data_.cbSize);
  28. device_info_data_.cbSize = sizeof(device_info_data_);
  29. if (!SetupDiEnumDeviceInfo(device_info_list_, 0, &device_info_data_)) {
  30. // Clear cbSize to maintain the invariant.
  31. device_info_data_.cbSize = 0;
  32. return false;
  33. }
  34. return true;
  35. }
  36. bool DeviceInfoQueryWin::GetDeviceStringProperty(const DEVPROPKEY& property,
  37. std::string* property_buffer) {
  38. DEVPROPTYPE property_type;
  39. DWORD required_size;
  40. if (SetupDiGetDeviceProperty(device_info_list_, &device_info_data_, &property,
  41. &property_type, nullptr, 0, &required_size, 0) ||
  42. GetLastError() != ERROR_INSUFFICIENT_BUFFER ||
  43. property_type != DEVPROP_TYPE_STRING) {
  44. return false;
  45. }
  46. std::u16string buffer;
  47. if (!SetupDiGetDeviceProperty(
  48. device_info_list_, &device_info_data_, &property, &property_type,
  49. reinterpret_cast<PBYTE>(base::WriteInto(&buffer, required_size)),
  50. required_size, nullptr, 0)) {
  51. return false;
  52. }
  53. *property_buffer = base::UTF16ToUTF8(buffer);
  54. return true;
  55. }
  56. } // namespace device