| // Copyright 2020 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_CREDENTIAL_PROVIDER_EXTENSION_OS_SERVICE_MANAGER_H_ |
| #define CHROME_CREDENTIAL_PROVIDER_EXTENSION_OS_SERVICE_MANAGER_H_ |
| |
| #include <windows.h> |
| |
| #include "base/files/file_path.h" |
| #include "chrome/credential_provider/extension/scoped_handle.h" |
| |
| namespace credential_provider { |
| |
| namespace extension { |
| |
| class OSServiceManager { |
| public: |
| static OSServiceManager* Get(); |
| |
| virtual ~OSServiceManager(); |
| |
| // Creates a service object and adds it to the specified service control |
| // manager database. Uses the |service_binary_path| as the location of service |
| // binary. Returns handle of the service in |sc_handle| parameter. |
| virtual DWORD InstallService(const base::FilePath& service_binary_path, |
| ScopedScHandle* sc_handle); |
| |
| // Uses The QueryServiceStatus API which returns the most recent service |
| // status information reported to the service control manager. The |
| // |service_status| receives the latest status of the service. SERVICE_STATUS |
| // is obtained via QueryServiceStatus API call. |
| virtual DWORD GetServiceStatus(SERVICE_STATUS* service_status); |
| |
| // The DeleteService function marks a service for deletion from the service |
| // control manager database. The database entry is not removed until all open |
| // handles to the service have been closed by calls to the CloseServiceHandle |
| // function, and the service is not running. |
| virtual DWORD DeleteService(); |
| |
| // Starts the GCPW extension using StartService Windows API. |
| virtual DWORD StartGCPWService(); |
| |
| // Waits until service transitions to SERVICE_STOPPED state or the wait times |
| // out. Returns ERROR_SUCCESS if service is stopped successfully. Returns an |
| // error code in any other case. |
| virtual DWORD WaitForServiceStopped(); |
| |
| // Calls the ControlService API to change the state of the service. |control| |
| // needs to be one of the service controls as specified in documentation [1]. |
| // As a result |service_status| is returned that has the latest state of the |
| // service. [1] |
| // https://docs.microsoft.com/en-us/windows/win32/api/winsvc/nf-winsvc-controlservice |
| virtual DWORD ControlService(DWORD control); |
| |
| // Updates the configuration of the service. |
| virtual DWORD ChangeServiceConfig(DWORD dwServiceType, |
| DWORD dwStartType, |
| DWORD dwErrorControl); |
| |
| // When the service control manager starts a service process, it waits for the |
| // process to call the StartServiceCtrlDispatcher function. The main thread of |
| // a service process should make this call as soon as possible after it starts |
| // up (within 30 seconds). If StartServiceCtrlDispatcher succeeds, it connects |
| // the calling thread to the service control manager and does not return until |
| // all running services in the process have entered the SERVICE_STOPPED state. |
| // The lpServiceTable parameter contains an entry for each service that can |
| // run in the calling process. Each entry specifies the ServiceMain function |
| // for that service. |
| virtual DWORD StartServiceCtrlDispatcher( |
| LPSERVICE_MAIN_FUNCTION service_main); |
| |
| // Registers a function to handle service control requests. |
| virtual DWORD RegisterCtrlHandler( |
| LPHANDLER_FUNCTION handler_proc, |
| SERVICE_STATUS_HANDLE* service_status_handle); |
| |
| // Updates the service control manager's status information for the calling |
| // service. |
| virtual DWORD SetServiceStatus(SERVICE_STATUS_HANDLE service_status_handle, |
| SERVICE_STATUS service); |
| |
| protected: |
| OSServiceManager() {} |
| |
| // Returns the storage used for the instance pointer. |
| static OSServiceManager** GetInstanceStorage(); |
| }; |
| |
| } // namespace extension |
| } // namespace credential_provider |
| |
| #endif // CHROME_CREDENTIAL_PROVIDER_EXTENSION_OS_SERVICE_MANAGER_H_ |