| /* | 
 |  * 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" | 
 |  | 
 | struct scmdatabase | 
 | { | 
 |     HKEY root_key; | 
 |     LONG service_start_lock; | 
 |     struct list services; | 
 |     CRITICAL_SECTION cs; | 
 | }; | 
 |  | 
 | struct service_entry | 
 | { | 
 |     struct list entry; | 
 |     struct scmdatabase *db; | 
 |     LONG ref_count;                    /* number of references - if goes to zero and the service is deleted the structure will be freed */ | 
 |     LPWSTR name; | 
 |     SERVICE_STATUS_PROCESS status; | 
 |     QUERY_SERVICE_CONFIGW config; | 
 |     LPWSTR description; | 
 |     LPWSTR dependOnServices; | 
 |     LPWSTR dependOnGroups; | 
 |     HANDLE control_mutex; | 
 |     HANDLE control_pipe; | 
 |     HANDLE status_changed_event; | 
 | }; | 
 |  | 
 | 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_remove_service(struct scmdatabase *db, struct service_entry *entry); | 
 |  | 
 | DWORD scmdatabase_lock_startup(struct scmdatabase *db); | 
 | void scmdatabase_unlock_startup(struct scmdatabase *db); | 
 |  | 
 | void scmdatabase_lock_shared(struct scmdatabase *db); | 
 | void scmdatabase_lock_exclusive(struct scmdatabase *db); | 
 | void scmdatabase_unlock(struct scmdatabase *db); | 
 |  | 
 | /* Service functions */ | 
 |  | 
 | DWORD service_create(LPCWSTR name, struct service_entry **entry); | 
 | BOOL validate_service_name(LPCWSTR name); | 
 | BOOL validate_service_config(struct service_entry *entry); | 
 | DWORD save_service_config(struct service_entry *entry); | 
 | void free_service_entry(struct service_entry *entry); | 
 | void release_service(struct service_entry *service); | 
 | void service_lock_shared(struct service_entry *service); | 
 | void service_lock_exclusive(struct service_entry *service); | 
 | void service_unlock(struct service_entry *service); | 
 | DWORD service_start(struct service_entry *service, DWORD service_argc, LPCWSTR *service_argv); | 
 |  | 
 | extern HANDLE g_hStartedEvent; | 
 |  | 
 | DWORD RPC_Init(void); | 
 | DWORD RPC_MainLoop(void); | 
 |  | 
 | /* from utils.c */ | 
 | LPWSTR strdupW(LPCWSTR str); | 
 |  | 
 | BOOL check_multisz(LPCWSTR lpMultiSz, DWORD cbSize); | 
 |  | 
 | DWORD load_reg_string(HKEY hKey, LPCWSTR szValue, BOOL bExpand, LPWSTR *output); | 
 | DWORD load_reg_multisz(HKEY hKey, LPCWSTR szValue, BOOL bAllowSingle, LPWSTR *output); | 
 | DWORD load_reg_dword(HKEY hKey, LPCWSTR szValue, DWORD *output); | 
 |  | 
 | 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) | 
 | { | 
 |     return service->entry.next == NULL; | 
 | } | 
 |  | 
 | #endif /*WINE_PROGRAMS_UTILS_H_*/ |