blob: 8cd1e42378b3984f760c73cb8dcc7abbcc6c1e7c [file] [log] [blame] [edit]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/installer/util/system_tracing_util.h"
#include "base/path_service.h"
#include "chrome/install_static/install_util.h"
#include "chrome/installer/util/helper.h"
#include "chrome/installer/util/install_service_work_item.h"
#include "chrome/installer/util/install_util.h"
namespace installer {
namespace {
base::CommandLine MakeCommand(bool register_service) {
base::FilePath setup_exe =
InstallUtil::GetChromeUninstallCmd(/*system_level=*/true).GetProgram();
if (setup_exe.empty()) {
return base::CommandLine(base::CommandLine::NO_PROGRAM);
}
base::CommandLine command(setup_exe);
command.AppendSwitch(register_service ? switches::kEnableSystemTracing
: switches::kDisableSystemTracing);
command.AppendSwitch(switches::kSystemLevel);
command.AppendSwitch(switches::kVerboseLogging);
InstallUtil::AppendModeAndChannelSwitches(&command);
return command;
}
bool DoServiceRegistration(bool register_service) {
if (!IsSystemTracingServiceSupported()) {
return false;
}
DWORD exit_code = 0;
return InstallUtil::ExecuteExeAsAdmin(MakeCommand(register_service),
&exit_code) &&
exit_code == INSTALL_REPAIRED;
}
} // namespace
bool IsSystemTracingServiceSupported() {
// Only supported for browsers of per-machine installs.
return !InstallUtil::IsPerUserInstall() && IsCurrentProcessInstalled();
}
bool IsSystemTracingServiceRegistered() {
return !InstallUtil::IsPerUserInstall() &&
InstallServiceWorkItem::IsComServiceInstalled(
install_static::GetTracingServiceClsid());
}
bool ElevateAndRegisterSystemTracingService() {
return DoServiceRegistration(/*register_service=*/true);
}
bool ElevateAndDeregisterSystemTracingService() {
return DoServiceRegistration(/*register_service=*/false);
}
} // namespace installer