2008-03-15 09:38:45 +00:00
|
|
|
/*
|
|
|
|
* Services.exe - include file
|
|
|
|
*
|
|
|
|
* Copyright 2007 Google (Mikolaj Zalewski)
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Lesser General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
|
|
* License along with this library; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef WINE_PROGRAMS_UTILS_H_
|
|
|
|
#define WINE_PROGRAMS_UTILS_H_
|
|
|
|
|
|
|
|
#include "wine/list.h"
|
|
|
|
|
2008-03-28 17:08:12 +00:00
|
|
|
struct scmdatabase
|
|
|
|
{
|
|
|
|
HKEY root_key;
|
|
|
|
LONG service_start_lock;
|
2016-04-20 12:51:30 +00:00
|
|
|
struct list processes;
|
2008-03-28 17:08:12 +00:00
|
|
|
struct list services;
|
|
|
|
CRITICAL_SECTION cs;
|
|
|
|
};
|
|
|
|
|
2016-03-03 05:28:16 +00:00
|
|
|
struct process_entry
|
|
|
|
{
|
2016-04-20 12:51:30 +00:00
|
|
|
struct list entry;
|
|
|
|
struct scmdatabase *db;
|
2016-03-16 03:31:31 +00:00
|
|
|
LONG ref_count;
|
2016-08-18 07:27:58 +00:00
|
|
|
LONG use_count;
|
2016-08-11 05:21:23 +00:00
|
|
|
DWORD process_id;
|
2016-03-03 05:28:16 +00:00
|
|
|
HANDLE process;
|
|
|
|
HANDLE control_mutex;
|
|
|
|
HANDLE control_pipe;
|
|
|
|
HANDLE overlapped_event;
|
|
|
|
};
|
|
|
|
|
2008-03-15 09:38:45 +00:00
|
|
|
struct service_entry
|
|
|
|
{
|
|
|
|
struct list entry;
|
2008-03-28 17:08:12 +00:00
|
|
|
struct scmdatabase *db;
|
2008-03-15 15:42:38 +00:00
|
|
|
LONG ref_count; /* number of references - if goes to zero and the service is deleted the structure will be freed */
|
2008-03-15 09:38:45 +00:00
|
|
|
LPWSTR name;
|
2016-08-11 05:21:23 +00:00
|
|
|
SERVICE_STATUS status;
|
2016-08-19 06:01:03 +00:00
|
|
|
HANDLE status_changed_event;
|
2008-03-15 09:38:45 +00:00
|
|
|
QUERY_SERVICE_CONFIGW config;
|
2011-11-30 14:28:26 +00:00
|
|
|
DWORD preshutdown_timeout;
|
2008-03-15 09:38:45 +00:00
|
|
|
LPWSTR description;
|
|
|
|
LPWSTR dependOnServices;
|
|
|
|
LPWSTR dependOnGroups;
|
2016-03-03 05:28:16 +00:00
|
|
|
struct process_entry *process;
|
2016-09-01 05:39:29 +00:00
|
|
|
BOOL shared_process;
|
2016-03-03 05:26:26 +00:00
|
|
|
BOOL force_shutdown;
|
2014-06-04 19:54:17 +00:00
|
|
|
BOOL marked_for_delete;
|
2015-02-26 22:30:54 +00:00
|
|
|
BOOL is_wow64;
|
2019-06-20 15:58:45 +00:00
|
|
|
BOOL delayed_autostart;
|
2019-01-28 14:52:24 +00:00
|
|
|
struct list handles;
|
2008-03-15 09:38:45 +00:00
|
|
|
};
|
|
|
|
|
2008-03-28 17:08:12 +00:00
|
|
|
extern struct scmdatabase *active_database;
|
|
|
|
|
|
|
|
/* SCM database functions */
|
|
|
|
|
|
|
|
struct service_entry *scmdatabase_find_service(struct scmdatabase *db, LPCWSTR name);
|
|
|
|
struct service_entry *scmdatabase_find_service_by_displayname(struct scmdatabase *db, LPCWSTR name);
|
|
|
|
DWORD scmdatabase_add_service(struct scmdatabase *db, struct service_entry *entry);
|
|
|
|
|
2018-04-09 11:29:02 +00:00
|
|
|
BOOL scmdatabase_lock_startup(struct scmdatabase *db, int timeout);
|
2008-03-28 17:08:12 +00:00
|
|
|
void scmdatabase_unlock_startup(struct scmdatabase *db);
|
|
|
|
|
2016-03-02 06:21:17 +00:00
|
|
|
void scmdatabase_lock(struct scmdatabase *db);
|
2008-03-28 17:08:12 +00:00
|
|
|
void scmdatabase_unlock(struct scmdatabase *db);
|
|
|
|
|
|
|
|
/* Service functions */
|
|
|
|
|
|
|
|
DWORD service_create(LPCWSTR name, struct service_entry **entry);
|
2008-03-15 15:42:38 +00:00
|
|
|
BOOL validate_service_name(LPCWSTR name);
|
|
|
|
BOOL validate_service_config(struct service_entry *entry);
|
2008-03-15 18:11:12 +00:00
|
|
|
DWORD save_service_config(struct service_entry *entry);
|
2008-03-15 15:42:38 +00:00
|
|
|
void free_service_entry(struct service_entry *entry);
|
2016-08-17 07:12:27 +00:00
|
|
|
struct service_entry *grab_service(struct service_entry *service);
|
2008-03-15 15:42:38 +00:00
|
|
|
void release_service(struct service_entry *service);
|
2016-03-02 06:21:17 +00:00
|
|
|
void service_lock(struct service_entry *service);
|
2008-03-28 17:08:12 +00:00
|
|
|
void service_unlock(struct service_entry *service);
|
2008-04-11 10:00:11 +00:00
|
|
|
DWORD service_start(struct service_entry *service, DWORD service_argc, LPCWSTR *service_argv);
|
2016-03-03 05:28:16 +00:00
|
|
|
|
|
|
|
/* Process functions */
|
|
|
|
|
2016-04-18 15:08:37 +00:00
|
|
|
struct process_entry *grab_process(struct process_entry *process);
|
2016-03-16 03:31:31 +00:00
|
|
|
void release_process(struct process_entry *process);
|
2016-09-01 05:39:29 +00:00
|
|
|
BOOL process_send_control(struct process_entry *process, BOOL winedevice, const WCHAR *name,
|
|
|
|
DWORD control, const BYTE *data, DWORD data_size, DWORD *result);
|
2016-04-20 12:51:30 +00:00
|
|
|
void process_terminate(struct process_entry *process);
|
2008-03-15 15:42:38 +00:00
|
|
|
|
2011-05-20 10:33:58 +00:00
|
|
|
extern DWORD service_pipe_timeout;
|
|
|
|
extern DWORD service_kill_timeout;
|
2016-08-18 07:38:24 +00:00
|
|
|
extern HANDLE exit_event;
|
2011-05-20 10:33:58 +00:00
|
|
|
|
2008-04-11 09:59:51 +00:00
|
|
|
DWORD RPC_Init(void);
|
2016-08-18 07:38:24 +00:00
|
|
|
void RPC_Stop(void);
|
2008-03-15 09:38:45 +00:00
|
|
|
|
|
|
|
/* from utils.c */
|
|
|
|
|
2008-03-15 15:42:38 +00:00
|
|
|
BOOL check_multisz(LPCWSTR lpMultiSz, DWORD cbSize);
|
|
|
|
|
2008-03-15 09:38:45 +00:00
|
|
|
DWORD load_reg_string(HKEY hKey, LPCWSTR szValue, BOOL bExpand, LPWSTR *output);
|
2008-09-16 22:35:01 +00:00
|
|
|
DWORD load_reg_multisz(HKEY hKey, LPCWSTR szValue, BOOL bAllowSingle, LPWSTR *output);
|
2008-03-15 09:38:45 +00:00
|
|
|
DWORD load_reg_dword(HKEY hKey, LPCWSTR szValue, DWORD *output);
|
|
|
|
|
2008-03-15 15:42:38 +00:00
|
|
|
static inline LPCWSTR get_display_name(struct service_entry *service)
|
|
|
|
{
|
|
|
|
return service->config.lpDisplayName ? service->config.lpDisplayName : service->name;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline BOOL is_marked_for_delete(struct service_entry *service)
|
|
|
|
{
|
2014-06-04 19:54:17 +00:00
|
|
|
return service->marked_for_delete;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline DWORD mark_for_delete(struct service_entry *service)
|
|
|
|
{
|
|
|
|
service->marked_for_delete = TRUE;
|
|
|
|
return ERROR_SUCCESS;
|
2008-03-15 15:42:38 +00:00
|
|
|
}
|
|
|
|
|
2008-03-15 09:38:45 +00:00
|
|
|
#endif /*WINE_PROGRAMS_UTILS_H_*/
|