| // Copyright 2018 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <windows.h> |
| |
| #include "base/at_exit.h" |
| #include "base/command_line.h" |
| #include "base/logging.h" |
| #include "base/process/memory.h" |
| #include "base/win/process_startup_helper.h" |
| #include "base/win/scoped_com_initializer.h" |
| #include "chrome/elevation_service/service_main.h" |
| #include "chrome/install_static/product_install_details.h" |
| |
| extern "C" int WINAPI wWinMain(HINSTANCE instance, |
| HINSTANCE prev_instance, |
| base::char16* command_line, |
| int show_command) { |
| // Initialize the CommandLine singleton from the environment. |
| base::CommandLine::Init(0, nullptr); |
| |
| logging::LoggingSettings settings; |
| settings.logging_dest = |
| logging::LOG_TO_SYSTEM_DEBUG_LOG | logging::LOG_TO_STDERR; |
| logging::InitLogging(settings); |
| |
| // The exit manager is in charge of calling the dtors of singletons. |
| base::AtExitManager exit_manager; |
| |
| install_static::InitializeProductDetailsForPrimaryModule(); |
| |
| // Make sure the process exits cleanly on unexpected errors. |
| base::EnableTerminationOnHeapCorruption(); |
| base::EnableTerminationOnOutOfMemory(); |
| base::win::RegisterInvalidParamHandler(); |
| base::win::SetupCRT(*base::CommandLine::ForCurrentProcess()); |
| |
| // Initialize COM for the current thread. |
| base::win::ScopedCOMInitializer com_initializer( |
| base::win::ScopedCOMInitializer::kMTA); |
| if (!com_initializer.Succeeded()) { |
| PLOG(ERROR) << "Failed to initialize COM"; |
| return -1; |
| } |
| |
| // Run the COM service. |
| elevation_service::ServiceMain* service = |
| elevation_service::ServiceMain::GetInstance(); |
| if (!service->InitWithCommandLine(base::CommandLine::ForCurrentProcess())) |
| return -1; |
| |
| return service->Start(); |
| } |