| Index: base/file_util_win.cc
|
| diff --git a/base/file_util_win.cc b/base/file_util_win.cc
|
| index 31d2f05d8dca7d06e29d1604472e5ed8507c1748..18ece35c5c8ae08bbe3722d63d08a5f33c3564e5 100644
|
| --- a/base/file_util_win.cc
|
| +++ b/base/file_util_win.cc
|
| @@ -1,4 +1,4 @@
|
| -// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| +// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| @@ -35,48 +35,6 @@ namespace {
|
| const DWORD kFileShareAll =
|
| FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE;
|
|
|
| -// Helper for NormalizeFilePath(), defined below.
|
| -bool DevicePathToDriveLetterPath(const FilePath& device_path,
|
| - FilePath* drive_letter_path) {
|
| - base::ThreadRestrictions::AssertIOAllowed();
|
| -
|
| - // Get the mapping of drive letters to device paths.
|
| - const int kDriveMappingSize = 1024;
|
| - wchar_t drive_mapping[kDriveMappingSize] = {'\0'};
|
| - if (!::GetLogicalDriveStrings(kDriveMappingSize - 1, drive_mapping)) {
|
| - DLOG(ERROR) << "Failed to get drive mapping.";
|
| - return false;
|
| - }
|
| -
|
| - // The drive mapping is a sequence of null terminated strings.
|
| - // The last string is empty.
|
| - wchar_t* drive_map_ptr = drive_mapping;
|
| - wchar_t device_name[MAX_PATH];
|
| - wchar_t drive[] = L" :";
|
| -
|
| - // For each string in the drive mapping, get the junction that links
|
| - // to it. If that junction is a prefix of |device_path|, then we
|
| - // know that |drive| is the real path prefix.
|
| - while (*drive_map_ptr) {
|
| - drive[0] = drive_map_ptr[0]; // Copy the drive letter.
|
| -
|
| - if (QueryDosDevice(drive, device_name, MAX_PATH) &&
|
| - StartsWith(device_path.value(), device_name, true)) {
|
| - *drive_letter_path = FilePath(drive +
|
| - device_path.value().substr(wcslen(device_name)));
|
| - return true;
|
| - }
|
| - // Move to the next drive letter string, which starts one
|
| - // increment after the '\0' that terminates the current string.
|
| - while (*drive_map_ptr++);
|
| - }
|
| -
|
| - // No drive matched. The path does not start with a device junction
|
| - // that is mounted as a drive letter. This means there is no drive
|
| - // letter path to the volume that holds |device_path|, so fail.
|
| - return false;
|
| -}
|
| -
|
| } // namespace
|
|
|
| bool AbsolutePath(FilePath* path) {
|
| @@ -1047,6 +1005,50 @@ bool NormalizeFilePath(const FilePath& path, FilePath* real_path) {
|
| return DevicePathToDriveLetterPath(mapped_file, real_path);
|
| }
|
|
|
| +bool DevicePathToDriveLetterPath(const FilePath& nt_device_path,
|
| + FilePath* out_drive_letter_path) {
|
| + base::ThreadRestrictions::AssertIOAllowed();
|
| +
|
| + // Get the mapping of drive letters to device paths.
|
| + const int kDriveMappingSize = 1024;
|
| + wchar_t drive_mapping[kDriveMappingSize] = {'\0'};
|
| + if (!::GetLogicalDriveStrings(kDriveMappingSize - 1, drive_mapping)) {
|
| + DLOG(ERROR) << "Failed to get drive mapping.";
|
| + return false;
|
| + }
|
| +
|
| + // The drive mapping is a sequence of null terminated strings.
|
| + // The last string is empty.
|
| + wchar_t* drive_map_ptr = drive_mapping;
|
| + wchar_t device_path_as_string[MAX_PATH];
|
| + wchar_t drive[] = L" :";
|
| +
|
| + // For each string in the drive mapping, get the junction that links
|
| + // to it. If that junction is a prefix of |device_path|, then we
|
| + // know that |drive| is the real path prefix.
|
| + while (*drive_map_ptr) {
|
| + drive[0] = drive_map_ptr[0]; // Copy the drive letter.
|
| +
|
| + if (QueryDosDevice(drive, device_path_as_string, MAX_PATH)) {
|
| + FilePath device_path(device_path_as_string);
|
| + if (device_path == nt_device_path ||
|
| + device_path.IsParent(nt_device_path)) {
|
| + *out_drive_letter_path = FilePath(drive +
|
| + nt_device_path.value().substr(wcslen(device_path_as_string)));
|
| + return true;
|
| + }
|
| + }
|
| + // Move to the next drive letter string, which starts one
|
| + // increment after the '\0' that terminates the current string.
|
| + while (*drive_map_ptr++);
|
| + }
|
| +
|
| + // No drive matched. The path does not start with a device junction
|
| + // that is mounted as a drive letter. This means there is no drive
|
| + // letter path to the volume that holds |device_path|, so fail.
|
| + return false;
|
| +}
|
| +
|
| bool NormalizeToNativeFilePath(const FilePath& path, FilePath* nt_path) {
|
| base::ThreadRestrictions::AssertIOAllowed();
|
| // In Vista, GetFinalPathNameByHandle() would give us the real path
|
|
|