| 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/storage_monitor/volume_mount_watcher_win.h" | 5 #include "components/storage_monitor/volume_mount_watcher_win.h" |
| 6 | 6 |
| 7 #include <windows.h> | 7 #include <windows.h> |
| 8 #include <stddef.h> |
| 9 #include <stdint.h> |
| 8 | 10 |
| 9 #include <dbt.h> | 11 #include <dbt.h> |
| 10 #include <fileapi.h> | 12 #include <fileapi.h> |
| 11 #include <shlobj.h> | 13 #include <shlobj.h> |
| 12 #include <winioctl.h> | 14 #include <winioctl.h> |
| 13 | 15 |
| 14 #include "base/bind_helpers.h" | 16 #include "base/bind_helpers.h" |
| 15 #include "base/metrics/histogram.h" | 17 #include "base/metrics/histogram.h" |
| 16 #include "base/stl_util.h" | 18 #include "base/stl_util.h" |
| 17 #include "base/strings/string_number_conversions.h" | 19 #include "base/strings/string_number_conversions.h" |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 86 return FLOPPY; | 88 return FLOPPY; |
| 87 if (device_path.find(L"Floppy") != base::string16::npos || | 89 if (device_path.find(L"Floppy") != base::string16::npos || |
| 88 device_path_slash.find(L"Floppy") != base::string16::npos) { | 90 device_path_slash.find(L"Floppy") != base::string16::npos) { |
| 89 return FLOPPY; | 91 return FLOPPY; |
| 90 } | 92 } |
| 91 | 93 |
| 92 return REMOVABLE; | 94 return REMOVABLE; |
| 93 } | 95 } |
| 94 | 96 |
| 95 // Returns 0 if the devicetype is not volume. | 97 // Returns 0 if the devicetype is not volume. |
| 96 uint32 GetVolumeBitMaskFromBroadcastHeader(LPARAM data) { | 98 uint32_t GetVolumeBitMaskFromBroadcastHeader(LPARAM data) { |
| 97 DEV_BROADCAST_VOLUME* dev_broadcast_volume = | 99 DEV_BROADCAST_VOLUME* dev_broadcast_volume = |
| 98 reinterpret_cast<DEV_BROADCAST_VOLUME*>(data); | 100 reinterpret_cast<DEV_BROADCAST_VOLUME*>(data); |
| 99 if (dev_broadcast_volume->dbcv_devicetype == DBT_DEVTYP_VOLUME) | 101 if (dev_broadcast_volume->dbcv_devicetype == DBT_DEVTYP_VOLUME) |
| 100 return dev_broadcast_volume->dbcv_unitmask; | 102 return dev_broadcast_volume->dbcv_unitmask; |
| 101 return 0; | 103 return 0; |
| 102 } | 104 } |
| 103 | 105 |
| 104 // Returns true if |data| represents a logical volume structure. | 106 // Returns true if |data| represents a logical volume structure. |
| 105 bool IsLogicalVolumeStructure(LPARAM data) { | 107 bool IsLogicalVolumeStructure(LPARAM data) { |
| 106 DEV_BROADCAST_HDR* broadcast_hdr = | 108 DEV_BROADCAST_HDR* broadcast_hdr = |
| 107 reinterpret_cast<DEV_BROADCAST_HDR*>(data); | 109 reinterpret_cast<DEV_BROADCAST_HDR*>(data); |
| 108 return broadcast_hdr != NULL && | 110 return broadcast_hdr != NULL && |
| 109 broadcast_hdr->dbch_devicetype == DBT_DEVTYP_VOLUME; | 111 broadcast_hdr->dbch_devicetype == DBT_DEVTYP_VOLUME; |
| 110 } | 112 } |
| 111 | 113 |
| 112 // Gets the total volume of the |mount_point| in bytes. | 114 // Gets the total volume of the |mount_point| in bytes. |
| 113 uint64 GetVolumeSize(const base::string16& mount_point) { | 115 uint64_t GetVolumeSize(const base::string16& mount_point) { |
| 114 ULARGE_INTEGER total; | 116 ULARGE_INTEGER total; |
| 115 if (!GetDiskFreeSpaceExW(mount_point.c_str(), NULL, &total, NULL)) | 117 if (!GetDiskFreeSpaceExW(mount_point.c_str(), NULL, &total, NULL)) |
| 116 return 0; | 118 return 0; |
| 117 return total.QuadPart; | 119 return total.QuadPart; |
| 118 } | 120 } |
| 119 | 121 |
| 120 // Gets mass storage device information given a |device_path|. On success, | 122 // Gets mass storage device information given a |device_path|. On success, |
| 121 // returns true and fills in |info|. | 123 // returns true and fills in |info|. |
| 122 // The following msdn blog entry is helpful for understanding disk volumes | 124 // The following msdn blog entry is helpful for understanding disk volumes |
| 123 // and how they are treated in Windows: | 125 // and how they are treated in Windows: |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 165 type = StorageInfo::REMOVABLE_MASS_STORAGE_WITH_DCIM; | 167 type = StorageInfo::REMOVABLE_MASS_STORAGE_WITH_DCIM; |
| 166 } | 168 } |
| 167 | 169 |
| 168 // NOTE: experimentally, this function returns false if there is no volume | 170 // NOTE: experimentally, this function returns false if there is no volume |
| 169 // name set. | 171 // name set. |
| 170 base::string16 volume_label; | 172 base::string16 volume_label; |
| 171 GetVolumeInformationW(device_path.value().c_str(), | 173 GetVolumeInformationW(device_path.value().c_str(), |
| 172 base::WriteInto(&volume_label, kMaxPathBufLen), | 174 base::WriteInto(&volume_label, kMaxPathBufLen), |
| 173 kMaxPathBufLen, NULL, NULL, NULL, NULL, 0); | 175 kMaxPathBufLen, NULL, NULL, NULL, NULL, 0); |
| 174 | 176 |
| 175 uint64 total_size_in_bytes = GetVolumeSize(mount_point); | 177 uint64_t total_size_in_bytes = GetVolumeSize(mount_point); |
| 176 std::string device_id = | 178 std::string device_id = |
| 177 StorageInfo::MakeDeviceId(type, base::UTF16ToUTF8(guid)); | 179 StorageInfo::MakeDeviceId(type, base::UTF16ToUTF8(guid)); |
| 178 | 180 |
| 179 // TODO(gbillock): if volume_label.empty(), get the vendor/model information | 181 // TODO(gbillock): if volume_label.empty(), get the vendor/model information |
| 180 // for the volume. | 182 // for the volume. |
| 181 *info = StorageInfo(device_id, mount_point, volume_label, base::string16(), | 183 *info = StorageInfo(device_id, mount_point, volume_label, base::string16(), |
| 182 base::string16(), total_size_in_bytes); | 184 base::string16(), total_size_in_bytes); |
| 183 return true; | 185 return true; |
| 184 } | 186 } |
| 185 | 187 |
| (...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 544 callback.Run(StorageMonitor::EJECT_FAILURE); | 546 callback.Run(StorageMonitor::EJECT_FAILURE); |
| 545 return; | 547 return; |
| 546 } | 548 } |
| 547 | 549 |
| 548 device_info_task_runner_->PostTask( | 550 device_info_task_runner_->PostTask( |
| 549 FROM_HERE, base::Bind(&EjectDeviceInThreadPool, device, callback, | 551 FROM_HERE, base::Bind(&EjectDeviceInThreadPool, device, callback, |
| 550 device_info_task_runner_, 0)); | 552 device_info_task_runner_, 0)); |
| 551 } | 553 } |
| 552 | 554 |
| 553 } // namespace storage_monitor | 555 } // namespace storage_monitor |
| OLD | NEW |