chromium/chrome/credential_provider/gaiacp/os_process_manager.h

// Copyright 2018 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_CREDENTIAL_PROVIDER_GAIACP_OS_PROCESS_MANAGER_H_
#define CHROME_CREDENTIAL_PROVIDER_GAIACP_OS_PROCESS_MANAGER_H_

#include "base/win/scoped_handle.h"
#include "base/win/windows_types.h"

struct _STARTUPINFOW;

namespace base {

class CommandLine;

namespace win {

class ScopedProcessInformation;

}  // namespace win
}  // namespace base

namespace credential_provider {

// Manages OS processes and process attributes.
class [[clang::lto_visibility_public]] OSProcessManager {
 public:
  static OSProcessManager* Get();

  virtual ~OSProcessManager();

  // Gets the logon SID from the specified logon token.  The call must release
  // the returned |sid| by calling LocalFree().
  virtual HRESULT GetTokenLogonSID(const base::win::ScopedHandle& token,
                                   PSID* sid);

  // Sets up permissions for the given logon SID so that it can access the
  // interactive desktop of the window station.
  virtual HRESULT SetupPermissionsForLogonSid(PSID sid);

  // Creates a process with the specified logon token.  The process is initially
  // suspend and must be resumed by the caller.
  virtual HRESULT CreateProcessWithToken(
      const base::win::ScopedHandle& logon_token,
      const base::CommandLine& command_line,
      _STARTUPINFOW* startupinfo,
      base::win::ScopedProcessInformation* procinfo);

  // Creates a running process using the same security context as the caller.
  virtual HRESULT CreateRunningProcess(
      const base::CommandLine& command_line,
      _STARTUPINFOW* startupinfo,
      base::win::ScopedProcessInformation* procinfo);

  // This method is called from dllmain.cc when setting fakes from one module
  // to another.
  static void SetInstanceForTesting(OSProcessManager* instance);

 protected:
  OSProcessManager() {}

  // Returns the storage used for the instance pointer.
  static OSProcessManager** GetInstanceStorage();
};

}  // namespace credential_provider

#endif  // CHROME_CREDENTIAL_PROVIDER_GAIACP_OS_PROCESS_MANAGER_H_