File: services.h

package info (click to toggle)
wine 5.0.3-3
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 220,300 kB
  • sloc: ansic: 3,035,623; perl: 19,098; yacc: 16,358; makefile: 10,088; javascript: 9,150; objc: 6,590; lex: 5,734; python: 1,914; cpp: 1,042; sh: 759; java: 749; xml: 557; awk: 69; cs: 17
file content (137 lines) | stat: -rw-r--r-- 4,432 bytes parent folder | download
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_*/