Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 // See the corresponding header file for description of the functions in this | 5 // See the corresponding header file for description of the functions in this |
| 6 // file. | 6 // file. |
| 7 | 7 |
| 8 #include "chrome/installer/util/install_util.h" | 8 #include "chrome/installer/util/install_util.h" |
| 9 | 9 |
| 10 #include <shellapi.h> | 10 #include <shellapi.h> |
| 11 #include <shlobj.h> | 11 #include <shlobj.h> |
| 12 #include <shlwapi.h> | 12 #include <shlwapi.h> |
| 13 | 13 |
| 14 #include <memory> | |
| 15 #include <string> | |
| 16 #include <vector> | |
| 17 | |
| 18 #include "base/command_line.h" | 14 #include "base/command_line.h" |
| 19 #include "base/environment.h" | |
| 20 #include "base/files/file_util.h" | 15 #include "base/files/file_util.h" |
| 21 #include "base/logging.h" | 16 #include "base/logging.h" |
| 22 #include "base/macros.h" | 17 #include "base/macros.h" |
| 23 #include "base/numerics/safe_conversions.h" | |
| 24 #include "base/path_service.h" | 18 #include "base/path_service.h" |
| 25 #include "base/process/launch.h" | 19 #include "base/process/launch.h" |
| 26 #include "base/strings/string_util.h" | 20 #include "base/strings/string_util.h" |
| 27 #include "base/strings/utf_string_conversions.h" | 21 #include "base/strings/utf_string_conversions.h" |
| 28 #include "base/sys_info.h" | 22 #include "base/sys_info.h" |
| 29 #include "base/values.h" | 23 #include "base/values.h" |
| 30 #include "base/version.h" | 24 #include "base/version.h" |
| 31 #include "base/win/registry.h" | 25 #include "base/win/registry.h" |
| 32 #include "base/win/windows_version.h" | 26 #include "base/win/windows_version.h" |
| 33 #include "chrome/common/chrome_constants.h" | 27 #include "chrome/common/chrome_constants.h" |
| 34 #include "chrome/common/chrome_paths.h" | 28 #include "chrome/common/chrome_paths.h" |
| 29 #include "chrome/install_static/install_details.h" | |
| 30 #include "chrome/install_static/install_modes.h" | |
| 35 #include "chrome/installer/util/browser_distribution.h" | 31 #include "chrome/installer/util/browser_distribution.h" |
| 36 #include "chrome/installer/util/google_update_constants.h" | 32 #include "chrome/installer/util/google_update_constants.h" |
| 37 #include "chrome/installer/util/installation_state.h" | 33 #include "chrome/installer/util/installation_state.h" |
| 38 #include "chrome/installer/util/l10n_string_util.h" | 34 #include "chrome/installer/util/l10n_string_util.h" |
| 39 #include "chrome/installer/util/util_constants.h" | 35 #include "chrome/installer/util/util_constants.h" |
| 40 #include "chrome/installer/util/work_item_list.h" | 36 #include "chrome/installer/util/work_item_list.h" |
| 41 | 37 |
| 42 using base::win::RegKey; | 38 using base::win::RegKey; |
| 43 using installer::ProductState; | 39 using installer::ProductState; |
| 44 | 40 |
| 45 namespace { | 41 namespace { |
| 46 | 42 |
| 47 const char kEnvProgramFilesPath[] = "CHROME_PROBED_PROGRAM_FILES_PATH"; | |
| 48 const wchar_t kRegDowngradeVersion[] = L"DowngradeVersion"; | 43 const wchar_t kRegDowngradeVersion[] = L"DowngradeVersion"; |
| 49 | 44 |
| 50 // Creates a zero-sized non-decorated foreground window that doesn't appear | 45 // Creates a zero-sized non-decorated foreground window that doesn't appear |
| 51 // in the taskbar. This is used as a parent window for calls to ShellExecuteEx | 46 // in the taskbar. This is used as a parent window for calls to ShellExecuteEx |
| 52 // in order for the UAC dialog to appear in the foreground and for focus | 47 // in order for the UAC dialog to appear in the foreground and for focus |
| 53 // to be returned to this process once the UAC task is dismissed. Returns | 48 // to be returned to this process once the UAC task is dismissed. Returns |
| 54 // NULL on failure, a handle to the UAC window on success. | 49 // NULL on failure, a handle to the UAC window on success. |
| 55 HWND CreateUACForegroundWindow() { | 50 HWND CreateUACForegroundWindow() { |
| 56 HWND foreground_window = ::CreateWindowEx(WS_EX_TOOLWINDOW, | 51 HWND foreground_window = ::CreateWindowEx(WS_EX_TOOLWINDOW, |
| 57 L"STATIC", | 52 L"STATIC", |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 269 install_list->AddSetRegValueWorkItem( | 264 install_list->AddSetRegValueWorkItem( |
| 270 root, | 265 root, |
| 271 state_key, | 266 state_key, |
| 272 KEY_WOW64_32KEY, | 267 KEY_WOW64_32KEY, |
| 273 installer::kInstallerSuccessLaunchCmdLine, | 268 installer::kInstallerSuccessLaunchCmdLine, |
| 274 *launch_cmd, | 269 *launch_cmd, |
| 275 true); | 270 true); |
| 276 } | 271 } |
| 277 } | 272 } |
| 278 | 273 |
| 279 bool InstallUtil::IsPerUserInstall(const base::FilePath& exe_path) { | 274 bool InstallUtil::IsPerUserInstall(const base::FilePath& exe_path) { |
|
gab
2017/02/14 16:57:56
/* exe_path */
grt (UTC plus 2)
2017/02/14 21:04:24
Done.
| |
| 280 std::unique_ptr<base::Environment> env(base::Environment::Create()); | 275 return !install_static::InstallDetails::Get().system_level(); |
| 281 std::string env_program_files_path; | |
| 282 // Check environment variable to find program files path. | |
| 283 base::FilePath program_files_path; | |
| 284 if (env->GetVar(kEnvProgramFilesPath, &env_program_files_path) && | |
| 285 !env_program_files_path.empty()) { | |
| 286 program_files_path = | |
| 287 base::FilePath(base::UTF8ToWide(env_program_files_path)); | |
| 288 } else { | |
| 289 const int kProgramFilesKey = | |
| 290 #if defined(_WIN64) | |
| 291 // TODO(wfh): Revise this when Chrome is/can be installed in the 64-bit | |
| 292 // program files directory. | |
| 293 base::DIR_PROGRAM_FILESX86; | |
| 294 #else | |
| 295 base::DIR_PROGRAM_FILES; | |
| 296 #endif | |
| 297 if (!PathService::Get(kProgramFilesKey, &program_files_path)) { | |
| 298 NOTREACHED(); | |
| 299 return true; | |
| 300 } | |
| 301 env->SetVar(kEnvProgramFilesPath, | |
| 302 base::WideToUTF8(program_files_path.value())); | |
| 303 } | |
| 304 | |
| 305 // Return true if the program files path is not a case-insensitive prefix of | |
| 306 // the exe path. | |
| 307 if (exe_path.value().size() < program_files_path.value().size()) | |
| 308 return true; | |
| 309 DWORD prefix_len = | |
| 310 base::saturated_cast<DWORD>(program_files_path.value().size()); | |
| 311 return ::CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE, | |
| 312 exe_path.value().data(), prefix_len, | |
| 313 program_files_path.value().data(), prefix_len) != | |
| 314 CSTR_EQUAL; | |
| 315 } | |
| 316 | |
| 317 void InstallUtil::ResetIsPerUserInstallForTest() { | |
| 318 std::unique_ptr<base::Environment> env(base::Environment::Create()); | |
| 319 env->UnSetVar(kEnvProgramFilesPath); | |
| 320 } | |
| 321 | |
| 322 bool CheckIsChromeSxSProcess() { | |
| 323 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); | |
| 324 CHECK(command_line); | |
| 325 | |
| 326 if (command_line->HasSwitch(installer::switches::kChromeSxS)) | |
| 327 return true; | |
| 328 | |
| 329 // Also return true if we are running from Chrome SxS installed path. | |
| 330 base::FilePath exe_dir; | |
| 331 PathService::Get(base::DIR_EXE, &exe_dir); | |
| 332 base::string16 chrome_sxs_dir(installer::kGoogleChromeInstallSubDir2); | |
| 333 chrome_sxs_dir.append(installer::kSxSSuffix); | |
| 334 | |
| 335 // This is SxS if current EXE is in or under (possibly multiple levels under) | |
| 336 // |chrome_sxs_dir|\|installer::kInstallBinaryDir| | |
| 337 std::vector<base::FilePath::StringType> components; | |
| 338 exe_dir.GetComponents(&components); | |
| 339 // We need at least 1 element in the array for the behavior of the following | |
| 340 // loop to be defined. This should always be true, since we're splitting the | |
| 341 // path to our executable and one of the components will be the drive letter. | |
| 342 DCHECK(!components.empty()); | |
| 343 typedef std::vector<base::FilePath::StringType>::const_reverse_iterator | |
| 344 ComponentsIterator; | |
| 345 for (ComponentsIterator current = components.rbegin(), parent = current + 1; | |
| 346 parent != components.rend(); current = parent++) { | |
| 347 if (base::FilePath::CompareEqualIgnoreCase( | |
| 348 *current, installer::kInstallBinaryDir) && | |
| 349 base::FilePath::CompareEqualIgnoreCase(*parent, chrome_sxs_dir)) { | |
| 350 return true; | |
| 351 } | |
| 352 } | |
| 353 | |
| 354 return false; | |
| 355 } | 276 } |
| 356 | 277 |
| 357 bool InstallUtil::IsChromeSxSProcess() { | 278 bool InstallUtil::IsChromeSxSProcess() { |
| 358 static bool sxs = CheckIsChromeSxSProcess(); | 279 #if defined(GOOGLE_CHROME_BUILD) |
| 359 return sxs; | 280 return install_static::InstallDetails::Get().install_mode_index() == |
| 281 install_static::CANARY_INDEX; | |
| 282 #else | |
| 283 return false; | |
| 284 #endif | |
| 360 } | 285 } |
| 361 | 286 |
| 362 // static | 287 // static |
| 363 bool InstallUtil::IsFirstRunSentinelPresent() { | 288 bool InstallUtil::IsFirstRunSentinelPresent() { |
| 364 // TODO(msw): Consolidate with first_run::internal::IsFirstRunSentinelPresent. | 289 // TODO(msw): Consolidate with first_run::internal::IsFirstRunSentinelPresent. |
| 365 base::FilePath user_data_dir; | 290 base::FilePath user_data_dir; |
| 366 return !PathService::Get(chrome::DIR_USER_DATA, &user_data_dir) || | 291 return !PathService::Get(chrome::DIR_USER_DATA, &user_data_dir) || |
| 367 base::PathExists(user_data_dir.Append(chrome::kFirstRunSentinel)); | 292 base::PathExists(user_data_dir.Append(chrome::kFirstRunSentinel)); |
| 368 } | 293 } |
| 369 | 294 |
| (...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 622 // Open the program and see if it references the expected file. | 547 // Open the program and see if it references the expected file. |
| 623 base::File file; | 548 base::File file; |
| 624 BY_HANDLE_FILE_INFORMATION info = {}; | 549 BY_HANDLE_FILE_INFORMATION info = {}; |
| 625 | 550 |
| 626 return (OpenForInfo(path, &file) && | 551 return (OpenForInfo(path, &file) && |
| 627 GetInfo(file, &info) && | 552 GetInfo(file, &info) && |
| 628 info.dwVolumeSerialNumber == file_info_.dwVolumeSerialNumber && | 553 info.dwVolumeSerialNumber == file_info_.dwVolumeSerialNumber && |
| 629 info.nFileIndexHigh == file_info_.nFileIndexHigh && | 554 info.nFileIndexHigh == file_info_.nFileIndexHigh && |
| 630 info.nFileIndexLow == file_info_.nFileIndexLow); | 555 info.nFileIndexLow == file_info_.nFileIndexLow); |
| 631 } | 556 } |
| OLD | NEW |