diff options
-rw-r--r-- | base/base_paths_win.cc | 23 | ||||
-rw-r--r-- | base/base_paths_win.h | 10 | ||||
-rw-r--r-- | base/path_service_unittest.cc | 52 |
3 files changed, 83 insertions, 2 deletions
diff --git a/base/base_paths_win.cc b/base/base_paths_win.cc index 5bef310..4ecb59d 100644 --- a/base/base_paths_win.cc +++ b/base/base_paths_win.cc @@ -6,8 +6,10 @@ #include <shlobj.h> #include "base/base_paths.h" +#include "base/environment.h" #include "base/files/file_path.h" #include "base/path_service.h" +#include "base/strings/utf_string_conversions.h" #include "base/win/scoped_co_mem.h" #include "base/win/windows_version.h" @@ -65,6 +67,27 @@ bool PathProviderWin(int key, FilePath* result) { return false; cur = FilePath(system_buffer); break; + case base::DIR_PROGRAM_FILES6432: +#if !defined(_WIN64) + if (base::win::OSInfo::GetInstance()->wow64_status() == + base::win::OSInfo::WOW64_ENABLED) { + scoped_ptr<base::Environment> env(base::Environment::Create()); + std::string programfiles_w6432; + // 32-bit process running in WOW64 sets ProgramW6432 environment + // variable. See + // https://msdn.microsoft.com/library/windows/desktop/aa384274.aspx. + if (!env->GetVar("ProgramW6432", &programfiles_w6432)) + return false; + // GetVar returns UTF8 - convert back to Wide. + cur = FilePath(UTF8ToWide(programfiles_w6432)); + break; + } +#endif + if (FAILED(SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, + SHGFP_TYPE_CURRENT, system_buffer))) + return false; + cur = FilePath(system_buffer); + break; case base::DIR_IE_INTERNET_CACHE: if (FAILED(SHGetFolderPath(NULL, CSIDL_INTERNET_CACHE, NULL, SHGFP_TYPE_CURRENT, system_buffer))) diff --git a/base/base_paths_win.h b/base/base_paths_win.h index 032de34..4ab6af1 100644 --- a/base/base_paths_win.h +++ b/base/base_paths_win.h @@ -16,8 +16,14 @@ enum { DIR_WINDOWS, // Windows directory, usually "c:\windows" DIR_SYSTEM, // Usually c:\windows\system32" - DIR_PROGRAM_FILES, // Usually c:\program files - DIR_PROGRAM_FILESX86, // Usually c:\program files or c:\program files (x86) + // 32-bit 32-bit on 64-bit 64-bit on 64-bit + // DIR_PROGRAM_FILES 1 2 1 + // DIR_PROGRAM_FILESX86 1 2 2 + // DIR_PROGRAM_FILES6432 1 1 1 + // 1 - C:\Program Files 2 - C:\Program Files (x86) + DIR_PROGRAM_FILES, // See table above. + DIR_PROGRAM_FILESX86, // See table above. + DIR_PROGRAM_FILES6432, // See table above. DIR_IE_INTERNET_CACHE, // Temporary Internet Files directory. DIR_COMMON_START_MENU, // Usually "C:\Documents and Settings\All Users\ diff --git a/base/path_service_unittest.cc b/base/path_service_unittest.cc index 543deb6..7551d67 100644 --- a/base/path_service_unittest.cc +++ b/base/path_service_unittest.cc @@ -220,3 +220,55 @@ TEST_F(PathServiceTest, RemoveOverride) { EXPECT_TRUE(PathService::Get(base::DIR_TEMP, &new_user_data_dir)); EXPECT_EQ(original_user_data_dir, new_user_data_dir); } + +#if defined(OS_WIN) +TEST_F(PathServiceTest, GetProgramFiles) { + base::FilePath programfiles_dir; +#if defined(_WIN64) + // 64-bit on 64-bit. + EXPECT_TRUE(PathService::Get(base::DIR_PROGRAM_FILES, + &programfiles_dir)); + EXPECT_EQ(programfiles_dir.value(), + FILE_PATH_LITERAL("C:\\Program Files")); + EXPECT_TRUE(PathService::Get(base::DIR_PROGRAM_FILESX86, + &programfiles_dir)); + EXPECT_EQ(programfiles_dir.value(), + FILE_PATH_LITERAL("C:\\Program Files (x86)")); + EXPECT_TRUE(PathService::Get(base::DIR_PROGRAM_FILES6432, + &programfiles_dir)); + EXPECT_EQ(programfiles_dir.value(), + FILE_PATH_LITERAL("C:\\Program Files")); +#else + if (base::win::OSInfo::GetInstance()->wow64_status() == + base::win::OSInfo::WOW64_ENABLED) { + // 32-bit on 64-bit. + EXPECT_TRUE(PathService::Get(base::DIR_PROGRAM_FILES, + &programfiles_dir)); + EXPECT_EQ(programfiles_dir.value(), + FILE_PATH_LITERAL("C:\\Program Files (x86)")); + EXPECT_TRUE(PathService::Get(base::DIR_PROGRAM_FILESX86, + &programfiles_dir)); + EXPECT_EQ(programfiles_dir.value(), + FILE_PATH_LITERAL("C:\\Program Files (x86)")); + EXPECT_TRUE(PathService::Get(base::DIR_PROGRAM_FILES6432, + &programfiles_dir)); + EXPECT_EQ(programfiles_dir.value(), + FILE_PATH_LITERAL("C:\\Program Files")); + } else { + // 32-bit on 32-bit. + EXPECT_TRUE(PathService::Get(base::DIR_PROGRAM_FILES, + &programfiles_dir)); + EXPECT_EQ(programfiles_dir.value(), + FILE_PATH_LITERAL("C:\\Program Files")); + EXPECT_TRUE(PathService::Get(base::DIR_PROGRAM_FILESX86, + &programfiles_dir)); + EXPECT_EQ(programfiles_dir.value(), + FILE_PATH_LITERAL("C:\\Program Files")); + EXPECT_TRUE(PathService::Get(base::DIR_PROGRAM_FILES6432, + &programfiles_dir)); + EXPECT_EQ(programfiles_dir.value(), + FILE_PATH_LITERAL("C:\\Program Files")); + } +#endif +} +#endif |