// 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.

#ifndef CHROME_CHROME_CLEANER_OS_SYSTEM_UTIL_CLEANER_H_
#define CHROME_CHROME_CLEANER_OS_SYSTEM_UTIL_CLEANER_H_

#include <windows.h>

#include "base/command_line.h"
#include "base/process/process.h"
#include "base/win/wrapped_window_proc.h"

namespace base {
class FilePath;
}  // namespace base

namespace chrome_cleaner {

// Adjust process token privileges to acquire debugging privileges, return
// false on failure.
bool AcquireDebugRightsPrivileges();

// Adjust process token privileges to disallow debugging privileges, return
// false on failure.
bool ReleaseDebugRightsPrivileges();

// Returns true if the process currently has debugging privileges.
bool HasDebugRightsPrivileges();

// Verify if the current process has admin rights or not and cache the result.
// @returns true if the current process is running elevated.
bool HasAdminRights();

// Check whether the thumbprint (sha1) of the signing certificate of a given
// file is part of a sorted array of thumbprints.
bool IsFileCertificateThumbprintInArray(const base::FilePath& fullpath,
                                        const char* const thumbprints[],
                                        size_t thumbprints_length);

// Check whether a process is running with the image |executable|. Return true
// if a process is found.
bool IsProcessRunning(const wchar_t* executable);

// Wait until every running instance of |executable| is stopped. Return true if
// every running processes are stopped.
bool WaitForProcessesStopped(const wchar_t* executable);

// Return true when a service with name |service_name| exist.
bool DoesServiceExist(const wchar_t* service_name);

// Wait until service named |service_name| is stopped. Return true if the
// service is stopped or doesn't exist.
bool WaitForServiceStopped(const wchar_t* service_name);

// Wait until service named |service_name| is deleted. Return true if the
// service is deleted.
bool WaitForServiceDeleted(const wchar_t* service_name);

// Check whether a service with name |service_name| exist, and stop it. Return
// true on success.
bool StopService(const wchar_t* service_name);

// Delete the service with name |service_name|. Return true on success.
bool DeleteService(const wchar_t* service_name);

// Call at program startup to configure COM security such that some system APIs
// can be used. Return false on failures.
bool InitializeCOMSecurity();

// Launches an elevated process in a STA-initialize thread and sets the parent
// window to the one specified by |hwnd|. A nullptr can be passed as |hwnd| if
// there is no need to associate the process with a window.
base::Process LaunchElevatedProcessWithAssociatedWindow(
    const base::CommandLine& command_line,
    HWND hwnd);

}  // namespace chrome_cleaner

#endif  // CHROME_CHROME_CLEANER_OS_SYSTEM_UTIL_CLEANER_H_
