blob: 6c1334e217c9e199461c31935c7e6297e17324a7 [file] [log] [blame]
dbeam005649e2015-04-02 17:24:471// 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
blundellb5c6b5a2015-07-30 20:18:305#include "components/metrics/drive_metrics_provider.h"
dbeam005649e2015-04-02 17:24:476
7#include <windows.h>
dbeam005649e2015-04-02 17:24:478#include <winioctl.h>
9#include <vector>
10
11#include "base/files/file.h"
12#include "base/files/file_path.h"
dbeam005649e2015-04-02 17:24:4713#include "base/strings/stringprintf.h"
dbeam005649e2015-04-02 17:24:4714
blundellb5c6b5a2015-07-30 20:18:3015namespace metrics {
16
dbeam005649e2015-04-02 17:24:4717// static
18bool DriveMetricsProvider::HasSeekPenalty(const base::FilePath& path,
19 bool* has_seek_penalty) {
20 std::vector<base::FilePath::StringType> components;
21 path.GetComponents(&components);
22
dbeame2e23ac22015-09-26 01:43:5623 base::File volume(base::FilePath(L"\\\\.\\" + components[0]),
24 base::File::FLAG_OPEN);
dbeam005649e2015-04-02 17:24:4725 if (!volume.IsValid())
26 return false;
27
dbeame2e23ac22015-09-26 01:43:5628 STORAGE_PROPERTY_QUERY query = {};
29 query.QueryType = PropertyStandardQuery;
30 query.PropertyId = StorageDeviceSeekPenaltyProperty;
dbeam005649e2015-04-02 17:24:4731
dbeame2e23ac22015-09-26 01:43:5632 DEVICE_SEEK_PENALTY_DESCRIPTOR result;
33 DWORD bytes_returned;
dbeamc1e30492015-08-05 21:55:4134
dbeame2e23ac22015-09-26 01:43:5635 BOOL success = DeviceIoControl(
36 volume.GetPlatformFile(), IOCTL_STORAGE_QUERY_PROPERTY, &query,
Zinovy Nis3c5a779e2018-05-11 07:09:5037 sizeof(query), &result, sizeof(result), &bytes_returned, nullptr);
dbeamc1e30492015-08-05 21:55:4138
dbeame2e23ac22015-09-26 01:43:5639 if (success == FALSE || bytes_returned < sizeof(result))
40 return false;
dbeam005649e2015-04-02 17:24:4741
dbeame2e23ac22015-09-26 01:43:5642 *has_seek_penalty = result.IncursSeekPenalty != FALSE;
dbeam005649e2015-04-02 17:24:4743 return true;
44}
blundellb5c6b5a2015-07-30 20:18:3045
46} // namespace metrics