2008-03-15 10:38:45 +01: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 18:08:12 +01:00
|
|
|
struct scmdatabase
|
|
|
|
{
|
|
|
|
HKEY root_key;
|
|
|
|
LONG service_start_lock;
|
2016-04-20 14:51:30 +02:00
|
|
|
struct list processes;
|
2008-03-28 18:08:12 +01:00
|
|
|
struct list services;
|
|
|
|
CRITICAL_SECTION cs;
|
|
|
|
};
|
|
|
|
|
2016-03-03 06:28:16 +01:00
|
|
|
struct process_entry
|
|
|
|
{
|
2016-04-20 14:51:30 +02:00
|
|
|
struct list entry;
|
|
|
|
struct scmdatabase *db;
|
2016-03-16 04:31:31 +01:00
|
|
|
LONG ref_count;
|
2016-03-03 06:28:16 +01:00
|
|
|
HANDLE process;
|
|
|
|
HANDLE control_mutex;
|
|
|
|
HANDLE control_pipe;
|
|
|
|
HANDLE overlapped_event;
|
|
|
|
HANDLE status_changed_event;
|
|
|
|
};
|
|
|
|
|
2008-03-15 10:38:45 +01:00
|
|
|
struct service_entry
|
|
|
|
{
|
|
|
|
struct list entry;
|
2008-03-28 18:08:12 +01:00
|
|
|
struct scmdatabase *db;
|
2008-03-15 16:42:38 +01:00
|
|
|
LONG ref_count; /* number of references - if goes to zero and the service is deleted the structure will be freed */
|
2008-03-15 10:38:45 +01:00
|
|
|
LPWSTR name;
|
|
|
|
SERVICE_STATUS_PROCESS status;
|
|
|
|
QUERY_SERVICE_CONFIGW config;
|
2011-11-30 15:28:26 +01:00
|
|
|
DWORD preshutdown_timeout;
|
2008-03-15 10:38:45 +01:00
|
|
|
LPWSTR description;
|
|
|
|
LPWSTR dependOnServices;
|
|
|
|
LPWSTR dependOnGroups;
|
2016-03-03 06:28:16 +01:00
|
|
|
struct process_entry *process;
|
2016-03-03 06:26:26 +01:00
|
|
|
BOOL force_shutdown;
|
2014-06-04 21:54:17 +02:00
|
|
|
BOOL marked_for_delete;
|
2015-02-26 23:30:54 +01:00
|
|
|
BOOL is_wow64;
|
2008-03-15 10:38:45 +01:00
|
|
|
};
|
|
|
|
|
2008-03-28 18:08:12 +01: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);
|
|
|
|
|
|
|
|
DWORD scmdatabase_lock_startup(struct scmdatabase *db);
|
|
|
|
void scmdatabase_unlock_startup(struct scmdatabase *db);
|
|
|
|
|
2016-03-02 07:21:17 +01:00
|
|
|
void scmdatabase_lock(struct scmdatabase *db);
|
2008-03-28 18:08:12 +01:00
|
|
|
void scmdatabase_unlock(struct scmdatabase *db);
|
|
|
|
|
|
|
|
/* Service functions */
|
|
|
|
|
|
|
|
DWORD service_create(LPCWSTR name, struct service_entry **entry);
|
2008-03-15 16:42:38 +01:00
|
|
|
BOOL validate_service_name(LPCWSTR name);
|
|
|
|
BOOL validate_service_config(struct service_entry *entry);
|
2008-03-15 19:11:12 +01:00
|
|
|
DWORD save_service_config(struct service_entry *entry);
|
2008-03-15 16:42:38 +01:00
|
|
|
void free_service_entry(struct service_entry *entry);
|
|
|
|
void release_service(struct service_entry *service);
|
2016-03-02 07:21:17 +01:00
|
|
|
void service_lock(struct service_entry *service);
|
2008-03-28 18:08:12 +01:00
|
|
|
void service_unlock(struct service_entry *service);
|
2008-04-11 12:00:11 +02:00
|
|
|
DWORD service_start(struct service_entry *service, DWORD service_argc, LPCWSTR *service_argv);
|
2011-12-12 11:04:46 +01:00
|
|
|
void service_terminate(struct service_entry *service);
|
2016-03-03 06:28:16 +01:00
|
|
|
|
|
|
|
/* Process functions */
|
|
|
|
|
2016-04-18 17:08:37 +02:00
|
|
|
struct process_entry *grab_process(struct process_entry *process);
|
2016-03-16 04:31:31 +01:00
|
|
|
void release_process(struct process_entry *process);
|
2016-03-03 06:28:16 +01:00
|
|
|
BOOL process_send_command(struct process_entry *process, const void *data, DWORD size, DWORD *result);
|
2016-04-20 14:51:30 +02:00
|
|
|
void process_terminate(struct process_entry *process);
|
2008-03-15 16:42:38 +01:00
|
|
|
|
2008-03-15 10:38:45 +01:00
|
|
|
extern HANDLE g_hStartedEvent;
|
|
|
|
|
2011-05-20 12:33:58 +02:00
|
|
|
extern DWORD service_pipe_timeout;
|
|
|
|
extern DWORD service_kill_timeout;
|
|
|
|
|
2008-04-11 11:59:51 +02:00
|
|
|
DWORD RPC_Init(void);
|
2012-10-22 14:26:10 +02:00
|
|
|
DWORD events_loop(void);
|
2008-03-15 10:38:45 +01:00
|
|
|
|
|
|
|
/* from utils.c */
|
|
|
|
LPWSTR strdupW(LPCWSTR str);
|
|
|
|
|
2008-03-15 16:42:38 +01:00
|
|
|
BOOL check_multisz(LPCWSTR lpMultiSz, DWORD cbSize);
|
|
|
|
|
2008-03-15 10:38:45 +01:00
|
|
|
DWORD load_reg_string(HKEY hKey, LPCWSTR szValue, BOOL bExpand, LPWSTR *output);
|
2008-09-17 00:35:01 +02:00
|
|
|
DWORD load_reg_multisz(HKEY hKey, LPCWSTR szValue, BOOL bAllowSingle, LPWSTR *output);
|
2008-03-15 10:38:45 +01:00
|
|
|
DWORD load_reg_dword(HKEY hKey, LPCWSTR szValue, DWORD *output);
|
|
|
|
|
2008-03-15 16:42:38 +01: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 21:54:17 +02: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 16:42:38 +01:00
|
|
|
}
|
|
|
|
|
2008-03-15 10:38:45 +01:00
|
|
|
#endif /*WINE_PROGRAMS_UTILS_H_*/
|