/* * 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 processes; struct list services; CRITICAL_SECTION cs; }; struct process_entry { struct list entry; struct scmdatabase *db; LONG ref_count; DWORD process_id; HANDLE process; HANDLE control_mutex; HANDLE control_pipe; HANDLE overlapped_event; HANDLE status_changed_event; }; 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 status; QUERY_SERVICE_CONFIGW config; DWORD preshutdown_timeout; LPWSTR description; LPWSTR dependOnServices; LPWSTR dependOnGroups; struct process_entry *process; BOOL force_shutdown; BOOL marked_for_delete; BOOL is_wow64; }; 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); void scmdatabase_lock(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(struct service_entry *service); void service_unlock(struct service_entry *service); DWORD service_start(struct service_entry *service, DWORD service_argc, LPCWSTR *service_argv); /* Process functions */ struct process_entry *grab_process(struct process_entry *process); void release_process(struct process_entry *process); BOOL process_send_command(struct process_entry *process, const void *data, DWORD size, DWORD *result); void process_terminate(struct process_entry *process); extern HANDLE g_hStartedEvent; extern DWORD service_pipe_timeout; extern DWORD service_kill_timeout; DWORD RPC_Init(void); DWORD events_loop(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->marked_for_delete; } static inline DWORD mark_for_delete(struct service_entry *service) { service->marked_for_delete = TRUE; return ERROR_SUCCESS; } #endif /*WINE_PROGRAMS_UTILS_H_*/