| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/metrics/machine_id_provider.h" | 5 #include "components/metrics/machine_id_provider.h" |
| 6 | 6 |
| 7 #include <windows.h> | 7 #include <windows.h> |
| 8 #include <stdint.h> |
| 8 #include <winioctl.h> | 9 #include <winioctl.h> |
| 9 | 10 |
| 10 #include "base/base_paths.h" | 11 #include "base/base_paths.h" |
| 11 #include "base/files/file_path.h" | 12 #include "base/files/file_path.h" |
| 12 #include "base/path_service.h" | 13 #include "base/path_service.h" |
| 13 #include "base/threading/thread_restrictions.h" | 14 #include "base/threading/thread_restrictions.h" |
| 14 #include "base/win/scoped_handle.h" | 15 #include "base/win/scoped_handle.h" |
| 15 | 16 |
| 16 namespace metrics { | 17 namespace metrics { |
| 17 | 18 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 66 sizeof(STORAGE_PROPERTY_QUERY), | 67 sizeof(STORAGE_PROPERTY_QUERY), |
| 67 &header, | 68 &header, |
| 68 sizeof(STORAGE_DESCRIPTOR_HEADER), | 69 sizeof(STORAGE_DESCRIPTOR_HEADER), |
| 69 &bytes_returned, | 70 &bytes_returned, |
| 70 NULL); | 71 NULL); |
| 71 | 72 |
| 72 if (!status) | 73 if (!status) |
| 73 return std::string(); | 74 return std::string(); |
| 74 | 75 |
| 75 // Query for the actual serial number. | 76 // Query for the actual serial number. |
| 76 std::vector<int8> output_buf(header.Size); | 77 std::vector<int8_t> output_buf(header.Size); |
| 77 status = DeviceIoControl(drive_handle.Get(), | 78 status = DeviceIoControl(drive_handle.Get(), |
| 78 IOCTL_STORAGE_QUERY_PROPERTY, | 79 IOCTL_STORAGE_QUERY_PROPERTY, |
| 79 &query, | 80 &query, |
| 80 sizeof(STORAGE_PROPERTY_QUERY), | 81 sizeof(STORAGE_PROPERTY_QUERY), |
| 81 &output_buf[0], | 82 &output_buf[0], |
| 82 output_buf.size(), | 83 output_buf.size(), |
| 83 &bytes_returned, | 84 &bytes_returned, |
| 84 NULL); | 85 NULL); |
| 85 | 86 |
| 86 if (!status) | 87 if (!status) |
| 87 return std::string(); | 88 return std::string(); |
| 88 | 89 |
| 89 const STORAGE_DEVICE_DESCRIPTOR* device_descriptor = | 90 const STORAGE_DEVICE_DESCRIPTOR* device_descriptor = |
| 90 reinterpret_cast<STORAGE_DEVICE_DESCRIPTOR*>(&output_buf[0]); | 91 reinterpret_cast<STORAGE_DEVICE_DESCRIPTOR*>(&output_buf[0]); |
| 91 | 92 |
| 92 // The serial number is stored in the |output_buf| as a null-terminated | 93 // The serial number is stored in the |output_buf| as a null-terminated |
| 93 // string starting at the specified offset. | 94 // string starting at the specified offset. |
| 94 const DWORD offset = device_descriptor->SerialNumberOffset; | 95 const DWORD offset = device_descriptor->SerialNumberOffset; |
| 95 if (offset >= output_buf.size()) | 96 if (offset >= output_buf.size()) |
| 96 return std::string(); | 97 return std::string(); |
| 97 | 98 |
| 98 // Make sure that the null-terminator exists. | 99 // Make sure that the null-terminator exists. |
| 99 const std::vector<int8>::iterator serial_number_begin = | 100 const std::vector<int8_t>::iterator serial_number_begin = |
| 100 output_buf.begin() + offset; | 101 output_buf.begin() + offset; |
| 101 const std::vector<int8>::iterator null_location = | 102 const std::vector<int8_t>::iterator null_location = |
| 102 std::find(serial_number_begin, output_buf.end(), '\0'); | 103 std::find(serial_number_begin, output_buf.end(), '\0'); |
| 103 if (null_location == output_buf.end()) | 104 if (null_location == output_buf.end()) |
| 104 return std::string(); | 105 return std::string(); |
| 105 | 106 |
| 106 const char* serial_number = | 107 const char* serial_number = |
| 107 reinterpret_cast<const char*>(&output_buf[offset]); | 108 reinterpret_cast<const char*>(&output_buf[offset]); |
| 108 | 109 |
| 109 return std::string(serial_number); | 110 return std::string(serial_number); |
| 110 } | 111 } |
| 111 | 112 |
| 112 // static | 113 // static |
| 113 MachineIdProvider* MachineIdProvider::CreateInstance() { | 114 MachineIdProvider* MachineIdProvider::CreateInstance() { |
| 114 return new MachineIdProvider(); | 115 return new MachineIdProvider(); |
| 115 } | 116 } |
| 116 | 117 |
| 117 } // namespace metrics | 118 } // namespace metrics |
| OLD | NEW |