Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(193)

Side by Side Diff: chrome/installer/mini_installer/mini_installer.cc

Issue 126157: Set magic string in registry to enable fallback to full installer in case of 3 stage updates. (Closed)
Patch Set: fix 80 chars Created 11 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/installer/mini_installer/mini_installer.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2009 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 // mini_installer.exe is the first exe that is run when chrome is being 5 // mini_installer.exe is the first exe that is run when chrome is being
6 // installed or upgraded. It is designed to be extremely small (~5KB with no 6 // installed or upgraded. It is designed to be extremely small (~5KB with no
7 // extra resources linked) and it has two main jobs: 7 // extra resources linked) and it has two main jobs:
8 // 1) unpack the resources (possibly decompressing some) 8 // 1) unpack the resources (possibly decompressing some)
9 // 2) run the real installer (setup.exe) with appropiate flags. 9 // 2) run the real installer (setup.exe) with appropiate flags.
10 // 10 //
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
136 KEY_READ, &key) == ERROR_SUCCESS) && 136 KEY_READ, &key) == ERROR_SUCCESS) &&
137 (::RegQueryValueEx(key, value_name, NULL, NULL, 137 (::RegQueryValueEx(key, value_name, NULL, NULL,
138 reinterpret_cast<LPBYTE>(value), 138 reinterpret_cast<LPBYTE>(value),
139 reinterpret_cast<LPDWORD>(&size)) == ERROR_SUCCESS)) { 139 reinterpret_cast<LPDWORD>(&size)) == ERROR_SUCCESS)) {
140 ::RegCloseKey(key); 140 ::RegCloseKey(key);
141 return true; 141 return true;
142 } 142 }
143 return false; 143 return false;
144 } 144 }
145 145
146 // This function sets the flag in registry to indicate that Google Update
147 // should try full installer next time. If the current installer works, this
148 // flag is cleared by setup.exe at the end of install.
149 void SetFullInstallerFlag(HKEY root_key) {
150 HKEY key;
151 if (::RegOpenKeyEx(root_key, kApRegistryKey, NULL,
152 KEY_READ | KEY_SET_VALUE, &key) != ERROR_SUCCESS)
sra 2009/06/15 21:20:52 Does RegOpenKeyEx allow subkeys to be a path with
kuchhal 2009/06/15 22:05:31 It works fine with the full path. I tested the new
153 return;
sra 2009/06/15 21:20:52 Who initially creates the key? Open will fail if
kuchhal 2009/06/15 22:05:31 Yes it should fail in that case. If it is first in
154
155 wchar_t value[128];
156 size_t size = _countof(value);
157 if ((::RegQueryValueEx(key, kApRegistryValueName, NULL, NULL,
158 reinterpret_cast<LPBYTE>(value),
159 reinterpret_cast<LPDWORD>(&size)) == ERROR_SUCCESS) &&
160 (!StrEndsWith(value, kFullInstallerSuffix)) &&
161 (SafeStrCat(value, size, kFullInstallerSuffix))) {
162 ::RegSetValueEx(key, kApRegistryValueName, 0, REG_SZ,
163 reinterpret_cast<LPBYTE>(value),
164 lstrlen(value) * sizeof(wchar_t));
165 }
166
167 ::RegCloseKey(key);
168 }
146 169
147 // Gets the setup.exe path from Registry by looking the value of Uninstall 170 // Gets the setup.exe path from Registry by looking the value of Uninstall
148 // string, strips the arguments for uninstall and returns only the full path 171 // string, strips the arguments for uninstall and returns only the full path
149 // to setup.exe. 172 // to setup.exe.
150 bool GetSetupExePathFromRegistry(wchar_t *path, size_t size) { 173 bool GetSetupExePathFromRegistry(wchar_t *path, size_t size) {
151 if (!ReadValueFromRegistry(HKEY_CURRENT_USER, kUninstallRegistryKey, 174 if (!ReadValueFromRegistry(HKEY_CURRENT_USER, kUninstallRegistryKey,
152 kUninstallRegistryValueName, path, size)) { 175 kUninstallRegistryValueName, path, size)) {
153 if (!ReadValueFromRegistry(HKEY_LOCAL_MACHINE, kUninstallRegistryKey, 176 if (!ReadValueFromRegistry(HKEY_LOCAL_MACHINE, kUninstallRegistryKey,
154 kUninstallRegistryValueName, path, size)) { 177 kUninstallRegistryValueName, path, size)) {
155 return false; 178 return false;
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after
465 } 488 }
466 489
467 // Main function. First gets a working dir, unpacks the resources and finally 490 // Main function. First gets a working dir, unpacks the resources and finally
468 // executes setup.exe to do the install/upgrade. 491 // executes setup.exe to do the install/upgrade.
469 int WMain(HMODULE module) { 492 int WMain(HMODULE module) {
470 // First get a path where we can extract payload 493 // First get a path where we can extract payload
471 wchar_t base_path[MAX_PATH]; 494 wchar_t base_path[MAX_PATH];
472 if (!GetWorkDir(module, base_path)) 495 if (!GetWorkDir(module, base_path))
473 return 101; 496 return 101;
474 497
498 // Set the magic suffix in registry to try full installer next time. We ignore
499 // any errors here and we try to set the suffix for user level as well as
500 // system level.
501 SetFullInstallerFlag(HKEY_LOCAL_MACHINE);
502 SetFullInstallerFlag(HKEY_CURRENT_USER);
503
475 wchar_t archive_path[MAX_PATH] = {0}; 504 wchar_t archive_path[MAX_PATH] = {0};
476 wchar_t setup_path[MAX_PATH] = {0}; 505 wchar_t setup_path[MAX_PATH] = {0};
477 if (!UnpackBinaryResources(module, base_path, archive_path, MAX_PATH, 506 if (!UnpackBinaryResources(module, base_path, archive_path, MAX_PATH,
478 setup_path, MAX_PATH)) 507 setup_path, MAX_PATH))
479 return 102; 508 return 102;
480 509
481 int exit_code = 103; 510 int exit_code = 103;
482 if (!RunSetup(archive_path, setup_path, &exit_code)) 511 if (!RunSetup(archive_path, setup_path, &exit_code))
483 return exit_code; 512 return exit_code;
484 513
485 wchar_t value[4]; 514 wchar_t value[4];
486 if ((!ReadValueFromRegistry(HKEY_CURRENT_USER, kCleanupRegistryKey, 515 if ((!ReadValueFromRegistry(HKEY_CURRENT_USER, kCleanupRegistryKey,
487 kCleanupRegistryValueName, value, 4)) || 516 kCleanupRegistryValueName, value, 4)) ||
488 (value[0] != L'0')) 517 (value[0] != L'0'))
489 DeleteExtractedFiles(base_path, archive_path, setup_path); 518 DeleteExtractedFiles(base_path, archive_path, setup_path);
490 519
491 return exit_code; 520 return exit_code;
492 } 521 }
493 } // namespace mini_installer 522 } // namespace mini_installer
494 523
495 524
496 int MainEntryPoint() { 525 int MainEntryPoint() {
497 int result = mini_installer::WMain(::GetModuleHandle(NULL)); 526 int result = mini_installer::WMain(::GetModuleHandle(NULL));
498 ::ExitProcess(result); 527 ::ExitProcess(result);
499 } 528 }
OLDNEW
« no previous file with comments | « chrome/installer/mini_installer/mini_installer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698