blob: e13f1a1cf1d6183b07fdf60ab29a8df9b6f068c2 [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_TRACING_WINDOWS_SYSTEM_TRACING_CLIENT_IMPL_WIN_H_
#define CHROME_BROWSER_TRACING_WINDOWS_SYSTEM_TRACING_CLIENT_IMPL_WIN_H_
#include <wrl/client.h>
#include <utility>
#include "base/gtest_prod_util.h"
#include "base/memory/weak_ptr.h"
#include "base/process/process_handle.h"
#include "base/threading/sequence_bound.h"
#include "base/types/expected.h"
#include "base/win/windows_types.h"
#include "chrome/browser/tracing/windows_system_tracing_client_win.h"
#include "chrome/windows_services/elevated_tracing_service/tracing_service_idl.h"
#include "mojo/public/cpp/system/message_pipe.h"
class WindowsSystemTracingClientImpl : public WindowsSystemTracingClient {
public:
WindowsSystemTracingClientImpl(const CLSID& clsid, const IID& iid);
WindowsSystemTracingClientImpl(const WindowsSystemTracingClientImpl&) =
delete;
WindowsSystemTracingClientImpl& operator=(
const WindowsSystemTracingClientImpl&) = delete;
~WindowsSystemTracingClientImpl() override;
void Start(OnRemoteProcess on_remote_process) override;
private:
FRIEND_TEST_ALL_PREFIXES(WindowsSystemTracingClientImplTest, InviteSucceeds);
FRIEND_TEST_ALL_PREFIXES(WindowsSystemTracingClientImplTest, AcceptFails);
FRIEND_TEST_ALL_PREFIXES(WindowsSystemTracingClientImplTest, LaunchFailed);
FRIEND_TEST_ALL_PREFIXES(WindowsSystemTracingClientImplTest, RunsCallback);
using ServiceState =
std::pair<base::ProcessId, mojo::ScopedMessagePipeHandle>;
// Lives on a STA COM thread.
class Host {
public:
Host(const CLSID& clsid, const IID& iid);
Host(const Host&) = delete;
Host& operator=(const Host&) = delete;
~Host();
// Launches the system tracing service. Returns the service's pid on
// success, or a failure reason in case of failure.
base::expected<ServiceState, HRESULT> LaunchService();
// Creates the trace session object. Public for ease of testing.
base::expected<Microsoft::WRL::ComPtr<ISystemTraceSession>, HRESULT>
CreateSession();
// Sends the mojo invitation to the service. Public for ease of testing.
base::expected<ServiceState, HRESULT> Invite(
Microsoft::WRL::ComPtr<ISystemTraceSession> trace_session);
private:
// The system tracing service's class and interface ids.
const CLSID clsid_;
const IID iid_;
// The trace session in the system tracing service.
Microsoft::WRL::ComPtr<ISystemTraceSession> trace_session_;
};
// Handles the result of launching the service. On success, the process is
// registered as a client process with the tracing system.
void OnLaunchServiceResult(OnRemoteProcess on_remote_process,
base::expected<ServiceState, HRESULT> result);
// The host, responsible for COM interactions with the system tracing service.
base::SequenceBound<Host> host_;
base::WeakPtrFactory<WindowsSystemTracingClientImpl> weak_factory_{this};
};
#endif // CHROME_BROWSER_TRACING_WINDOWS_SYSTEM_TRACING_CLIENT_IMPL_WIN_H_