| 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 // 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 appropriate flags. | 9 // 2) run the real installer (setup.exe) with appropriate flags. |
| 10 // | 10 // |
| (...skipping 19 matching lines...) Expand all Loading... |
| 30 // http://msdn.microsoft.com/en-us/library/windows/desktop/aa387694.aspx | 30 // http://msdn.microsoft.com/en-us/library/windows/desktop/aa387694.aspx |
| 31 #define SystemFunction036 NTAPI SystemFunction036 | 31 #define SystemFunction036 NTAPI SystemFunction036 |
| 32 #include <NTSecAPI.h> | 32 #include <NTSecAPI.h> |
| 33 #undef SystemFunction036 | 33 #undef SystemFunction036 |
| 34 | 34 |
| 35 #include <sddl.h> | 35 #include <sddl.h> |
| 36 #include <shellapi.h> | 36 #include <shellapi.h> |
| 37 #include <stdlib.h> | 37 #include <stdlib.h> |
| 38 #include <stddef.h> | 38 #include <stddef.h> |
| 39 | 39 |
| 40 #include <initializer_list> |
| 41 |
| 40 #include "chrome/installer/mini_installer/appid.h" | 42 #include "chrome/installer/mini_installer/appid.h" |
| 41 #include "chrome/installer/mini_installer/configuration.h" | 43 #include "chrome/installer/mini_installer/configuration.h" |
| 42 #include "chrome/installer/mini_installer/decompress.h" | 44 #include "chrome/installer/mini_installer/decompress.h" |
| 43 #include "chrome/installer/mini_installer/mini_installer_constants.h" | 45 #include "chrome/installer/mini_installer/mini_installer_constants.h" |
| 44 #include "chrome/installer/mini_installer/pe_resource.h" | 46 #include "chrome/installer/mini_installer/pe_resource.h" |
| 45 #include "chrome/installer/mini_installer/regkey.h" | 47 #include "chrome/installer/mini_installer/regkey.h" |
| 46 | 48 |
| 47 namespace mini_installer { | 49 namespace mini_installer { |
| 48 | 50 |
| 49 typedef StackString<MAX_PATH> PathString; | 51 typedef StackString<MAX_PATH> PathString; |
| 50 | 52 |
| 51 // This structure passes data back and forth for the processing | 53 // This structure passes data back and forth for the processing |
| 52 // of resource callbacks. | 54 // of resource callbacks. |
| 53 struct Context { | 55 struct Context { |
| 54 // Input to the call back method. Specifies the dir to save resources. | 56 // Input to the call back method. Specifies the dir to save resources. |
| 55 const wchar_t* base_path; | 57 const wchar_t* base_path; |
| 56 // First output from call back method. Full path of Chrome archive. | 58 // First output from call back method. Full path of Chrome archive. |
| 57 PathString* chrome_resource_path; | 59 PathString* chrome_resource_path; |
| 58 // Second output from call back method. Full path of Setup archive/exe. | 60 // Second output from call back method. Full path of Setup archive/exe. |
| 59 PathString* setup_resource_path; | 61 PathString* setup_resource_path; |
| 60 }; | 62 }; |
| 61 | 63 |
| 64 // TODO(grt): Frame this in terms of whether or not the brand supports |
| 65 // integation with Omaha, where Google Update is the Google-specific fork of |
| 66 // the open-source Omaha project. |
| 62 #if defined(GOOGLE_CHROME_BUILD) | 67 #if defined(GOOGLE_CHROME_BUILD) |
| 63 // Opens the Google Update ClientState key. If |binaries| is false, opens the | 68 // Opens the Google Update ClientState key. If |binaries| is false, opens the |
| 64 // key for Google Chrome or Chrome SxS (canary). If |binaries| is true and an | 69 // key for Google Chrome or Chrome SxS (canary). If |binaries| is true and an |
| 65 // existing multi-install Chrome is being updated, opens the key for the | 70 // existing multi-install Chrome is being updated, opens the key for the |
| 66 // binaries; otherwise, returns false. | 71 // multi-install binaries; otherwise, returns false. |
| 67 bool OpenInstallStateKey(const Configuration& configuration, | 72 bool OpenInstallStateKey(const Configuration& configuration, |
| 68 bool binaries, | 73 bool binaries, |
| 69 RegKey* key) { | 74 RegKey* key) { |
| 70 if (binaries && !configuration.is_updating_multi_chrome()) | 75 if (binaries && !configuration.is_updating_multi_chrome()) |
| 71 return false; | 76 return false; |
| 72 const HKEY root_key = | 77 const HKEY root_key = |
| 73 configuration.is_system_level() ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; | 78 configuration.is_system_level() ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; |
| 74 const wchar_t* app_guid = binaries ? google_update::kMultiInstallAppGuid | 79 const wchar_t* app_guid = binaries ? google_update::kMultiInstallAppGuid |
| 75 : configuration.chrome_app_guid(); | 80 : configuration.chrome_app_guid(); |
| 76 const REGSAM key_access = KEY_QUERY_VALUE | KEY_SET_VALUE; | 81 const REGSAM key_access = KEY_QUERY_VALUE | KEY_SET_VALUE; |
| 77 | 82 |
| 78 return OpenClientStateKey(root_key, app_guid, key_access, key) == | 83 return OpenClientStateKey(root_key, app_guid, key_access, key) == |
| 79 ERROR_SUCCESS; | 84 ERROR_SUCCESS; |
| 80 } | 85 } |
| 81 | 86 |
| 82 // Writes install results into the registry where it is read by Google Update. | 87 // Writes install results into the registry where it is read by Google Update. |
| 83 // Don't write anything if there is already a result present, likely | 88 // Don't write anything if there is already a result present, likely |
| 84 // written by setup.exe. | 89 // written by setup.exe. |
| 85 void WriteInstallResults(const Configuration& configuration, | 90 void WriteInstallResults(const Configuration& configuration, |
| 86 ProcessExitResult result) { | 91 ProcessExitResult result) { |
| 87 // Calls to setup.exe will write a "success" result if everything was good | 92 // Calls to setup.exe will write a "success" result if everything was good |
| 88 // so we don't need to write anything from here. | 93 // so we don't need to write anything from here. |
| 89 if (result.IsSuccess()) | 94 if (result.IsSuccess()) |
| 90 return; | 95 return; |
| 91 | 96 |
| 92 // Write the value in Chrome ClientState key and in the binaries' if an | 97 // Write the value in Chrome ClientState key and in the binaries' if an |
| 93 // existing multi-install Chrome is being updated. | 98 // existing multi-install Chrome is being updated. |
| 94 for (int i = 0; i < 2; ++i) { | 99 for (bool binaries : {false, true}) { |
| 95 RegKey key; | 100 RegKey key; |
| 96 DWORD value; | 101 DWORD value; |
| 97 if (OpenInstallStateKey(configuration, i != 0, &key)) { | 102 if (OpenInstallStateKey(configuration, binaries, &key)) { |
| 98 if (key.ReadDWValue(kInstallerResultRegistryValue, &value) != | 103 if (key.ReadDWValue(kInstallerResultRegistryValue, &value) != |
| 99 ERROR_SUCCESS || | 104 ERROR_SUCCESS || |
| 100 value == 0) { | 105 value == 0) { |
| 101 key.WriteDWValue(kInstallerResultRegistryValue, | 106 key.WriteDWValue(kInstallerResultRegistryValue, |
| 102 result.exit_code ? 1 /* FAILED_CUSTOM_ERROR */ | 107 result.exit_code ? 1 /* FAILED_CUSTOM_ERROR */ |
| 103 : 0 /* SUCCESS */); | 108 : 0 /* SUCCESS */); |
| 104 key.WriteDWValue(kInstallerErrorRegistryValue, result.exit_code); | 109 key.WriteDWValue(kInstallerErrorRegistryValue, result.exit_code); |
| 105 key.WriteDWValue(kInstallerExtraCode1RegistryValue, | 110 key.WriteDWValue(kInstallerExtraCode1RegistryValue, |
| 106 result.windows_error); | 111 result.windows_error); |
| 107 } | 112 } |
| 108 } | 113 } |
| 109 } | 114 } |
| 110 } | 115 } |
| 111 | 116 |
| 112 // This function sets the flag in registry to indicate that Google Update | 117 // This function sets the flag in registry to indicate that Google Update |
| 113 // should try full installer next time. If the current installer works, this | 118 // should try full installer next time. If the current installer works, this |
| 114 // flag is cleared by setup.exe at the end of install. | 119 // flag is cleared by setup.exe at the end of install. |
| 115 void SetInstallerFlags(const Configuration& configuration) { | 120 void SetInstallerFlags(const Configuration& configuration) { |
| 116 StackString<128> value; | 121 StackString<128> value; |
| 117 | 122 |
| 118 for (int i = 0; i < 2; ++i) { | 123 for (bool binaries : {false, true}) { |
| 119 RegKey key; | 124 RegKey key; |
| 120 if (!OpenInstallStateKey(configuration, i != 0, &key)) | 125 if (!OpenInstallStateKey(configuration, binaries, &key)) |
| 121 continue; | 126 continue; |
| 122 | 127 |
| 123 LONG ret = key.ReadSZValue(kApRegistryValue, value.get(), value.capacity()); | 128 LONG ret = key.ReadSZValue(kApRegistryValue, value.get(), value.capacity()); |
| 124 | 129 |
| 125 // The conditions below are handling two cases: | 130 // The conditions below are handling two cases: |
| 126 // 1. When ap value is present, we want to add the required tag only if it | 131 // 1. When ap value is present, we want to add the required tag only if it |
| 127 // is not present. | 132 // is not present. |
| 128 // 2. When ap value is missing, we are going to create it with the required | 133 // 2. When ap value is missing, we are going to create it with the required |
| 129 // tag. | 134 // tag. |
| 130 if ((ret == ERROR_SUCCESS) || (ret == ERROR_FILE_NOT_FOUND)) { | 135 if ((ret == ERROR_SUCCESS) || (ret == ERROR_FILE_NOT_FOUND)) { |
| (...skipping 723 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 854 DeleteExtractedFiles(base_path.get(), archive_path.get(), setup_path.get()); | 859 DeleteExtractedFiles(base_path.get(), archive_path.get(), setup_path.get()); |
| 855 | 860 |
| 856 #if defined(GOOGLE_CHROME_BUILD) | 861 #if defined(GOOGLE_CHROME_BUILD) |
| 857 WriteInstallResults(configuration, exit_code); | 862 WriteInstallResults(configuration, exit_code); |
| 858 #endif | 863 #endif |
| 859 | 864 |
| 860 return exit_code; | 865 return exit_code; |
| 861 } | 866 } |
| 862 | 867 |
| 863 } // namespace mini_installer | 868 } // namespace mini_installer |
| OLD | NEW |