OLD | NEW |
1 // Copyright (c) 2011 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 // This file declares util functions for setup project. | 5 // This file declares util functions for setup project. |
6 | 6 |
7 #include "chrome/installer/setup/setup_util.h" | 7 #include "chrome/installer/setup/setup_util.h" |
8 | 8 |
9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "base/string_util.h" | 11 #include "base/string_util.h" |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
131 PLOG(ERROR) << "VirtualAllocEx"; | 131 PLOG(ERROR) << "VirtualAllocEx"; |
132 ::TerminateProcess(pi.hProcess, ~0); | 132 ::TerminateProcess(pi.hProcess, ~0); |
133 } | 133 } |
134 ::CloseHandle(pi.hThread); | 134 ::CloseHandle(pi.hThread); |
135 ::CloseHandle(pi.hProcess); | 135 ::CloseHandle(pi.hProcess); |
136 } | 136 } |
137 | 137 |
138 return ok != FALSE; | 138 return ok != FALSE; |
139 } | 139 } |
140 | 140 |
141 // Open |path| with minimal access to obtain information about it, returning | |
142 // true and populating |handle| on success. | |
143 // static | |
144 bool ProgramCompare::OpenForInfo(const FilePath& path, | |
145 base::win::ScopedHandle* handle) { | |
146 DCHECK(handle); | |
147 handle->Set(base::CreatePlatformFile(path, base::PLATFORM_FILE_OPEN, NULL, | |
148 NULL)); | |
149 return handle->IsValid(); | |
150 } | |
151 | |
152 // Populate |info| for |handle|, returning true on success. | |
153 // static | |
154 bool ProgramCompare::GetInfo(const base::win::ScopedHandle& handle, | |
155 BY_HANDLE_FILE_INFORMATION* info) { | |
156 DCHECK(handle.IsValid()); | |
157 return GetFileInformationByHandle( | |
158 const_cast<base::win::ScopedHandle&>(handle), info) != 0; | |
159 } | |
160 | |
161 ProgramCompare::ProgramCompare(const FilePath& path_to_match) | |
162 : path_to_match_(path_to_match), | |
163 file_handle_(base::kInvalidPlatformFileValue), | |
164 file_info_() { | |
165 DCHECK(!path_to_match_.empty()); | |
166 if (!OpenForInfo(path_to_match_, &file_handle_)) { | |
167 PLOG(WARNING) << "Failed opening " << path_to_match_.value() | |
168 << "; falling back to path string comparisons."; | |
169 } else if (!GetInfo(file_handle_, &file_info_)) { | |
170 PLOG(WARNING) << "Failed getting information for " | |
171 << path_to_match_.value() | |
172 << "; falling back to path string comparisons."; | |
173 file_handle_.Close(); | |
174 } | |
175 } | |
176 | |
177 ProgramCompare::~ProgramCompare() { | |
178 } | |
179 | |
180 bool ProgramCompare::Evaluate(const std::wstring& value) const { | |
181 // Suss out the exe portion of the value, which is expected to be a command | |
182 // line kinda (or exactly) like: | |
183 // "c:\foo\bar\chrome.exe" -- "%1" | |
184 FilePath program(CommandLine::FromString(value).GetProgram()); | |
185 if (program.empty()) { | |
186 LOG(WARNING) << "Failed to parse an executable name from command line: \"" | |
187 << value << "\""; | |
188 return false; | |
189 } | |
190 | |
191 // Try the simple thing first: do the paths happen to match? | |
192 if (FilePath::CompareEqualIgnoreCase(path_to_match_.value(), program.value())) | |
193 return true; | |
194 | |
195 // If the paths don't match and we couldn't open the expected file, we've done | |
196 // our best. | |
197 if (!file_handle_.IsValid()) | |
198 return false; | |
199 | |
200 // Open the program and see if it references the expected file. | |
201 base::win::ScopedHandle handle; | |
202 BY_HANDLE_FILE_INFORMATION info = {}; | |
203 | |
204 return (OpenForInfo(program, &handle) && | |
205 GetInfo(handle, &info) && | |
206 info.dwVolumeSerialNumber == file_info_.dwVolumeSerialNumber && | |
207 info.nFileIndexHigh == file_info_.nFileIndexHigh && | |
208 info.nFileIndexLow == file_info_.nFileIndexLow); | |
209 } | |
210 | |
211 } // namespace installer | 141 } // namespace installer |
OLD | NEW |