| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 #include "chrome/installer/gcapi/gcapi.h" | 5 #include "chrome/installer/gcapi/gcapi.h" |
| 6 | 6 |
| 7 #include <atlbase.h> | 7 #include <atlbase.h> |
| 8 #include <atlcom.h> | 8 #include <atlcom.h> |
| 9 #include <windows.h> | 9 #include <windows.h> |
| 10 #include <sddl.h> | 10 #include <sddl.h> |
| 11 #include <stdlib.h> | 11 #include <stdlib.h> |
| 12 #include <strsafe.h> | 12 #include <strsafe.h> |
| 13 #include <tlhelp32.h> | 13 #include <tlhelp32.h> |
| 14 | 14 |
| 15 #include "google_update_idl.h" | 15 #include "google_update_idl.h" |
| 16 | 16 |
| 17 namespace { | 17 namespace { |
| 18 | 18 |
| 19 const wchar_t kChromeRegClientsKey[] = L"Software\\Google\\Update\\Clients\\{8A6
9D345-D564-463c-AFF1-A69D9E530F96}"; | 19 const wchar_t kChromeRegClientsKey[] = |
| 20 const wchar_t kChromeRegClientStateKey[] = L"Software\\Google\\Update\\ClientSta
te\\{8A69D345-D564-463c-AFF1-A69D9E530F96}"; | 20 L"Software\\Google\\Update\\Clients\\" |
| 21 L"{8A69D345-D564-463c-AFF1-A69D9E530F96}"; |
| 22 const wchar_t kChromeRegClientStateKey[] = |
| 23 L"Software\\Google\\Update\\ClientState\\" |
| 24 L"{8A69D345-D564-463c-AFF1-A69D9E530F96}"; |
| 21 const wchar_t kChromeRegLaunchCmd[] = L"InstallerSuccessLaunchCmdLine"; | 25 const wchar_t kChromeRegLaunchCmd[] = L"InstallerSuccessLaunchCmdLine"; |
| 22 const wchar_t kChromeRegLastLaunchCmd[] = L"LastInstallerSuccessLaunchCmdLine"; | 26 const wchar_t kChromeRegLastLaunchCmd[] = L"LastInstallerSuccessLaunchCmdLine"; |
| 23 const wchar_t kChromeRegVersion[] = L"pv"; | 27 const wchar_t kChromeRegVersion[] = L"pv"; |
| 24 const wchar_t kNoChromeOfferUntil[] = L"SOFTWARE\\Google\\No Chrome Offer Until"
; | 28 const wchar_t kNoChromeOfferUntil[] = |
| 29 L"SOFTWARE\\Google\\No Chrome Offer Until"; |
| 25 | 30 |
| 26 // Return the company name specified in the file version info resource. | 31 // Return the company name specified in the file version info resource. |
| 27 bool GetCompanyName(const wchar_t* filename, wchar_t* buffer, DWORD out_len) { | 32 bool GetCompanyName(const wchar_t* filename, wchar_t* buffer, DWORD out_len) { |
| 28 wchar_t file_version_info[8192]; | 33 wchar_t file_version_info[8192]; |
| 29 DWORD handle = 0; | 34 DWORD handle = 0; |
| 30 DWORD buffer_size = 0; | 35 DWORD buffer_size = 0; |
| 31 | 36 |
| 32 buffer_size = ::GetFileVersionInfoSize(filename, &handle); | 37 buffer_size = ::GetFileVersionInfoSize(filename, &handle); |
| 33 // Cannot stats the file or our buffer size is too small (very unlikely). | 38 // Cannot stats the file or our buffer size is too small (very unlikely). |
| 34 if (buffer_size == 0 || buffer_size > _countof(file_version_info)) | 39 if (buffer_size == 0 || buffer_size > _countof(file_version_info)) |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 88 bool can_re_offer = true; | 93 bool can_re_offer = true; |
| 89 DWORD disposition = 0; | 94 DWORD disposition = 0; |
| 90 HKEY key = NULL; | 95 HKEY key = NULL; |
| 91 if (::RegCreateKeyEx(HKEY_LOCAL_MACHINE, kNoChromeOfferUntil, | 96 if (::RegCreateKeyEx(HKEY_LOCAL_MACHINE, kNoChromeOfferUntil, |
| 92 0, NULL, REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE, | 97 0, NULL, REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE, |
| 93 NULL, &key, &disposition) == ERROR_SUCCESS) { | 98 NULL, &key, &disposition) == ERROR_SUCCESS) { |
| 94 // Get today's date, and format it as YYYYMMDD numeric value. | 99 // Get today's date, and format it as YYYYMMDD numeric value. |
| 95 SYSTEMTIME now; | 100 SYSTEMTIME now; |
| 96 GetLocalTime(&now); | 101 GetLocalTime(&now); |
| 97 DWORD today = now.wYear * 10000 + now.wMonth * 100 + now.wDay; | 102 DWORD today = now.wYear * 10000 + now.wMonth * 100 + now.wDay; |
| 98 | 103 |
| 99 // Cannot re-offer, if the timer already exists and is not expired yet. | 104 // Cannot re-offer, if the timer already exists and is not expired yet. |
| 100 DWORD value_type = REG_DWORD; | 105 DWORD value_type = REG_DWORD; |
| 101 DWORD value_data = 0; | 106 DWORD value_data = 0; |
| 102 DWORD value_length = sizeof(DWORD); | 107 DWORD value_length = sizeof(DWORD); |
| 103 if (::RegQueryValueEx(key, company, 0, &value_type, | 108 if (::RegQueryValueEx(key, company, 0, &value_type, |
| 104 reinterpret_cast<LPBYTE>(&value_data), | 109 reinterpret_cast<LPBYTE>(&value_data), |
| 105 &value_length) == ERROR_SUCCESS && | 110 &value_length) == ERROR_SUCCESS && |
| 106 REG_DWORD == value_type && | 111 REG_DWORD == value_type && |
| 107 value_data > today) { | 112 value_data > today) { |
| 108 // The time has not expired, we cannot offer Chrome. | 113 // The time has not expired, we cannot offer Chrome. |
| 109 can_re_offer = false; | 114 can_re_offer = false; |
| 110 } else { | 115 } else { |
| 111 // Delete the old or invalid value. | 116 // Delete the old or invalid value. |
| 112 ::RegDeleteValue(key, company); | 117 ::RegDeleteValue(key, company); |
| 113 if (set_flag) { | 118 if (set_flag) { |
| 114 // Set expiration date for offer as six months from today, | 119 // Set expiration date for offer as six months from today, |
| 115 // represented as a YYYYMMDD numeric value. | 120 // represented as a YYYYMMDD numeric value. |
| 116 SYSTEMTIME timer = now; | 121 SYSTEMTIME timer = now; |
| 117 timer.wMonth = timer.wMonth + 6; | 122 timer.wMonth = timer.wMonth + 6; |
| 118 if (timer.wMonth > 12) { | 123 if (timer.wMonth > 12) { |
| 119 timer.wMonth = timer.wMonth - 12; | 124 timer.wMonth = timer.wMonth - 12; |
| 120 timer.wYear = timer.wYear + 1; | 125 timer.wYear = timer.wYear + 1; |
| 121 } | 126 } |
| 122 DWORD value = timer.wYear * 10000 + timer.wMonth * 100 + timer.wDay; | 127 DWORD value = timer.wYear * 10000 + timer.wMonth * 100 + timer.wDay; |
| 123 ::RegSetValueEx(key, company, 0, REG_DWORD, (LPBYTE)&value, | 128 ::RegSetValueEx(key, company, 0, REG_DWORD, (LPBYTE)&value, |
| 124 sizeof(DWORD)); | 129 sizeof(DWORD)); |
| 125 } | 130 } |
| 126 } | 131 } |
| 127 | 132 |
| 128 ::RegCloseKey(key); | 133 ::RegCloseKey(key); |
| 129 } | 134 } |
| 130 | 135 |
| 131 return can_re_offer; | 136 return can_re_offer; |
| 132 } | 137 } |
| 133 | 138 |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 271 delete[] token_user; | 276 delete[] token_user; |
| 272 } | 277 } |
| 273 ::CloseHandle(process_token); | 278 ::CloseHandle(process_token); |
| 274 } | 279 } |
| 275 ::CloseHandle(process_handle); | 280 ::CloseHandle(process_handle); |
| 276 return result; | 281 return result; |
| 277 } | 282 } |
| 278 } // namespace | 283 } // namespace |
| 279 | 284 |
| 280 #pragma comment(linker, "/EXPORT:GoogleChromeCompatibilityCheck=_GoogleChromeCom
patibilityCheck@8,PRIVATE") | 285 #pragma comment(linker, "/EXPORT:GoogleChromeCompatibilityCheck=_GoogleChromeCom
patibilityCheck@8,PRIVATE") |
| 281 DLLEXPORT BOOL __stdcall GoogleChromeCompatibilityCheck(BOOL set_flag, DWORD *re
asons) { | 286 DLLEXPORT BOOL __stdcall GoogleChromeCompatibilityCheck(BOOL set_flag, |
| 287 DWORD *reasons) { |
| 282 DWORD local_reasons = 0; | 288 DWORD local_reasons = 0; |
| 283 | 289 |
| 284 bool is_vista_or_later = false; | 290 bool is_vista_or_later = false; |
| 285 // System requirements? | 291 // System requirements? |
| 286 if (!IsWinXPSp1OrLater(&is_vista_or_later)) | 292 if (!IsWinXPSp1OrLater(&is_vista_or_later)) |
| 287 local_reasons |= GCCC_ERROR_OSNOTSUPPORTED; | 293 local_reasons |= GCCC_ERROR_OSNOTSUPPORTED; |
| 288 | 294 |
| 289 if (IsChromeInstalled(HKEY_LOCAL_MACHINE)) | 295 if (IsChromeInstalled(HKEY_LOCAL_MACHINE)) |
| 290 local_reasons |= GCCC_ERROR_SYSTEMLEVELALREADYPRESENT; | 296 local_reasons |= GCCC_ERROR_SYSTEMLEVELALREADYPRESENT; |
| 291 | 297 |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 395 if (!FAILED(ipl->LaunchCmdLine(launch_cmd))) | 401 if (!FAILED(ipl->LaunchCmdLine(launch_cmd))) |
| 396 ret = true; | 402 ret = true; |
| 397 ipl.Release(); | 403 ipl.Release(); |
| 398 } | 404 } |
| 399 | 405 |
| 400 if (impersonation_success) | 406 if (impersonation_success) |
| 401 ::RevertToSelf(); | 407 ::RevertToSelf(); |
| 402 ::CoUninitialize(); | 408 ::CoUninitialize(); |
| 403 return ret; | 409 return ret; |
| 404 } | 410 } |
| OLD | NEW |