win32-service 0.7.0-x86-mswin32-60 → 0.7.1-x86-mswin32-60

Sign up to get free protection for your applications and to get access to all the features.
data/doc/service.txt CHANGED
@@ -1,368 +1,365 @@
1
- = Description
2
- An interface for MS Windows Services.
3
-
4
- = Prerequisites
5
- Ruby 1.8.0 or later.
6
-
7
- This package is only supported for the Windows NT family of operating
8
- systems, e.g. 2000, XP, 2003, etc. It is NOT supported (and won't
9
- work) for any version of DOS or Windows 95/98/ME. It is also not
10
- supported on NT 4, as that platform is defunct.
11
-
12
- It should work on Windows XP Home, but is not officially supported for
13
- that platform.
14
-
15
- = Synopsis
16
- require "win32/service"
17
- include Win32
18
-
19
- # Create a new service
20
- Service.create(
21
- :service_name => 'some_service',
22
- :service_type => Service::WIN32_OWN_PROCESS,
23
- :description => 'A custom service I wrote just for fun'
24
- :start_type => Service::AUTO_START,
25
- :error_control => Service::ERROR_NORMAL,
26
- :binary_path_name => 'C:\path\to\some_service.exe',
27
- :load_order_group => 'Network',
28
- :dependencies => ['W32Time','Schedule']
29
- :service_start_name => 'SomeDomain\\User',
30
- :password => 'XXXXXXX',
31
- :display_name => 'This is some service',
32
- )
33
-
34
- # Configure a service that already exists
35
- Service.configure(:display_name => "My Bar Service")
36
-
37
- Service.start("foo")
38
- Service.pause("foo")
39
- Service.resume("foo")
40
- Service.stop("foo")
41
-
42
- Service.delete("foo")
43
-
44
- Service.get_display_name("Schedule") # "Task Scheduler"
45
- Service.get_service_name("ClipBook") # "ClipSrv"
46
-
47
- Service.status('W32Time') => <struct Struct::ServiceStatus ...>
48
-
49
- # Enumerate over all services, inspecting each struct
50
- Service.services{ |s|
51
- p s
52
- puts
53
- }
54
-
55
- = Class Methods
56
- Service.new(options={})
57
- Creates a new service. The +options+ parameter is a hash that can
58
- contain any of the following parameters, and their default values:
59
-
60
- * service_name => nil (mandatory)
61
- * host => nil
62
- * display_name => service_name
63
- * desired_access => Service::ALL_ACCESS
64
- * service_type => Service::WIN32_OWN_PROCESS | Service::INTERACTIVE_PROCESS
65
- * start_type => Service::DEMAND_START
66
- * error_control => Service::ERROR_NORMAL
67
- * binary_path_name => nil
68
- * load_order_group => nil
69
- * dependencies => nil
70
- * service_start_name => nil
71
- * password => nil
72
- * description => nil
73
-
74
- Service.configure(options={})
75
- Configures an existing service. The +options+ parameter is a hash that can
76
- contain any of the following parameters:
77
-
78
- * service_name (mandatory)
79
- * host
80
- * service_type
81
- * start_type
82
- * error_control
83
- * binary_path_name
84
- * load_order_group
85
- * dependencies
86
- * service_start_name
87
- * password (used with service_start_name)
88
- * display_name
89
- * description
90
-
91
- Service.config_info(service, host=nil)
92
- Returns a ServiceConfigInfo struct containing the configuration information
93
- about +service+ on +host+, or the local host if no host is specified.
94
-
95
- Service.create
96
- Alias for Service.new
97
-
98
- Service.delete(service, host=nil)
99
- Deletes the specified +service+ on +host+. If no host is given,
100
- then it deletes it on the local machine.
101
-
102
- Service.exists?(service)
103
- Returns true if the specified service exists, false otherwise.
104
-
105
- Service.pause(service, host=nil)
106
- Pauses the specified +service+ on +host+, or the local machine if
107
- no host is provided.
108
-
109
- Service.resume(service, host=nil)
110
- Resumes the specified +service+ on +host+, or the local machine if
111
- no host is specified.
112
-
113
- Service.services(host=nil, group=nil){ |struct| ... }
114
- Enumerates over a list of service types on host, or the local
115
- machine if no host is specified, yielding a Win32Service struct for each
116
- service.
117
-
118
- If a 'group' is specified, then only those services that belong to
119
- that group are enumerated. If an empty string is provided, then only
120
- services that do not belong to any group are enumerated. If this parameter
121
- is nil, group membership is ignored and all services are enumerated.
122
-
123
- The 'group' option is only available on Windows 2000 or later, and only
124
- if compiled with VC++ 7.0 or later, or the .NET SDK. The Win32Service
125
- struct contains the following members:
126
-
127
- * service_name
128
- * display_name
129
- * service_type
130
- * current_state
131
- * controls_accepted
132
- * win32_exit_code
133
- * service_specific_exit_code
134
- * check_point
135
- * wait_hint
136
- * binary_path_name
137
- * start_type
138
- * error_control
139
- * load_order_group
140
- * tag_id
141
- * start_name
142
- * dependencies
143
- * description
144
- * interactive?
145
- * pid (Win2k or later)
146
- * service_flags (Win2k or later)
147
-
148
- Note that the 'pid' and 'service_flags' members are only available on
149
- Windows 2000 or later, and only if built with VC++ 7.0 or later (or the
150
- .NET SDK).
151
-
152
- Service.start(service, host=nil, *args)
153
- Starts the specified +service+ on +host+, or the local machine if no
154
- host is specified. Any +args+ passed here are passed as start parameters
155
- to the service.
156
-
157
- Service.status(service)
158
- Returns a Win32ServiceStatus struct for the specified service (or
159
- raises a Win32::ServiceError if not found). The Win32ServiceStatus
160
- struct contains the following members.
161
-
162
- * service_type
163
- * current_state
164
- * controls_accepted
165
- * win32_exit_code
166
- * service_specific_exit_code
167
- * check_point
168
- * wait_hint
169
- * interactive?
170
-
171
- Service.stop(service, host=nil)
172
- Stops the specified +service+ on +host+, or the local machine if no
173
- host is specified.
174
-
175
- = Create and configure options
176
- binary_path_name
177
- The binary to be used for the service. The path must be the fully
178
- qualified path name. A path that contains a space must be quoted so that
179
- it is correctly interpreted. The path may also include arguments to the
180
- service entry point (typically the 'main' function).
181
-
182
- dependencies
183
- Any dependencies the service has in order to run. This can be a string
184
- or an array of strings.
185
-
186
- description
187
- A text string describing the service.
188
-
189
- display_name
190
- The display name to be used by user interface programs to identify the
191
- service. The string has a maximum length of 256 characters. Case
192
- sensitivity is preserved.
193
-
194
- The default is to set the display name to the same string as the
195
- service name.
196
-
197
- error_control
198
- The error control for the service. The default is Service::ERROR_NORMAL.
199
-
200
- See the "Error Control Contants" section for available options and their
201
- meanings.
202
-
203
- load_order_group
204
- The load order group, a string that names the load ordering group of
205
- which this service is a member. The default is nil.
206
-
207
- password
208
- Sets the passsword to the account name specified in the Service#start_name
209
- method. By default, this value is set to nil, which is appropriate if
210
- the account has no password or if the service runs in the
211
- 'LocalService', 'NetworkService', or 'LocalSystem' account.
212
-
213
- Note that passwords are ignored for driver services.
214
-
215
- service_name
216
- The service name for the service. This value must be set in order
217
- to create a service. The string has a maximum length of 256 characters.
218
-
219
- service_type
220
- The service type for the service. The default is
221
- Service::WIN32_OWN_PROCESS | Service::INTERACTIVE_PROCESS.
222
-
223
- See the "Service Type Contants" section for available options and their
224
- meanings.
225
-
226
- start_name
227
- Sets the name of the account under which the service should run.
228
- By default the 'LocalSystem' account is used.
229
-
230
- start_type
231
- The start type for the service. The default is Service::DEMAND_START.
232
-
233
- See the "Start Type Contants" section for available options and their
234
- meanings.
235
-
236
- = Constants
237
-
238
- === Standard Constants
239
- VERSION
240
- The current version number of this package, returned as a string.
241
-
242
- === Desired Access Constants
243
- Service::MANAGER_ALL_ACCESS
244
- Includes STANDARD_RIGHTS_REQUIRED, in addition to all access rights
245
- in the table.
246
-
247
- Service::MANAGER_CREATE_SERVICE
248
- Required to call the CreateService function to create a service object
249
- and add it to the database.
250
-
251
- Service::MANAGER_CONNECT
252
- Required to connect to the service control manager.
253
-
254
- Service::MANAGER_ENUMERATE_SERVICE
255
- Required to call the EnumServicesStatus function to list the services
256
- that are in the database.
257
-
258
- Service::MANAGER_LOCK
259
- Required to call the LockServiceDatabase function to acquire a lock on the
260
- database.
261
-
262
- Service::MANAGER_BOOT_CONFIG
263
- Required to call the NotifyBootConfigStatus() (internal) function. Not
264
- defined with all compilers.
265
-
266
- Service::MANAGER_QUERY_LOCK_STATUS
267
- Required to call the QueryServiceLockStatus() (internal) function to
268
- retrieve the lock status information for the database.
269
-
270
- === Service Type Constants
271
- Service::FILE_SYSTEM_DRIVER
272
- File system driver service.
273
-
274
- Service::KERNEL_DRIVER
275
- Driver service.
276
-
277
- Service::WIN32_OWN_PROCESS
278
- Service that runs in its own process.
279
-
280
- Service::WIN32_SHARE_PROCESS
281
- Service that shares a process with one or more other services.
282
-
283
- Service::INTERACTIVE_PROCESS
284
- The service can interact with the desktop. This can only be used if
285
- either SERVICE_WIN32_OWN_PROCESS or SERVICE_WIN32_SHARE_PROCESS is
286
- specified as well, and the service is running in the context of the
287
- LocalSystem account (which is the default for this module, btw).
288
-
289
- === Start Type Constants
290
- Service::AUTO_START
291
- A service started automatically by the service control manager during
292
- system startup.
293
-
294
- Service::BOOT_START
295
- A device driver started by the system loader. This value is valid only
296
- for driver services.
297
-
298
- Service::DEMAND_START
299
- A service started by the service control manager when a process calls
300
- the StartService() function.
301
-
302
- Service::DISABLED
303
- A service that cannot be started. Attempts to start the service result
304
- in an error.
305
-
306
- Service::SYSTEM_START
307
- A device driver started by the IoInitSystem() function. This value is
308
- valid only for driver services.
309
-
310
- === Error Control Constants
311
- Service::ERROR_IGNORE
312
- The startup program logs the error but continues the startup operation.
313
-
314
- Service::ERROR_NORMAL
315
- The startup program logs the error and puts up a message box pop-up but
316
- continues the startup operation.
317
-
318
- Service::ERROR_SEVERE
319
- The startup program logs the error. If the last-known-good configuration
320
- is being started, the startup operation continues. Otherwise, the system
321
- is restarted with the last-known-good configuration.
322
-
323
- Service::ERROR_CRITICAL
324
- The startup program logs the error, if possible. If the last-known-good
325
- configuration is being started the startup operation fails. Otherwise,
326
- the system is restarted with the last-known-good configuration.
327
-
328
- = Notes
329
- See the MSDN API with regards to CreateService(), etc at
330
- http://www.msdn.com
331
-
332
- Some API ideas taken (or not) from both Python's win32serviceutil.py and
333
- Perl's Win32::Service module.
334
-
335
- I don't truly understand how to allow a tag_id in the create_service()
336
- method, so for now it's set to NULL automatically. Suggestions welcome.
337
-
338
- = Known Bugs
339
- There may be a failure in the test suite if the W32Time dependency is
340
- not started.
341
-
342
- If you find any bugs please log them on the bug tracker. You can find it
343
- on the project page at http://www.rubyforge.org/projects/win32utils.
344
-
345
- = Acknowledgements
346
- Many thanks go to Patrick Hurley for providing the fix for the thread
347
- blocking issue. Thanks also go to Kevin Burge for his patch that solved
348
- service responsiveness issues.
349
-
350
- = Future Plans
351
- Add Tag_ID support.
352
- Add ability to create or modify service failure actions.
353
- Use RegisterServiceCtrlHandlerEx().
354
-
355
- = Copyright
356
- (C) 2003-2009, Daniel J. Berger, All Rights Reserved
357
-
358
- = License
359
- Artistic 2.0
360
-
361
- = Warranty
362
- This package is provided "as is" and without any express or
363
- implied warranties, including, without limitation, the implied
364
- warranties of merchantability and fitness for a particular purpose.
365
-
366
- == Author(s)
367
- * Daniel J. Berger
368
- * Park Heesob
1
+ = Description
2
+ An interface for MS Windows Services.
3
+
4
+ = Prerequisites
5
+ Ruby 1.8.0 or later.
6
+
7
+ This package is only supported for the Windows NT family of operating
8
+ systems, e.g. 2000, XP, 2003, etc. It is NOT supported (and won't
9
+ work) for any version of DOS or Windows 95/98/ME. It is also not
10
+ supported on NT 4, as that platform is defunct.
11
+
12
+ It should work on Windows XP Home, but is not officially supported for
13
+ that platform.
14
+
15
+ = Synopsis
16
+ require "win32/service"
17
+ include Win32
18
+
19
+ # Create a new service
20
+ Service.create(
21
+ :service_name => 'some_service',
22
+ :service_type => Service::WIN32_OWN_PROCESS,
23
+ :description => 'A custom service I wrote just for fun'
24
+ :start_type => Service::AUTO_START,
25
+ :error_control => Service::ERROR_NORMAL,
26
+ :binary_path_name => 'C:\path\to\some_service.exe',
27
+ :load_order_group => 'Network',
28
+ :dependencies => ['W32Time','Schedule']
29
+ :service_start_name => 'SomeDomain\\User',
30
+ :password => 'XXXXXXX',
31
+ :display_name => 'This is some service',
32
+ )
33
+
34
+ # Configure a service that already exists
35
+ Service.configure(:display_name => "My Bar Service")
36
+
37
+ Service.start("foo")
38
+ Service.pause("foo")
39
+ Service.resume("foo")
40
+ Service.stop("foo")
41
+
42
+ Service.delete("foo")
43
+
44
+ Service.get_display_name("Schedule") # "Task Scheduler"
45
+ Service.get_service_name("ClipBook") # "ClipSrv"
46
+
47
+ Service.status('W32Time') => <struct Struct::ServiceStatus ...>
48
+
49
+ # Enumerate over all services, inspecting each struct
50
+ Service.services{ |s|
51
+ p s
52
+ puts
53
+ }
54
+
55
+ = Class Methods
56
+ Service.new(options={})
57
+ Creates a new service. The +options+ parameter is a hash that can
58
+ contain any of the following parameters, and their default values:
59
+
60
+ * service_name => nil (mandatory)
61
+ * host => nil
62
+ * display_name => service_name
63
+ * desired_access => Service::ALL_ACCESS
64
+ * service_type => Service::WIN32_OWN_PROCESS | Service::INTERACTIVE_PROCESS
65
+ * start_type => Service::DEMAND_START
66
+ * error_control => Service::ERROR_NORMAL
67
+ * binary_path_name => nil
68
+ * load_order_group => nil
69
+ * dependencies => nil
70
+ * service_start_name => nil
71
+ * password => nil
72
+ * description => nil
73
+
74
+ Service.configure(options={})
75
+ Configures an existing service. The +options+ parameter is a hash that can
76
+ contain any of the following parameters:
77
+
78
+ * service_name (mandatory)
79
+ * host
80
+ * service_type
81
+ * start_type
82
+ * error_control
83
+ * binary_path_name
84
+ * load_order_group
85
+ * dependencies
86
+ * service_start_name
87
+ * password (used with service_start_name)
88
+ * display_name
89
+ * description
90
+
91
+ Service.config_info(service, host=nil)
92
+ Returns a ServiceConfigInfo struct containing the configuration information
93
+ about +service+ on +host+, or the local host if no host is specified.
94
+
95
+ Service.create
96
+ Alias for Service.new
97
+
98
+ Service.delete(service, host=nil)
99
+ Deletes the specified +service+ on +host+. If no host is given,
100
+ then it deletes it on the local machine.
101
+
102
+ Service.exists?(service)
103
+ Returns true if the specified service exists, false otherwise.
104
+
105
+ Service.pause(service, host=nil)
106
+ Pauses the specified +service+ on +host+, or the local machine if
107
+ no host is provided.
108
+
109
+ Service.resume(service, host=nil)
110
+ Resumes the specified +service+ on +host+, or the local machine if
111
+ no host is specified.
112
+
113
+ Service.services(host=nil, group=nil){ |struct| ... }
114
+ Enumerates over a list of service types on host, or the local
115
+ machine if no host is specified, yielding a Win32Service struct for each
116
+ service.
117
+
118
+ If a 'group' is specified, then only those services that belong to
119
+ that group are enumerated. If an empty string is provided, then only
120
+ services that do not belong to any group are enumerated. If this parameter
121
+ is nil, group membership is ignored and all services are enumerated.
122
+
123
+ The 'group' option is only available on Windows 2000 or later, and only
124
+ if compiled with VC++ 7.0 or later, or the .NET SDK. The Win32Service
125
+ struct contains the following members:
126
+
127
+ * service_name
128
+ * display_name
129
+ * service_type
130
+ * current_state
131
+ * controls_accepted
132
+ * win32_exit_code
133
+ * service_specific_exit_code
134
+ * check_point
135
+ * wait_hint
136
+ * binary_path_name
137
+ * start_type
138
+ * error_control
139
+ * load_order_group
140
+ * tag_id
141
+ * start_name
142
+ * dependencies
143
+ * description
144
+ * interactive?
145
+ * pid (Win2k or later)
146
+ * service_flags (Win2k or later)
147
+
148
+ Note that the 'pid' and 'service_flags' members are only available on
149
+ Windows 2000 or later, and only if built with VC++ 7.0 or later (or the
150
+ .NET SDK).
151
+
152
+ Service.start(service, host=nil, *args)
153
+ Starts the specified +service+ on +host+, or the local machine if no
154
+ host is specified. Any +args+ passed here are passed as start parameters
155
+ to the service.
156
+
157
+ Service.status(service)
158
+ Returns a Win32ServiceStatus struct for the specified service (or
159
+ raises a Win32::ServiceError if not found). The Win32ServiceStatus
160
+ struct contains the following members.
161
+
162
+ * service_type
163
+ * current_state
164
+ * controls_accepted
165
+ * win32_exit_code
166
+ * service_specific_exit_code
167
+ * check_point
168
+ * wait_hint
169
+ * interactive?
170
+
171
+ Service.stop(service, host=nil)
172
+ Stops the specified +service+ on +host+, or the local machine if no
173
+ host is specified.
174
+
175
+ = Create and configure options
176
+ binary_path_name
177
+ The binary to be used for the service. The path must be the fully
178
+ qualified path name. A path that contains a space must be quoted so that
179
+ it is correctly interpreted. The path may also include arguments to the
180
+ service entry point (typically the 'main' function).
181
+
182
+ dependencies
183
+ Any dependencies the service has in order to run. This can be a string
184
+ or an array of strings.
185
+
186
+ description
187
+ A text string describing the service.
188
+
189
+ display_name
190
+ The display name to be used by user interface programs to identify the
191
+ service. The string has a maximum length of 256 characters. Case
192
+ sensitivity is preserved.
193
+
194
+ The default is to set the display name to the same string as the
195
+ service name.
196
+
197
+ error_control
198
+ The error control for the service. The default is Service::ERROR_NORMAL.
199
+
200
+ See the "Error Control Contants" section for available options and their
201
+ meanings.
202
+
203
+ load_order_group
204
+ The load order group, a string that names the load ordering group of
205
+ which this service is a member. The default is nil.
206
+
207
+ password
208
+ Sets the passsword to the account name specified in the Service#start_name
209
+ method. By default, this value is set to nil, which is appropriate if
210
+ the account has no password or if the service runs in the
211
+ 'LocalService', 'NetworkService', or 'LocalSystem' account.
212
+
213
+ Note that passwords are ignored for driver services.
214
+
215
+ service_name
216
+ The service name for the service. This value must be set in order
217
+ to create a service. The string has a maximum length of 256 characters.
218
+
219
+ service_type
220
+ The service type for the service. The default is
221
+ Service::WIN32_OWN_PROCESS | Service::INTERACTIVE_PROCESS.
222
+
223
+ See the "Service Type Contants" section for available options and their
224
+ meanings.
225
+
226
+ start_name
227
+ Sets the name of the account under which the service should run.
228
+ By default the 'LocalSystem' account is used.
229
+
230
+ start_type
231
+ The start type for the service. The default is Service::DEMAND_START.
232
+
233
+ See the "Start Type Contants" section for available options and their
234
+ meanings.
235
+
236
+ = Constants
237
+
238
+ === Standard Constants
239
+ VERSION
240
+ The current version number of this package, returned as a string.
241
+
242
+ === Desired Access Constants
243
+ Service::MANAGER_ALL_ACCESS
244
+ Includes STANDARD_RIGHTS_REQUIRED, in addition to all access rights
245
+ in the table.
246
+
247
+ Service::MANAGER_CREATE_SERVICE
248
+ Required to call the CreateService function to create a service object
249
+ and add it to the database.
250
+
251
+ Service::MANAGER_CONNECT
252
+ Required to connect to the service control manager.
253
+
254
+ Service::MANAGER_ENUMERATE_SERVICE
255
+ Required to call the EnumServicesStatus function to list the services
256
+ that are in the database.
257
+
258
+ Service::MANAGER_LOCK
259
+ Required to call the LockServiceDatabase function to acquire a lock on the
260
+ database.
261
+
262
+ Service::MANAGER_BOOT_CONFIG
263
+ Required to call the NotifyBootConfigStatus() (internal) function. Not
264
+ defined with all compilers.
265
+
266
+ Service::MANAGER_QUERY_LOCK_STATUS
267
+ Required to call the QueryServiceLockStatus() (internal) function to
268
+ retrieve the lock status information for the database.
269
+
270
+ === Service Type Constants
271
+ Service::FILE_SYSTEM_DRIVER
272
+ File system driver service.
273
+
274
+ Service::KERNEL_DRIVER
275
+ Driver service.
276
+
277
+ Service::WIN32_OWN_PROCESS
278
+ Service that runs in its own process.
279
+
280
+ Service::WIN32_SHARE_PROCESS
281
+ Service that shares a process with one or more other services.
282
+
283
+ Service::INTERACTIVE_PROCESS
284
+ The service can interact with the desktop. This can only be used if
285
+ either SERVICE_WIN32_OWN_PROCESS or SERVICE_WIN32_SHARE_PROCESS is
286
+ specified as well, and the service is running in the context of the
287
+ LocalSystem account (which is the default for this module, btw).
288
+
289
+ === Start Type Constants
290
+ Service::AUTO_START
291
+ A service started automatically by the service control manager during
292
+ system startup.
293
+
294
+ Service::BOOT_START
295
+ A device driver started by the system loader. This value is valid only
296
+ for driver services.
297
+
298
+ Service::DEMAND_START
299
+ A service started by the service control manager when a process calls
300
+ the StartService() function.
301
+
302
+ Service::DISABLED
303
+ A service that cannot be started. Attempts to start the service result
304
+ in an error.
305
+
306
+ Service::SYSTEM_START
307
+ A device driver started by the IoInitSystem() function. This value is
308
+ valid only for driver services.
309
+
310
+ === Error Control Constants
311
+ Service::ERROR_IGNORE
312
+ The startup program logs the error but continues the startup operation.
313
+
314
+ Service::ERROR_NORMAL
315
+ The startup program logs the error and puts up a message box pop-up but
316
+ continues the startup operation.
317
+
318
+ Service::ERROR_SEVERE
319
+ The startup program logs the error. If the last-known-good configuration
320
+ is being started, the startup operation continues. Otherwise, the system
321
+ is restarted with the last-known-good configuration.
322
+
323
+ Service::ERROR_CRITICAL
324
+ The startup program logs the error, if possible. If the last-known-good
325
+ configuration is being started the startup operation fails. Otherwise,
326
+ the system is restarted with the last-known-good configuration.
327
+
328
+ = Notes
329
+ See the MSDN API with regards to CreateService(), etc at
330
+ http://www.msdn.com
331
+
332
+ Some API ideas taken (or not) from both Python's win32serviceutil.py and
333
+ Perl's Win32::Service module.
334
+
335
+ I don't truly understand how to allow a tag_id in the create_service()
336
+ method, so for now it's set to NULL automatically. Suggestions welcome.
337
+
338
+ = Known Bugs
339
+ There may be a failure in the test suite if the W32Time dependency is
340
+ not started.
341
+
342
+ If you find any bugs please log them on the bug tracker. You can find it
343
+ on the project page at http://www.rubyforge.org/projects/win32utils.
344
+
345
+ = Acknowledgements
346
+ Many thanks go to Patrick Hurley for providing the fix for the thread
347
+ blocking issue. Thanks also go to Kevin Burge for his patch that solved
348
+ service responsiveness issues.
349
+
350
+ = Future Plans
351
+ Add Tag_ID support.
352
+ Add ability to create or modify service failure actions.
353
+ Use RegisterServiceCtrlHandlerEx().
354
+
355
+ = Copyright
356
+ (C) 2003-2010, Daniel J. Berger, All Rights Reserved
357
+
358
+ = Warranty
359
+ This package is provided "as is" and without any express or
360
+ implied warranties, including, without limitation, the implied
361
+ warranties of merchantability and fitness for a particular purpose.
362
+
363
+ == Author(s)
364
+ * Daniel J. Berger
365
+ * Park Heesob