| Index: base/sys_info_win.cc
|
| diff --git a/base/sys_info_win.cc b/base/sys_info_win.cc
|
| index 9cc0cfa48a3637d48c36978de2c798383e9a194d..a6b364b7e43306984b2757c44c730956d5378480 100644
|
| --- a/base/sys_info_win.cc
|
| +++ b/base/sys_info_win.cc
|
| @@ -5,7 +5,9 @@
|
| #include "base/sys_info.h"
|
|
|
| #include <windows.h>
|
| +#include <winioctl.h>
|
|
|
| +#include "base/files/file.h"
|
| #include "base/files/file_path.h"
|
| #include "base/logging.h"
|
| #include "base/memory/scoped_ptr.h"
|
| @@ -24,9 +26,7 @@ int64 AmountOfMemory(DWORDLONG MEMORYSTATUSEX::* memory_field) {
|
| }
|
|
|
| int64 rv = static_cast<int64>(memory_info.*memory_field);
|
| - if (rv < 0)
|
| - rv = kint64max;
|
| - return rv;
|
| + return rv < 0 ? kint64max : rv;
|
| }
|
|
|
| } // namespace
|
| @@ -55,16 +55,50 @@ int64 SysInfo::AmountOfVirtualMemory() {
|
|
|
| // static
|
| int64 SysInfo::AmountOfFreeDiskSpace(const FilePath& path) {
|
| - base::ThreadRestrictions::AssertIOAllowed();
|
| + ThreadRestrictions::AssertIOAllowed();
|
|
|
| ULARGE_INTEGER available, total, free;
|
| - if (!GetDiskFreeSpaceExW(path.value().c_str(), &available, &total, &free)) {
|
| + if (!GetDiskFreeSpaceExW(path.value().c_str(), &available, &total, &free))
|
| return -1;
|
| - }
|
| +
|
| int64 rv = static_cast<int64>(available.QuadPart);
|
| - if (rv < 0)
|
| - rv = kint64max;
|
| - return rv;
|
| + return rv < 0 ? kint64max : rv;
|
| +}
|
| +
|
| +bool SysInfo::HasSeekPenalty(const FilePath& path, bool* has_seek_penalty) {
|
| + ThreadRestrictions::AssertIOAllowed();
|
| +
|
| + DCHECK(path.IsAbsolute());
|
| + DCHECK(has_seek_penalty);
|
| +
|
| + // TODO(dbeam): Vista, XP support.
|
| + if (win::GetVersion() < win::VERSION_WIN7)
|
| + return false;
|
| +
|
| + std::vector<FilePath::StringType> components;
|
| + path.GetComponents(&components);
|
| + File drive(FilePath(L"\\\\.\\" + components[0]), File::FLAG_OPEN);
|
| + if (!drive.IsValid())
|
| + return false;
|
| +
|
| + STORAGE_PROPERTY_QUERY query;
|
| + query.QueryType = PropertyStandardQuery;
|
| + query.PropertyId = StorageDeviceSeekPenaltyProperty;
|
| +
|
| + DEVICE_SEEK_PENALTY_DESCRIPTOR result;
|
| + DWORD bytes_returned;
|
| +
|
| + BOOL success = DeviceIoControl(drive.GetPlatformFile(),
|
| + IOCTL_STORAGE_QUERY_PROPERTY,
|
| + &query, sizeof(query),
|
| + &result, sizeof(result),
|
| + &bytes_returned,
|
| + NULL);
|
| + if (success == FALSE || bytes_returned < sizeof(result))
|
| + return false;
|
| +
|
| + *has_seek_penalty = result.IncursSeekPenalty != FALSE;
|
| + return true;
|
| }
|
|
|
| // static
|
|
|