Release 1.9.5.
[wine.git] / programs / services / services.h
blob206d655a9028898b78f6f947d2db6474b74d8b23
1 /*
2 * Services.exe - include file
4 * Copyright 2007 Google (Mikolaj Zalewski)
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #ifndef WINE_PROGRAMS_UTILS_H_
22 #define WINE_PROGRAMS_UTILS_H_
24 #include "wine/list.h"
26 struct scmdatabase
28 HKEY root_key;
29 LONG service_start_lock;
30 struct list services;
31 CRITICAL_SECTION cs;
34 struct process_entry
36 HANDLE process;
37 HANDLE control_mutex;
38 HANDLE control_pipe;
39 HANDLE overlapped_event;
40 HANDLE status_changed_event;
43 struct service_entry
45 struct list entry;
46 struct scmdatabase *db;
47 LONG ref_count; /* number of references - if goes to zero and the service is deleted the structure will be freed */
48 LPWSTR name;
49 SERVICE_STATUS_PROCESS status;
50 QUERY_SERVICE_CONFIGW config;
51 DWORD preshutdown_timeout;
52 LPWSTR description;
53 LPWSTR dependOnServices;
54 LPWSTR dependOnGroups;
55 struct process_entry *process;
56 BOOL force_shutdown;
57 BOOL marked_for_delete;
58 BOOL is_wow64;
61 extern struct scmdatabase *active_database;
63 /* SCM database functions */
65 struct service_entry *scmdatabase_find_service(struct scmdatabase *db, LPCWSTR name);
66 struct service_entry *scmdatabase_find_service_by_displayname(struct scmdatabase *db, LPCWSTR name);
67 DWORD scmdatabase_add_service(struct scmdatabase *db, struct service_entry *entry);
69 DWORD scmdatabase_lock_startup(struct scmdatabase *db);
70 void scmdatabase_unlock_startup(struct scmdatabase *db);
72 void scmdatabase_lock(struct scmdatabase *db);
73 void scmdatabase_unlock(struct scmdatabase *db);
75 /* Service functions */
77 DWORD service_create(LPCWSTR name, struct service_entry **entry);
78 BOOL validate_service_name(LPCWSTR name);
79 BOOL validate_service_config(struct service_entry *entry);
80 DWORD save_service_config(struct service_entry *entry);
81 void free_service_entry(struct service_entry *entry);
82 void release_service(struct service_entry *service);
83 void service_lock(struct service_entry *service);
84 void service_unlock(struct service_entry *service);
85 DWORD service_start(struct service_entry *service, DWORD service_argc, LPCWSTR *service_argv);
86 void service_terminate(struct service_entry *service);
88 /* Process functions */
90 BOOL process_send_command(struct process_entry *process, const void *data, DWORD size, DWORD *result);
92 extern HANDLE g_hStartedEvent;
94 extern DWORD service_pipe_timeout;
95 extern DWORD service_kill_timeout;
97 DWORD RPC_Init(void);
98 DWORD events_loop(void);
100 /* from utils.c */
101 LPWSTR strdupW(LPCWSTR str);
103 BOOL check_multisz(LPCWSTR lpMultiSz, DWORD cbSize);
105 DWORD load_reg_string(HKEY hKey, LPCWSTR szValue, BOOL bExpand, LPWSTR *output);
106 DWORD load_reg_multisz(HKEY hKey, LPCWSTR szValue, BOOL bAllowSingle, LPWSTR *output);
107 DWORD load_reg_dword(HKEY hKey, LPCWSTR szValue, DWORD *output);
109 static inline LPCWSTR get_display_name(struct service_entry *service)
111 return service->config.lpDisplayName ? service->config.lpDisplayName : service->name;
114 static inline BOOL is_marked_for_delete(struct service_entry *service)
116 return service->marked_for_delete;
119 static inline DWORD mark_for_delete(struct service_entry *service)
121 service->marked_for_delete = TRUE;
122 return ERROR_SUCCESS;
125 #endif /*WINE_PROGRAMS_UTILS_H_*/