OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome_frame/update_launcher.h" | |
6 | |
7 #include <windows.h> | |
8 #include <Shellapi.h> | |
9 | |
10 #include "base/win/scoped_com_initializer.h" | |
11 #include "base/win/scoped_comptr.h" | |
12 #include "base/win/scoped_handle.h" | |
13 #include "google_update/google_update_idl.h" | |
14 | |
15 namespace { | |
16 | |
17 const wchar_t kChromeFrameGuid[] = L"{8BA986DA-5100-405E-AA35-86F34A02ACBF}"; | |
18 | |
19 const DWORD kLaunchFailureExitCode = 0xFF; | |
20 | |
21 const wchar_t kUpdateCommandFlag[] = L"--update-cmd"; | |
22 | |
23 // Waits indefinitely for the provided process to exit. Returns the process's | |
24 // exit code, or kLaunchFailureExitCode if an error occurs in the waiting. | |
25 DWORD WaitForProcessExitCode(HANDLE handle) { | |
26 DWORD exit_code = 0; | |
27 return ((::WaitForSingleObject(handle, INFINITE) == WAIT_OBJECT_0) && | |
28 ::GetExitCodeProcess(handle, &exit_code)) ? | |
29 exit_code : kLaunchFailureExitCode; | |
30 } | |
31 | |
32 } // namespace | |
33 | |
34 namespace update_launcher { | |
35 | |
36 std::wstring GetUpdateCommandFromArguments(const wchar_t* command_line) { | |
37 std::wstring command; | |
38 | |
39 if (command_line != NULL) { | |
40 int num_args = 0; | |
41 wchar_t** args = NULL; | |
42 args = ::CommandLineToArgvW(command_line, &num_args); | |
43 | |
44 if (args) { | |
45 if (num_args == 3 && _wcsicmp(args[1], kUpdateCommandFlag) == 0) | |
46 command = args[2]; | |
47 ::LocalFree(args); | |
48 } | |
49 } | |
50 | |
51 return command; | |
52 } | |
53 | |
54 DWORD LaunchUpdateCommand(const std::wstring& command) { | |
55 base::win::ScopedCOMInitializer com_initializer; | |
56 if (!com_initializer.succeeded()) | |
57 return kLaunchFailureExitCode; | |
58 | |
59 base::win::ScopedComPtr<IProcessLauncher> ipl; | |
60 if (FAILED(ipl.CreateInstance(__uuidof(ProcessLauncherClass)))) | |
61 return kLaunchFailureExitCode; | |
62 | |
63 ULONG_PTR phandle = NULL; | |
64 if (FAILED(ipl->LaunchCmdElevated(kChromeFrameGuid, command.c_str(), | |
65 ::GetCurrentProcessId(), &phandle))) | |
66 return kLaunchFailureExitCode; | |
67 | |
68 base::win::ScopedHandle process(reinterpret_cast<HANDLE>(phandle)); | |
69 return WaitForProcessExitCode(process); | |
70 } | |
71 | |
72 } // namespace process_launcher | |
OLD | NEW |