OLD | NEW |
| (Empty) |
1 // Copyright 2007-2010 Google Inc. | |
2 // | |
3 // Licensed under the Apache License, Version 2.0 (the "License"); | |
4 // you may not use this file except in compliance with the License. | |
5 // You may obtain a copy of the License at | |
6 // | |
7 // http://www.apache.org/licenses/LICENSE-2.0 | |
8 // | |
9 // Unless required by applicable law or agreed to in writing, software | |
10 // distributed under the License is distributed on an "AS IS" BASIS, | |
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
12 // See the License for the specific language governing permissions and | |
13 // limitations under the License. | |
14 // ======================================================================== | |
15 // | |
16 // | |
17 // *** Documentation for OEM Installs *** | |
18 // | |
19 // A /oem install requires: | |
20 // * Per-machine install | |
21 // * Running as admin | |
22 // * Running in Windows audit mode (ConfigManager::IsWindowsInstalling()) | |
23 // * Offline installer (determined in LaunchHandoffProcess()) | |
24 // | |
25 // If the first three conditions are met, SetOemInstallState() writes the | |
26 // OemInstallTime registry value, which is used by IsOemInstalling() along with | |
27 // other logic to determine whether Omaha is running in an OEM install | |
28 // environment. Other objects use IsOemInstalling() - not | |
29 // ConfigureManager::IsWindowsInstalling() - to determine whether to run in a | |
30 // disabled mode for OEM factory installations. For example, the core exits | |
31 // immediately without checking for updates or Code Red events, no instances | |
32 // ping, and persistent IDs are not saved. | |
33 | |
34 #include "omaha/common/oem_install_utils.h" | |
35 #include "omaha/base/debug.h" | |
36 #include "omaha/base/error.h" | |
37 #include "omaha/base/logging.h" | |
38 #include "omaha/base/reg_key.h" | |
39 #include "omaha/base/time.h" | |
40 #include "omaha/base/vistautil.h" | |
41 #include "omaha/common/config_manager.h" | |
42 #include "omaha/common/const_goopdate.h" | |
43 #include "omaha/common/goopdate_utils.h" | |
44 | |
45 namespace omaha { | |
46 | |
47 namespace oem_install_utils { | |
48 | |
49 HRESULT SetOemInstallState(bool is_machine) { | |
50 bool is_windows_installing = ConfigManager::Instance()->IsWindowsInstalling(); | |
51 if (!is_machine || !vista_util::IsUserAdmin() || !is_windows_installing) { | |
52 return GOOPDATE_E_OEM_NOT_MACHINE_AND_PRIVILEGED_AND_AUDIT_MODE; | |
53 } | |
54 | |
55 const DWORD now = Time64ToInt32(GetCurrent100NSTime()); | |
56 | |
57 OPT_LOG(L1, (_T("[Beginning OEM install][%u]"), now)); | |
58 | |
59 goopdate_utils::DeleteUserId(is_machine); | |
60 | |
61 return RegKey::SetValue( | |
62 ConfigManager::Instance()->machine_registry_update(), | |
63 kRegValueOemInstallTimeSec, | |
64 now); | |
65 } | |
66 | |
67 HRESULT ResetOemInstallState(bool is_machine) { | |
68 if (!is_machine) { | |
69 return E_INVALIDARG; | |
70 } | |
71 | |
72 OPT_LOG(L1, (_T("[Reset OEM install state][%u]"), | |
73 Time64ToInt32(GetCurrent100NSTime()))); | |
74 | |
75 HRESULT hr = RegKey::DeleteValue( | |
76 ConfigManager::Instance()->machine_registry_update(), | |
77 kRegValueOemInstallTimeSec); | |
78 | |
79 return hr; | |
80 } | |
81 | |
82 // Always returns false if !is_machine. This prevents ever blocking per-user | |
83 // instances. | |
84 // Returns true if OEM install time is present and it has been less than | |
85 // kMinOemModeSec since the OEM install. | |
86 // Non-OEM installs can never be blocked from updating because OEM install time | |
87 // will not be present. | |
88 bool IsOemInstalling(bool is_machine) { | |
89 if (!is_machine) { | |
90 return false; | |
91 } | |
92 | |
93 DWORD oem_install_time_seconds = 0; | |
94 if (FAILED(RegKey::GetValue(MACHINE_REG_UPDATE, | |
95 kRegValueOemInstallTimeSec, | |
96 &oem_install_time_seconds))) { | |
97 CORE_LOG(L3, (_T("[IsOemInstalling][OemInstallTime not found]"))); | |
98 return false; | |
99 } | |
100 | |
101 const uint32 now_seconds = Time64ToInt32(GetCurrent100NSTime()); | |
102 if (now_seconds < oem_install_time_seconds) { | |
103 CORE_LOG(LW, (_T("[possible time warp detected][now %u][last checked %u]"), | |
104 now_seconds, oem_install_time_seconds)); | |
105 } | |
106 const int time_difference_seconds = | |
107 abs(static_cast<int>(now_seconds - oem_install_time_seconds)); | |
108 | |
109 ASSERT1(0 <= time_difference_seconds); | |
110 const bool result = time_difference_seconds < kMinOemModeSec ? true : false; | |
111 | |
112 CORE_LOG(L3, (_T("[now %u][OEM install time %u][time difference %u][%d]"), | |
113 now_seconds, oem_install_time_seconds, time_difference_seconds, | |
114 result)); | |
115 return result; | |
116 } | |
117 | |
118 } // namespace oem_install_utils | |
119 | |
120 } // namespace omaha | |
OLD | NEW |