1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
/*
* 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;
LONG use_count;
DWORD process_id;
HANDLE process;
HANDLE control_mutex;
HANDLE control_pipe;
HANDLE overlapped_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;
HANDLE status_changed_event;
QUERY_SERVICE_CONFIGW config;
DWORD preshutdown_timeout;
LPWSTR description;
LPWSTR dependOnServices;
LPWSTR dependOnGroups;
struct process_entry *process;
BOOL shared_process;
BOOL force_shutdown;
BOOL marked_for_delete;
BOOL is_wow64;
BOOL delayed_autostart;
struct list handles;
};
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);
BOOL scmdatabase_lock_startup(struct scmdatabase *db, int timeout);
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);
struct service_entry *grab_service(struct service_entry *service);
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_control(struct process_entry *process, BOOL winedevice, const WCHAR *name,
DWORD control, const BYTE *data, DWORD data_size, DWORD *result);
void process_terminate(struct process_entry *process);
extern DWORD service_pipe_timeout;
extern DWORD service_kill_timeout;
extern HANDLE exit_event;
DWORD RPC_Init(void);
void RPC_Stop(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_*/
|