win32-service 1.0.1 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile DELETED
@@ -1,5 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- # Specify your gem's dependencies in win32-service.gemspec
4
- gemspec
5
-
data/MANIFEST DELETED
@@ -1,24 +0,0 @@
1
- * MANIFEST
2
- * CHANGES
3
- * README
4
- * Rakefile
5
- * win32-service.gemspec
6
- * certs/djberg96_pub.pem
7
- * doc/daemon.txt
8
- * doc/service.txt
9
- * examples/demo_daemon.rb
10
- * examples/demo_daemon_ctl.rb
11
- * examples/demo_services.rb
12
- * lib/win32-daemon.rb
13
- * lib/win32-service.rb
14
- * lib/win32/service.rb
15
- * lib/win32/daemon.rb
16
- * lib/win32/windows/constants.rb
17
- * lib/win32/windows/functions.rb
18
- * lib/win32/windows/structs.rb
19
- * test/test_win32_daemon.rb
20
- * test/test_win32_service_configure.rb
21
- * test/test_win32_service_create.rb
22
- * test/test_win32_service_info.rb
23
- * test/test_win32_service_status.rb
24
- * test/test_win32_service.rb
data/README.md DELETED
@@ -1,75 +0,0 @@
1
- # win32-service
2
-
3
- [![Gem Version](https://badge.fury.io/rb/win32-service.svg)](https://badge.fury.io/rb/win32-service)
4
-
5
- The win32-service library allows you to control or create MS Windows services.
6
-
7
- ## Installation
8
-
9
- gem install win32-service
10
-
11
- ## Usage
12
-
13
- ```ruby
14
- require 'win32/service'
15
-
16
- # Iterate over the available services
17
- Win32::Service.services do |service|
18
- p service
19
- end
20
- ```
21
-
22
- ## More Documentation
23
-
24
- Please see the documentation in the 'doc' directory, or the gem documentation that was installed when you installed this library as a gem.
25
-
26
- ## Known Issues
27
-
28
- ### Problem:
29
-
30
- Service.delete causes "Unable to delete: The specified service has been marked for deletion."
31
-
32
- ### Troubleshooting:
33
-
34
- This can be caused by one of two things. Either you attempted to delete a running service without stopping it first, or you have the Services Administrative Tool (GUI) open. In the former case, the solution is to first stop the service if it's running. In the latter, close the Services GUI admin tool before deleting.
35
-
36
- ### Problem:
37
-
38
- Service.start causes, "The service did not respond to the start or control request in a timely fashion."
39
-
40
- ### Troubleshooting:
41
-
42
- The best way to debug your services is to wrap your entire Daemon subclass in a begin/end block and send error messages to a file. That should give a good clue as to the nature of the problem. The most probable culprits are:
43
-
44
- - You forgot to require 'win32/daemon' in your Daemon code.
45
-
46
- - You've tried to require a library that's not in your $LOAD_PATH. Make sure that your require statements are inside the begin/rescue block so that you can easily find those mistakes.
47
-
48
- - Your have a bad binary path name. Be sure to use an absolute path name for the binary path name, including the full path to the Ruby interpreter, e.g. 'c:\ruby\bin\ruby' instead of just 'ruby'.
49
-
50
- - You've got a syntax error in your code somewhere.
51
-
52
- ## See Also
53
-
54
- ruby-wmi
55
-
56
- ## Future Plans
57
-
58
- Add service_session_change hook
59
-
60
- ## Copyright
61
-
62
- (C) 2003-2018, Daniel J. Berger, All Rights Reserved
63
-
64
- ## License
65
-
66
- Artistic 2.0
67
-
68
- ## Warranty
69
-
70
- This package is provided "as is" and without any express or implied warranties, including, without limitation, the implied warranties of merchantability and fitness for a particular purpose.
71
-
72
- ## Authors
73
-
74
- - Daniel J. Berger
75
- - Park Heesob
data/Rakefile DELETED
@@ -1,83 +0,0 @@
1
- require "rubygems"
2
- require 'rake'
3
- require 'rake/clean'
4
- require 'rake/testtask'
5
- require 'rbconfig'
6
- include RbConfig
7
-
8
- CLEAN.include(
9
- '**/*.gem', # Gem files
10
- '**/*.rbc' # Rubinius
11
- )
12
-
13
- namespace :example do
14
- desc "Run the services example program."
15
- task :services do
16
- sh "ruby -Ilib examples/demo_services.rb"
17
- end
18
- end
19
-
20
- namespace 'test' do
21
- desc 'Run all tests for the win32-service library'
22
- Rake::TestTask.new('all') do |t|
23
- t.verbose = true
24
- t.warning = true
25
- end
26
-
27
- desc 'Run the tests for the Win32::Daemon class'
28
- Rake::TestTask.new('daemon') do |t|
29
- task :daemon
30
- t.verbose = true
31
- t.warning = true
32
- t.test_files = FileList['test/test_win32_daemon.rb']
33
- end
34
-
35
- namespace 'service' do
36
- desc 'Run the tests for the Win32::Service class'
37
- Rake::TestTask.new('all') do |t|
38
- t.verbose = true
39
- t.warning = true
40
- t.test_files = FileList['test/test_win32_service*.rb']
41
- end
42
-
43
- Rake::TestTask.new('configure') do |t|
44
- t.verbose = true
45
- t.warning = true
46
- t.test_files = FileList['test/test_win32_service_configure.rb']
47
- end
48
-
49
- Rake::TestTask.new('control') do |t|
50
- t.verbose = true
51
- t.warning = true
52
- t.test_files = FileList['test/test_win32_service.rb']
53
- end
54
-
55
- Rake::TestTask.new('create') do |t|
56
- t.verbose = true
57
- t.warning = true
58
- t.test_files = FileList['test/test_win32_service_create.rb']
59
- end
60
-
61
- Rake::TestTask.new('info') do |t|
62
- t.verbose = true
63
- t.warning = true
64
- t.test_files = FileList['test/test_win32_service_info.rb']
65
- end
66
-
67
- Rake::TestTask.new('status') do |t|
68
- t.verbose = true
69
- t.warning = true
70
- t.test_files = FileList['test/test_win32_service_status.rb']
71
- end
72
- end
73
-
74
- task :all do
75
- Rake.application[:clean].execute
76
- end
77
-
78
- task :daemon do
79
- Rake.application[:clean].execute
80
- end
81
- end
82
-
83
- task :default => 'test:all'
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 1.0.1
@@ -1,48 +0,0 @@
1
- version: '{build}'
2
- branches:
3
- only:
4
- - ffi
5
- skip_tags: true
6
- clone_depth: 10
7
- environment:
8
- matrix:
9
- - ruby_version: 193
10
- ruby_dir: 1.9.1
11
- - ruby_version: 200
12
- ruby_dir: 2.0.0
13
- - ruby_version: 200-x64
14
- ruby_dir: 2.0.0
15
- - ruby_version: 21
16
- ruby_dir: 2.1.0
17
- - ruby_version: 21-x64
18
- ruby_dir: 2.1.0
19
- - ruby_version: 22
20
- ruby_dir: 2.2.0
21
- - ruby_version: 22-x64
22
- ruby_dir: 2.2.0
23
- install:
24
- - ps: >-
25
- $env:path = "C:\Ruby" + $env:ruby_version + "\bin;" + $env:path
26
-
27
- $tpath = "C:\Ruby" + $env:ruby_version + "\lib\ruby\" + $env:ruby_dir + "\test"
28
-
29
- if ((test-path $tpath) -eq $True){ rm -recurse -force $tpath }
30
-
31
- gem update --system > $null
32
-
33
- if ((gem query -i ffi) -eq $False){ gem install ffi --no-document }
34
-
35
- if ((gem query -i win32-security) -eq $False){ gem install win32-security --no-document }
36
-
37
- if ((gem query -i test-unit -v ">= 3.0") -eq $False){ gem install test-unit --no-document }
38
- cache:
39
- - C:\Ruby193\lib\ruby\gems\1.9.1
40
- - C:\Ruby200\lib\ruby\gems\2.0.0
41
- - C:\Ruby200-x64\lib\ruby\gems\2.0.0
42
- - C:\Ruby21\lib\ruby\gems\2.1.0
43
- - C:\Ruby21-x64\lib\ruby\gems\2.1.0
44
- - C:\Ruby22\lib\ruby\gems\2.2.0
45
- - C:\Ruby22-x64\lib\ruby\gems\2.2.0
46
- build: off
47
- test_script:
48
- - cmd: rake
@@ -1,157 +0,0 @@
1
- = Description
2
- The Daemon class is a wrapper class that allows you to run your code as a
3
- Windows service.
4
-
5
- = Synopsis
6
- class Daemon
7
- def service_main
8
- while running?
9
- sleep 3
10
- File.open("c:\\test.log", "a"){ |f| f.puts "service is running" }
11
- end
12
- end
13
- end
14
-
15
- Daemon.mainloop
16
-
17
- = Singleton Methods
18
- Daemon.mainloop
19
- This is the method that actually puts your code into a loop and allows it
20
- to run as a service. The code that is actually run while in the mainloop
21
- is what you defined in the Daemon#service_main method.
22
-
23
- = Instance Methods
24
- Daemon#running?
25
- Returns whether or not the daemon is running. This is just a shortcut
26
- for checking if the state is RUNNING, PAUSED or IDLE.
27
-
28
- This is typically used within your service_main method. See the
29
- demo_daemon.rb file in the 'examples' directory for an example of how it's
30
- used in practice.
31
-
32
- Daemon#service_init
33
- Any code defined defined within this method occurs before service_main is
34
- reached. Any initialization code that takes more than two seconds to
35
- execute should be placed here. Otherwise, your service may timeout when
36
- you try to start it.
37
-
38
- Daemon#service_main(*args)
39
- You are expected to define your own service_main() method. The code
40
- defined in this method is the code that will run while running as a
41
- service.
42
-
43
- Any +args+ passed to Service.start are passed to this method.
44
-
45
- Daemon#state
46
- Returns the current state of the Daemon. For a list of valid states, see
47
- the Constants section below.
48
-
49
- = Signal Event Hooks
50
- These methods are called if defined within your Daemon class, and the
51
- appropriate signal is received by your service.
52
-
53
- Daemon#service_stop
54
- Called if the service receives a SERVICE_CONTROL_STOP signal. This is
55
- what the Service.stop() method sends.
56
-
57
- Daemon#service_pause
58
- Called if the service receives a SERVICE_CONTROL_PAUSE signal. This is
59
- what the Service.pause() method sends.
60
-
61
- Daemon#service_resume
62
- Called if the service receives a SERVICE_CONTROL_CONTINUE signal. This
63
- is what the Service.resume() method sends.
64
-
65
- Daemon#service_interrogate
66
- Called if the service receives a SERVICE_CONTROL_INTERROGATE signal. This
67
- notifies a service that it should report its current status information to
68
- the service control manager.
69
-
70
- Daemon#service_shutdown
71
- Called if the service receives a SERVICE_CONTROL_SHUTDOWN signal.
72
-
73
- Daemon#service_netbindadd
74
- Called if the service receives a SERVICE_CONTROL_NETBINDADD signal. This
75
- notifies a network service that there is a new component for binding.
76
-
77
- Daemon#service_netbinddisable
78
- Called if the service receives a SERVICE_CONTROL_NETBINDDISABLE signal.
79
- This notifies a network service that one of its bindings has been
80
- disabled.
81
-
82
- Daemon#service_netbindenable
83
- Called if the service receives a SERVICE_CONTROL_NETBINDENABLE signal.
84
- This Notifies a network service that a disabled binding has been enabled.
85
-
86
- Daemon#service_netbindremove
87
- Called if the service receives a SERVICE_CONTROL_NETBINDREMOVE signal.
88
- This notifies a network service that that a component for binding has
89
- been removed.
90
-
91
- Daemon#service_paramchange
92
- Called if the service receives a SERVICE_CONTROL_PARAMCHANGE signal.
93
- This notifies a service that its startup parameters have changed.
94
-
95
- = Constants
96
-
97
- === Service state constants
98
- Daemon::CONTINUE_PENDING
99
- The service continue is pending.
100
-
101
- Daemon::PAUSE_PENDING
102
- The service pause is pending.
103
-
104
- Daemon::PAUSED
105
- The service is paused (but not STOPPED).
106
-
107
- Daemon::RUNNING
108
- The service is running.
109
-
110
- Daemon::START_PENDING
111
- The service is starting (but is not yet in a RUNNING state).
112
-
113
- Daemon::STOP_PENDING
114
- The service is stopping (but is not yet in a STOPPED state).
115
-
116
- Daemon::STOPPED
117
- The service is not running.
118
-
119
- Daemon::IDLE
120
- The service is running, in an idle state. This is a custom state that
121
- we added that gets around a thread blocking issue.
122
-
123
- = Notes
124
- You must create a service before you can actually run it. Look in the
125
- examples directory for the files 'demo_daemon.rb' and 'demodaemon_ctl.rb'.
126
- They're small and straightforward examples of how to control, install and
127
- setup your own Daemon.
128
-
129
- = Known Bugs
130
- None known. Please report any bugs you find on the issue tracker at
131
- https//github.com/djberg96/win32-service
132
-
133
- = Future Plans
134
- None at this time.
135
-
136
- Suggestions welcome. Please post them on the github project page at
137
- https//github.com/djberg96/win32-service
138
-
139
- = Acknowledgements
140
- Many thanks go to Patrick Hurley for providing the fix for the thread
141
- blocking issue for the original C code. Thanks also go to Kevin Burge for
142
- his patch that solved service responsiveness issues.
143
-
144
- = Copyright
145
- (C) 2003-2016 Daniel J. Berger, All Rights Reserved
146
-
147
- = License
148
- Artistic 2.0
149
-
150
- = Warranty
151
- This package is provided "as is" and without any express or
152
- implied warranties, including, without limitation, the implied
153
- warranties of merchantability and fitness for a particular purpose.
154
-
155
- = Author(s)
156
- * Daniel J. Berger
157
- * Park Heesob
@@ -1,363 +0,0 @@
1
- = Description
2
- An interface for MS Windows Services.
3
-
4
- = Prerequisites
5
- ffi 1.0 or later
6
-
7
- This library 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
- puts s.inspect
52
- }
53
-
54
- = Class Methods
55
- Service.new(options={})
56
- Creates a new service. The +options+ parameter is a hash that can
57
- contain any of the following parameters, and their default values:
58
-
59
- KEY DEFAULT
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 http://www.msdn.com.
330
-
331
- Some API ideas taken (or not) from both Python's win32serviceutil.py and
332
- Perl's Win32::Service module.
333
-
334
- I don't truly understand how to allow a tag_id in the create_service()
335
- method, so for now it's set to NULL automatically. Suggestions welcome.
336
-
337
- = Known Bugs
338
- There may be a failure in the test suite if the W32Time dependency is
339
- not started.
340
-
341
- If you find any bugs please log them on the github project page at
342
- https://github.com/djberg96/win32-service
343
-
344
- = Acknowledgements
345
- Many thanks go to Patrick Hurley for providing the fix for the thread
346
- blocking issue in the original C code. Thanks also go to Kevin Burge for
347
- his patch that solved service responsiveness issues.
348
-
349
- = Future Plans
350
- Add Tag_ID support.
351
- Add ability to create or modify service failure actions.
352
-
353
- = Copyright
354
- (C) 2003-2016, Daniel J. Berger, All Rights Reserved
355
-
356
- = Warranty
357
- This package is provided "as is" and without any express or
358
- implied warranties, including, without limitation, the implied
359
- warranties of merchantability and fitness for a particular purpose.
360
-
361
- == Authors
362
- * Daniel J. Berger
363
- * Park Heesob