nssm.git
10 years agoDisplay canonical service name.
Iain Patterson [Thu, 26 Dec 2013 19:28:56 +0000 (19:28 +0000)]
Display canonical service name.

When editing or deleting a service we get the service information using the
name provided by the user.  The name is case-insensitive but case-preserving.
Use GetServiceKeyName() to retrieve the canonical name and display that
in any messages containing the service name.

10 years agoAllow editing services.
Iain Patterson [Mon, 23 Dec 2013 18:25:28 +0000 (18:25 +0000)]
Allow editing services.

"nssm edit <service>" brings up a GUI to edit an existing service.
Services not managed by NSSM can also be edited but only system
properties such as the display name will appear in the GUI.

10 years agoSafer set_environment().
Iain Patterson [Tue, 24 Dec 2013 11:56:27 +0000 (11:56 +0000)]
Safer set_environment().

Ensure that the return parameters are set safely when things go wrong.

10 years agoFixed popup_message().
Iain Patterson [Tue, 24 Dec 2013 11:54:31 +0000 (11:54 +0000)]
Fixed popup_message().

The second argument to _vsntprintf_s() is a count not a size.
The fallback errors weren't massively helpful.
The message buffer is too small for some larger messages.

10 years agoAdded delete_createfile_parameter().
Iain Patterson [Tue, 24 Dec 2013 00:33:48 +0000 (00:33 +0000)]
Added delete_createfile_parameter().

Function to remove a value related to I/O redirection from the registry.

10 years agoDisable interactive checkbox when a user is set.
Iain Patterson [Mon, 23 Dec 2013 18:21:12 +0000 (18:21 +0000)]
Disable interactive checkbox when a user is set.

A service can only interact with the desktop when running as LOCALSYSTEM
so disable the checkbox for that option when a user account is set.

10 years agoStore I/O redirection and environment options.
Iain Patterson [Mon, 23 Dec 2013 17:01:47 +0000 (17:01 +0000)]
Store I/O redirection and environment options.

Previously we queried I/O redirection and environment options from the
registry when starting the service.  We now add support for being able
to query those options and store them in the service data structure at
any time.  This will allow us to edit services later.

10 years agoChanged arguments to nssm_gui().
Iain Patterson [Mon, 23 Dec 2013 16:14:22 +0000 (16:14 +0000)]
Changed arguments to nssm_gui().

The second argument to nssm_gui() is now an nssm_service_t pointer
rather than a string.  This will allow the function to be extended later
to edit existing services.

10 years agoSet log on details in the GUI.
Iain Patterson [Sun, 22 Dec 2013 12:05:48 +0000 (12:05 +0000)]
Set log on details in the GUI.

The GUI can now set service logon and desktop interactive details.

10 years agoGUI tweaks.
Iain Patterson [Sun, 22 Dec 2013 10:36:09 +0000 (10:36 +0000)]
GUI tweaks.

The check_method_timeout() static function was used for processing
timeouts in milliseconds, hence the name.  We are now reusing it to
check arbitrary numbers, so the name is no longer appropriate.

Instead of having checkboxes to enable or disable file rotation
parameters we enable or disable the editboxes where the values are
entered, based on the state of the rotation checkbox.

Similarly, the editboxes for shutdown method timeouts are enabled and
disabled based on the state of the method checkboxes.

The throttle timeout editbox was poorly aligned.

10 years agoTidy up build directories.
Iain Patterson [Sat, 21 Dec 2013 17:12:10 +0000 (17:12 +0000)]
Tidy up build directories.

Build object files in tmp/<configuration>/<platform> and link
executables in out/<configuration>/<platform>.

Now switching architectures doesn't require a full rebuild and the
working directoryis a bit cleaner.

10 years agoSet service details in the GUI.
Iain Patterson [Sat, 21 Dec 2013 16:10:33 +0000 (16:10 +0000)]
Set service details in the GUI.

The GUI can now set the service display name, description and startup
type.

10 years agoFixed Unicode display of GetProcAddress() errors.
Iain Patterson [Sat, 21 Dec 2013 16:05:18 +0000 (16:05 +0000)]
Fixed Unicode display of GetProcAddress() errors.

GetProcAddress() takes char *name as an argument but we were
trying to print TCHAR *name when logging that we couldn't find the
function pointer.

10 years agoCorrect arguments to GetDlgItemText().
Iain Patterson [Sat, 21 Dec 2013 15:33:23 +0000 (15:33 +0000)]
Correct arguments to GetDlgItemText().

The fourth argument to GetDlgItemText() is a character count not a
buffer size.

10 years agoFixed missing NULLs in log_event().
Iain Patterson [Sat, 21 Dec 2013 12:30:33 +0000 (12:30 +0000)]
Fixed missing NULLs in log_event().

The last argument to log_event must be NULL or messages with too many
parameters may not be logged.

10 years agoFormatting.
Iain Patterson [Sat, 21 Dec 2013 12:29:36 +0000 (12:29 +0000)]
Formatting.

10 years agoRotate output files.
Iain Patterson [Sat, 21 Dec 2013 12:00:53 +0000 (12:00 +0000)]
Rotate output files.

The files specified by AppStdout and AppStderr can now be rotated prior
to launching the application.  An existing file will be renamed with a
new suffix based on its last write time, to millisecond precision.

Rotation is controlled independently of the CreateFile() arguments used
when opening the files for writing.  It is possible to configure
rotation regardless of whether existing files would be appended or
replaced.

Four new REG_DWORD entries control how rotation happens.

If AppRotateFiles is 0 or missing, rotation is disabled.

If AppRotateSeconds is non-zero, a file will not be rotated if its last
write time is less than the given number of seconds in the past.

If AppRotateBytes is non-zero, a file will not be rotated if it is
smaller than the given number of bytes.

64-bit file sizes can be handled by specifying a high order part in
AppRotateBytesHigh.

Thanks Doug Watson.

10 years agoAllow relative paths for I/O redirection.
Iain Patterson [Fri, 20 Dec 2013 19:09:38 +0000 (19:09 +0000)]
Allow relative paths for I/O redirection.

Change to the startup directory before redirecting I/O streams so that
relative paths can be specified.  Then change back so we don't tie up
the directory.

10 years agoVisual Studio notes.
Iain Patterson [Sat, 30 Nov 2013 12:41:24 +0000 (12:41 +0000)]
Visual Studio notes.

Clarify that only Visual Studio 2008 and 2010 are known to work.
Visual Studio 2010 can be used to build executables which run on
Windows versions older than XP SP2 if the platform toolset is set
to v90.

11 years agoUse test_environment().
Iain Patterson [Tue, 26 Nov 2013 17:23:11 +0000 (17:23 +0000)]
Use test_environment().

Use the new test_environment() function when validating the environment
in the GUI and when launching the monitored application fails with
ERROR_INVALID_PARAMETER.  In the latter case we  set service-specific
error code 4 to help identify the reason for the failure.

11 years agoAdded test_environment().
Iain Patterson [Tue, 26 Nov 2013 17:21:27 +0000 (17:21 +0000)]
Added test_environment().

New helper function to verify the environment by relaunching NSSM itself
with the candidate environment set.  Unless something goes horribly
wrong somewhere, CreateProcess() will succeed iff the environment is
valid.

11 years agoDon't try to kill a process which didn't start.
Iain Patterson [Tue, 26 Nov 2013 12:43:06 +0000 (12:43 +0000)]
Don't try to kill a process which didn't start.

If CreateProcess() failed there's no sense trying to call
GetExitCodeProcess() or kill_process_tree().

11 years agoBe less paranoid.
Iain Patterson [Tue, 26 Nov 2013 11:13:42 +0000 (11:13 +0000)]
Be less paranoid.

We were checking that the path to our executable was within MAX_PATH but
it must be by definition and we have been safely skipping the check
elsewhere.

11 years agoBuild NSSM as a Unicode application.
Iain Patterson [Tue, 26 Nov 2013 17:28:02 +0000 (17:28 +0000)]
Build NSSM as a Unicode application.

11 years agoAllow compiling as a Unicode application.
Iain Patterson [Sat, 23 Nov 2013 15:21:54 +0000 (15:21 +0000)]
Allow compiling as a Unicode application.

Overhaul the entire codebase so that it compiles and runs as either a
Unicode or ANSI application.

11 years agoNSSM 2.21. v2.21
Iain Patterson [Sun, 24 Nov 2013 20:37:26 +0000 (20:37 +0000)]
NSSM 2.21.

11 years agoFixed parameters bug when installing from the GUI.
Iain Patterson [Sun, 24 Nov 2013 20:35:18 +0000 (20:35 +0000)]
Fixed parameters bug when installing from the GUI.

We were calling GetDlgItemText() on the wrong window.  As a result,
trying to install a sevice with parameters set would fail with the
error message "No valid options were specified!"

11 years agoNSSM 2.20. v2.20
Iain Patterson [Sat, 23 Nov 2013 15:44:31 +0000 (15:44 +0000)]
NSSM 2.20.

11 years agoFixed bug when installing from the command line.
Iain Patterson [Sat, 23 Nov 2013 15:43:59 +0000 (15:43 +0000)]
Fixed bug when installing from the command line.

We forgot to set default values when installing from the command line.
Installing from the GUI worked.

Thanks Paul Spause.

11 years agoNSSM 2.19. v2.19
Iain Patterson [Fri, 22 Nov 2013 16:23:53 +0000 (16:23 +0000)]
NSSM 2.19.

11 years agoAllow configuring output file truncation.
Iain Patterson [Fri, 22 Nov 2013 15:22:21 +0000 (15:22 +0000)]
Allow configuring output file truncation.

A new checkbox in the GUI allows specifying that stdout and stderr
should be truncated rather than appended.  The registry must still
be used to set different disposition for each or to control the
disposition of stdin.

11 years agoFixed environment when no newline was present.
Iain Patterson [Fri, 22 Nov 2013 14:11:11 +0000 (14:11 +0000)]
Fixed environment when no newline was present.

If the user entered environment variables without a trailing newline we
might have been left with only one trailing NULL and therefore the
environment parameter would have been invalid.  The path of least
resistance is to add two trailing NULLs unconditionally.

11 years agoFix initial focus.
Iain Patterson [Fri, 22 Nov 2013 13:40:17 +0000 (13:40 +0000)]
Fix initial focus.

Ensure that the service name field has the initial input focus.  It
already did for the install dialogue but didn't in the remove dialogue.

11 years agoEnsure CRLF is removed from GUI strings.
Iain Patterson [Fri, 22 Nov 2013 12:39:30 +0000 (12:39 +0000)]
Ensure CRLF is removed from GUI strings.

Windows 2000 will show funny characters where a string formatted with
message_string() contained a CRLF.  Explicitly add NULL to the end of
the strings so that they are shown correctly on Windows 2000.

11 years agoCompiler food.
Iain Patterson [Fri, 22 Nov 2013 12:25:33 +0000 (12:25 +0000)]
Compiler food.

Make strip_basename() non-static so it can be used elsewhere,
particularly in cases where int and size_t are different sizes, ie on
32-bit builds.

11 years agoSet environment from the GUI at install time.
Iain Patterson [Thu, 21 Nov 2013 18:39:07 +0000 (18:39 +0000)]
Set environment from the GUI at install time.

Added an extra Environment tab to set a newline-separated list of
environment variables to replace or be added to the service environment.

Input is validated by relaunching nssm itself with the proposed
environment set.

11 years agoAllow appending to the service environment.
Iain Patterson [Thu, 21 Nov 2013 11:55:31 +0000 (11:55 +0000)]
Allow appending to the service environment.

The new registry value AppEnvironmentExtra allows defining a list of
environment variables which will be appended to the environment, as
opposed to those defined by the srvany-compatible AppEnvironment, which
replaces the environment.

Though it would serve no useful purpose beyond verifying whether or not
I went to the effort of writing a code path for it, it is possible to
define bother lists and have them behave intuitively.

11 years agoGUI overhaul.
Iain Patterson [Wed, 20 Nov 2013 15:15:09 +0000 (15:15 +0000)]
GUI overhaul.

We now have a much less sucky GUI with tabs, combo boxes and all sorts
of whizzbang stuff.

The new GUI allows setting most of the advanced features we support
directly from the service installer without having to poke about in the
registry.

11 years agoPass parameters around in a data structure.
Iain Patterson [Wed, 20 Nov 2013 12:14:15 +0000 (12:14 +0000)]
Pass parameters around in a data structure.

Instead of static variables and functions taking a dozen arguments we
now use a single data structure, nssm_service_t, for the service.

The code is easier to read and understand, especially when adding more
variables through to functions.

11 years agoAdded set_expand_string() and set_number().
Iain Patterson [Wed, 20 Nov 2013 15:20:02 +0000 (15:20 +0000)]
Added set_expand_string() and set_number().

Helper functions to set REG_EXPAND_SZ and REG_DWORD values in the
registry.

11 years agoAdded strip_basename() function.
Iain Patterson [Wed, 20 Nov 2013 15:14:56 +0000 (15:14 +0000)]
Added strip_basename() function.

Helper function to determine the parent directory of a path.

11 years agoEnforce maximum report delay when starting service.
Iain Patterson [Sun, 17 Nov 2013 18:56:32 +0000 (18:56 +0000)]
Enforce maximum report delay when starting service.

We were not changing the service's state to running until the restart
throttling threshold had passed.  However best practice is to change the
status to running or stopped as quickly as possible.  Therefore we we
now report the status after no more than 20000 milliseconds regardless
of the throttle setting.

11 years agoNSSM 2.18. v2.18
Iain Patterson [Fri, 15 Nov 2013 15:59:59 +0000 (15:59 +0000)]
NSSM 2.18.

11 years agoAllow the Escape key to close the GUI.
Iain Patterson [Fri, 15 Nov 2013 15:50:17 +0000 (15:50 +0000)]
Allow the Escape key to close the GUI.

Turns out IDCANCEL is a magic resource name.  If a button has that name
it automatically responds to Escape.

11 years agoDon't automatically close the GUI on error.
Iain Patterson [Fri, 15 Nov 2013 15:48:56 +0000 (15:48 +0000)]
Don't automatically close the GUI on error.

If a parameter in the GUI was missing or invalid we were closing the
dialogue and forcing the user to relaunch the installer/remover.
Instead we now loop until the service has successfully been
installed/removed or the user cancelled the operation.

11 years agoSpawn a separate thread for stop_service().
Iain Patterson [Fri, 15 Nov 2013 15:44:46 +0000 (15:44 +0000)]
Spawn a separate thread for stop_service().

We must acknowledge a STOP or SHUTDOWN control promptly but the
termination of the application may take a significant amount of time if
one of the AppStopMethod* registry values is set.

We now spawn a separate thread to try to stop the process and to call
await_shutdown() while the main thread immediately acknowledges receipt
of the STOP request.  Once the worker thread has updated the service
status to say that application is really stopped we will be
automatically cleaned up by the system.

If for some reason we can't spawn a new thread we log an error and
ignore user-supplied timeouts so as to ensure we tidy up promptly.

11 years agoUse await_shutdown().
Iain Patterson [Fri, 15 Nov 2013 15:17:39 +0000 (15:17 +0000)]
Use await_shutdown().

Use the new await_shutdown() funtion to wait for the application to stop
rather than calling WaitForSingleObject() directly, so we can update the
service status periodically.

11 years agoAdded await_shutdown() function.
Iain Patterson [Fri, 15 Nov 2013 11:24:45 +0000 (11:24 +0000)]
Added await_shutdown() function.

The system expects service STOP requests to be honoured promptly.  If
service shutdown will take longer than 30 seconds we must update the
service status checkpoint variable before then.

We also need to ensure that the service status wait hint time is
strictly increasing every time we update the checkpoint, otherwise the
service will be considered to be hung after 60 seconds.

11 years agoPrevent buffer overrun in log_event().
Iain Patterson [Fri, 15 Nov 2013 11:21:58 +0000 (11:21 +0000)]
Prevent buffer overrun in log_event().

We were only expecting six message strings but we could possible receive
more.

11 years agoAllow overriding time to wait when trying to kill the application.
Iain Patterson [Wed, 13 Nov 2013 15:35:20 +0000 (15:35 +0000)]
Allow overriding time to wait when trying to kill the application.

Three new registry entries can be used to specify a wait time in
milliseconds after attempting a stop method.

  AppStopMethodConsole
  AppStopMethodWindow
  AppStopMethodThreads

The default for each remains the same, 1500ms.

Thanks Russ Holmann.

11 years agoUse override_milliseconds() to find throttle restart delay.
Iain Patterson [Wed, 13 Nov 2013 15:34:26 +0000 (15:34 +0000)]
Use override_milliseconds() to find throttle restart delay.

Use the new override_milliseconds() helper to find the override for the
amount of time to wait when throttling restarts.

11 years agoAdded override_milliseconds() helper.
Iain Patterson [Wed, 13 Nov 2013 15:32:40 +0000 (15:32 +0000)]
Added override_milliseconds() helper.

Helper function to retrieve a REG_DWORD value from the registry and
assign it to a variable, substituting a default value if the registry
entry is invalid or missing.  The function is specifically tailored
toward setting a value in milliseconds, hence the name.

11 years agoCalculate service stop wait hint correctly.
Iain Patterson [Wed, 13 Nov 2013 15:03:47 +0000 (15:03 +0000)]
Calculate service stop wait hint correctly.

The wait hint when changing the service status to stopped failed to take
into account the grace period after sending a Control-C event.  It also
failed to consider the case where one or more stop methods were
disabled.

11 years agoTypos and formatting etc.
Iain Patterson [Fri, 15 Nov 2013 15:43:46 +0000 (15:43 +0000)]
Typos and formatting etc.

11 years agoNSSM 2.17. v2.17
Iain Patterson [Tue, 12 Nov 2013 12:49:39 +0000 (12:49 +0000)]
NSSM 2.17.

11 years agoFix tabbing between GUI fields.
Iain Patterson [Tue, 12 Nov 2013 13:32:37 +0000 (13:32 +0000)]
Fix tabbing between GUI fields.

The tab key didn't switch between fields in the GUI because we didn't
insert a call to IsDialogMessage() in the message loop.

11 years agoTry to throttle using a critical section.
Iain Patterson [Tue, 12 Nov 2013 12:31:22 +0000 (12:31 +0000)]
Try to throttle using a critical section.

The first implementation of service restart throttling used a condition
variable in a critical section to sleep for the required amount of time.
The implementation was changed to use a waitable timer because Windows
2000 does not support SleepConditionVariableCS() or
WakeConditionVariable().

Since we are now using LoadLibrary() and GetProcAddress() to use newer
functions dynamically without having to build OS-specific binaries, we
can now use a critical section where it's supported and fall back to a
waitable timer when running on Windows 2000.

11 years agoAttachConsole() isn't available in Windows 2000.
Iain Patterson [Tue, 12 Nov 2013 10:50:21 +0000 (10:50 +0000)]
AttachConsole() isn't available in Windows 2000.

Instead of calling AttachConsole() directory use a function pointer in
the new global imports struct.  It's safe to skip any attempt to attach
to the console when the function isn't available.

11 years agoCompiler food.
Iain Patterson [Thu, 31 Oct 2013 14:33:10 +0000 (14:33 +0000)]
Compiler food.

Silence any compiler warnings relating to the use of _(v)snprintf() -
not _(v)snprintf_s() - and type conversions.

11 years agoUpdated nssm.dsp with missing dependencies.
Iain Patterson [Thu, 31 Oct 2013 14:28:43 +0000 (14:28 +0000)]
Updated nssm.dsp with missing dependencies.

Opening nssm.dsp in Visual Studio 2010 and accepting conversion to the
latest project format produced a project which would not build because
io.cpp, io.h, process.cpp, process.h and shlwapi.lib had not been added
to nssm.dsp.

They were present in nssm.vcproj from Visual Studio 2008 and it was
possible to load that project and convert to a format which worked.

Thanks Guy Brousseau.

11 years agoTry harder not to restart the application when stopping.
Iain Patterson [Thu, 31 Oct 2013 13:23:55 +0000 (13:23 +0000)]
Try harder not to restart the application when stopping.

Try even harder to avoid race conditions whereby one thread reacts to an
application exit and performs a restart even after another thread has
committed to handling a stop control.

Thanks Runner Mei.

11 years agoDelay report that the service is running.
Iain Patterson [Thu, 31 Oct 2013 13:22:02 +0000 (13:22 +0000)]
Delay report that the service is running.

Wait until the application has been running for long enough to be exempt
from restart throttling before reporting a status of SERVICE_RUNNING to
the operating system.

Thanks Tom Saul.

11 years agoSkip some or all methods of stopping the application.
Iain Patterson [Thu, 31 Oct 2013 13:14:31 +0000 (13:14 +0000)]
Skip some or all methods of stopping the application.

Use the AppStopMethodSkip bit field to specify any method(s) which
should not be employed when stopping the application.

11 years agoFixed Control-C race.
Iain Patterson [Mon, 28 Oct 2013 20:51:56 +0000 (20:51 +0000)]
Fixed Control-C race.

A typo in kill_console() could cause the application to be restarted
when it was supposed to stop.

When kill_console() successfully generated a Control-C event and the
application exited, the function was supposed to return 0, indicating to
its parent function kill_process() that the application had been killed.

Due to a mistake in the test of WaitForSingleObject()'s return code,
kill_console() would instead return non-zero when the application exited
in response to Control-C.  This would lead NSSM to continue with other
methods of trying to kill the application, leading to a race when
another thread detected that the application had exited without
recognising that it had done so in response to a stop control.

Thanks Barrett Lewis.

11 years agoRudimentary file versioning.
Iain Patterson [Tue, 22 Oct 2013 15:33:01 +0000 (16:33 +0100)]
Rudimentary file versioning.

Embed file version info in the resource file so that right-clicking the
executable shows the application version.

Unfortunately the version field must be formatted in a particular way so
we can't reuse the NSSM_VERSION #define from nssm.h but instead must
create a new #define and remember to update it when making a release.

Thanks fREW Schmidt.

11 years agoFixed missing io.cpp and io.h.
Iain Patterson [Tue, 30 Jul 2013 21:39:40 +0000 (22:39 +0100)]
Fixed missing io.cpp and io.h.

The files were inadvertently not pushed along with the stream
redirection code.

Thanks Runner Mei.

11 years agoNotes on escaping quotes.
Iain Patterson [Sat, 29 Jun 2013 07:28:42 +0000 (08:28 +0100)]
Notes on escaping quotes.

Brian Baxter points out that to install a service from the command
prompt with quotes in the options it is necessary to quote the quotes as
follows:

  nssm install service "c:\Program Files\app.exe" """C:\Path with spaces"""

11 years agoAllow specifying output streams.
Iain Patterson [Thu, 25 Oct 2012 04:53:00 +0000 (21:53 -0700)]
Allow specifying output streams.

Allow starting the monitor application with one or more of stdin,
stdout and stderr redirected to a file or anything which can be
opened with CreateFile().

New registry values corresponding to CreateFile() arguments for
stdin (and analogously for stdout and stderr):

AppStdin: Path to open.
AppStdinShareMode: Sharing mode.
AppStdinCreationDisposition: Creation disposition.
AppStdinFlagsAndAtrributes: Flags and attributes.

All are optional.  If no path is given for a particular stream it
will not be redirected.  If a path is given but any of the other
values are omitted they will receive sensible defaults.

11 years agoOverload expand_parameter() like get_number().
Iain Patterson [Thu, 25 Oct 2012 04:51:16 +0000 (21:51 -0700)]
Overload expand_parameter() like get_number().

Allow expand_parameter() to accept the optional must_exist flag.

11 years agoAdded get_number() helper.
Iain Patterson [Thu, 25 Oct 2012 04:47:12 +0000 (21:47 -0700)]
Added get_number() helper.

Retrieve a number (specifically an unsigned long) from the registry.
Allow the value to be optional by setting the must_exist parameter.
Overload the function definition such that must_exist can be omitted.

11 years agoTry to send Control-C event to application console.
Iain Patterson [Tue, 19 Feb 2013 17:38:03 +0000 (09:38 -0800)]
Try to send Control-C event to application console.

Try to attach to the application's console and send a Control-C event when
shutting down.  If a console exists, is successfully attached and successfully
sent the event, allow a grace period for the application to exit before sending
window messages or eventually calling TerminateProcess().

Now console applications which register shutdown handlers, such as java
launched from a batch file, have a chance to clean up and shut down gracefully.

Thanks Eric Cheldelin.

11 years agoFix build on Visual Studio Express.
Iain Patterson [Mon, 3 Dec 2012 18:15:36 +0000 (10:15 -0800)]
Fix build on Visual Studio Express.

Visual Studio Express doesn't ship with MFC so the afxres.h header isn't
available.  Since we don't actually use it, it's safe to replace that
header with a standard #include and #define.

Note that Visual Studio Express also ships without mc.exe so you will
also need to download the Windows SDK and set up your PATH in order to
build NSSM.

11 years agoIgnore INTERROGATE control.
Iain Patterson [Mon, 3 Dec 2012 18:13:02 +0000 (10:13 -0800)]
Ignore INTERROGATE control.

NSSM periodically logs that it received an unhandled INTERROGATE
control.  The control is sent by the system to request an update of the
service's status but NSSM always keeps the status up-to-date so no
action is needed on receipt of the control.

Rather than fill the logs with instances of such a message, NSSM will
now simply ignore the INTERROGATE control silently.

11 years agoNSSM 2.16. v2.16
Iain Patterson [Sun, 2 Dec 2012 05:09:42 +0000 (00:09 -0500)]
NSSM 2.16.

11 years agoFixed crash when stopping the service.
Iain Patterson [Sun, 2 Dec 2012 02:22:08 +0000 (18:22 -0800)]
Fixed crash when stopping the service.

NSSM tidies up by looking for processes whose parent PID matches the PID
of the monitored application.  Because process IDs are reused, however,
it's possible for NSSM to kill a process which was not a child of the
monitored application if that process had a now-exited parent process
whose PID was reused.  On UNIX the PPID would show as 1 for an orphaned
process but under Windows, at least when querying a process with the
Toolhelp32 toolkit, we see the original PPID of the process even if the
parent is no longer running.  Thus it is not sufficient to compare
parent PIDs when checking if a process was launched by our application.

In the worst case scenario NSSM could even terminate itself and trigger
a bluescreen.

When we find process with matching PPID we now also check that it was
created after our application was created and before our application
exited.

12 years agoNSSM 2.15. v2.15
Iain Patterson [Thu, 19 Jul 2012 20:17:30 +0000 (21:17 +0100)]
NSSM 2.15.

12 years agoItalian translations.
Riccardo Gusmeroli [Thu, 19 Jul 2012 16:16:43 +0000 (17:16 +0100)]
Italian translations.

Resources and messages for version 2.14.

Signed-off-by: Iain Patterson <me@iain.cx>
12 years agoFixed buffer length adding a service via the GUI.
Iain Patterson [Tue, 12 Jun 2012 15:18:31 +0000 (16:18 +0100)]
Fixed buffer length adding a service via the GUI.

The path to the monitored application and the arguments to the
application are both allowed to be sufficiently large to fit in the
maximum allowable registry value size.  The GUI itself, however, was
restricting input fields to 256 characters.

12 years agoWhitespace.
Iain Patterson [Thu, 24 May 2012 21:46:07 +0000 (22:46 +0100)]
Whitespace.

12 years agoNSSM 2.14. v2.14
Iain Patterson [Thu, 24 May 2012 21:16:47 +0000 (22:16 +0100)]
NSSM 2.14.

12 years agoMissing text typo.
Iain Patterson [Thu, 24 May 2012 21:31:22 +0000 (22:31 +0100)]
Missing text typo.

12 years agoFixed default language.
Iain Patterson [Thu, 24 May 2012 21:15:13 +0000 (22:15 +0100)]
Fixed default language.

The GUI was appearing in French if the display language was set to
anything other than English.  Ensure English is the default language by
defining the English resources as English US not English UK.

Spotted by Emilio Frini but apologies must go to François-Régis Tardy
who included the change along with his translations.  I didn't apply it
because I didn't realise that things wouldn't work without it.

12 years agoLog exit messages more intuitively.
Iain Patterson [Thu, 24 May 2012 12:34:53 +0000 (13:34 +0100)]
Log exit messages more intuitively.

In the case where the application crashed and NSSM then cleaned up its
child processes the events logged were confusing.  First we'd log that
we were going to kill the process tree with exit code X then we'd log
that the service had ended with exit code X.

Logging that the application exited before doing the process tree kill
makes it clearer that the cleanup is in response to the application
exit.

12 years agoNSSM 2.13. v2.13
Iain Patterson [Thu, 24 May 2012 11:44:56 +0000 (12:44 +0100)]
NSSM 2.13.

12 years agoWindows 2000 optimisation.
Iain Patterson [Sun, 20 May 2012 13:58:46 +0000 (14:58 +0100)]
Windows 2000 optimisation.

Windows 2000 takes a few seconds to time out when trying and failing to
connect to the service manager if NSSM was run with no arguments.

Check for stdin first.  It won't exist if we are running in a service
context so we can skip the connection attempt unless we're unsure.

12 years agoLocalised (almost) all messages.
Iain Patterson [Sun, 20 May 2012 11:11:51 +0000 (12:11 +0100)]
Localised (almost) all messages.

Use FormatMessage() to localise messages printed to the console or shown
in MessageBoxes.

The new messages are allocated IDs starting at 501 so as not to clash
with event log messages starting at 1001.

Once again French translations were provided by François-Régis Tardy.

12 years agoUpdated translation from François-Régis Tardy.
François-Régis Tardy [Sat, 19 May 2012 12:54:17 +0000 (13:54 +0100)]
Updated translation from François-Régis Tardy.

Signed-off-by: Iain Patterson <me@iain.cx>
12 years agoHandle running without administrator privileges.
Iain Patterson [Tue, 15 May 2012 10:08:34 +0000 (11:08 +0100)]
Handle running without administrator privileges.

If the service is configured to run as an unprivileged user NSSM will
not be able to perform certain tasks which are not critical and will
therefore log some errors which can be ignored.

It will not be able to register itself as an event log source.
It will not be able to create a default AppExit key.
It will not be able to configure service failure handling.

Try to perform these tasks where first installing the service (which
we are guaranteed to do with administrator rights) as well as at
runtime, and don't log the errors if the runtime actions can't be
performed.

12 years agoFixed incomplete set_service_recovery().
Iain Patterson [Tue, 15 May 2012 10:05:57 +0000 (11:05 +0100)]
Fixed incomplete set_service_recovery().

A rogue return prevented set_service_recovery() from actually doing anything.
Also we weren't checking for failure in ChangeServiceConfig2().  We expect
ERROR_INVALID_LEVEL on pre-Vista Windows but other errors were not detected.

French translation by François-Régis Tardy.

12 years agoLog that we received control messages.
Iain Patterson [Mon, 14 May 2012 13:30:08 +0000 (14:30 +0100)]
Log that we received control messages.

Send a message to the event log when we receive a service control.

Use a fake message for starting a service so we can reuse code.
No SERVICE_CONTROL_START control is defined or used by the Windows
API.

French translations by François-Régis Tardy.

12 years agoFrench translations.
François-Régis Tardy [Sun, 13 May 2012 08:48:03 +0000 (09:48 +0100)]
French translations.

Resources and messages for version 2.12.

Signed-off-by: Iain Patterson <me@iain.cx>
12 years agoNSSM 2.12. v2.12
Iain Patterson [Mon, 7 May 2012 12:01:25 +0000 (13:01 +0100)]
NSSM 2.12.

12 years agoWindows 2000 compatibility notes.
Iain Patterson [Mon, 7 May 2012 12:00:57 +0000 (13:00 +0100)]
Windows 2000 compatibility notes.

12 years agoNSSM 2.11. v2.11
Iain Patterson [Wed, 4 Apr 2012 21:30:06 +0000 (22:30 +0100)]
NSSM 2.11.

12 years agoRemoved run hack.
Iain Patterson [Wed, 4 Apr 2012 21:00:08 +0000 (22:00 +0100)]
Removed run hack.

Previously we used to attempt to run as a service only when the "run"
argument was given, and printed a usage message if no arguments were
provided.

A more appropriate strategy is to check for StartServiceCtrlDispatcher()
returning ERROR_FAILED_SERVICE_CONTROLLER_CONNECT, as that means the
application is not running in a service context.

As a result we no longer write the undocumented "run" argument to the
registry when installing a service.  Technically this means that we
sacrifice backward compatibility with older versions.

12 years agoSupport srvany's AppEnvironment registry value.
Iain Patterson [Sun, 1 Apr 2012 10:35:54 +0000 (11:35 +0100)]
Support srvany's AppEnvironment registry value.

Allow setting one or more environment variables for the application by
creating the AppEnvironment value of type REG_MULTI_SZ.  Each string
should be of the form KEY=VALUE.  VALUE may be omitted to set an empty
environment variable but the equals sign must be present.

This support is for compatibility with srvany.  In accordance with the
documented behaviour of srvany, only environment variables specified in
AppEnvironment will be passed to the service.  Any other variables, even
system variables such as %PATH%, will be ignored if they are not
explicitly listed.

Note that Windows supports adding environment variables to the service's
existing environment by creating the Environment value (also of type
REG_MULTI_SZ) under HKLM\SYSTEM\CurrentControlSet\Services\<service>
instead.  It is recommended that new services use this standard
functionality rather than AppEnvironment.

Thanks Rob Sharp.

12 years agoTypo.
Iain Patterson [Sun, 1 Apr 2012 09:48:52 +0000 (10:48 +0100)]
Typo.

13 years agoNSSM 2.10. v2.10
Iain Patterson [Tue, 11 Oct 2011 10:03:03 +0000 (11:03 +0100)]
NSSM 2.10.

13 years agoNew URL and icon.
Iain Patterson [Sun, 6 Mar 2011 10:23:03 +0000 (10:23 +0000)]
New URL and icon.

NSSM has a new website at http://nssm.cc/ and slightly-better red N
icon.  Contributions of a useful icon and logo would be gratefully
received.  Perhaps some kind of executable/service cogs mashup.

13 years agoCheck for administrator privileges.
Iain Patterson [Sat, 8 Oct 2011 10:02:51 +0000 (11:02 +0100)]
Check for administrator privileges.

If nssm is run without an administrator token it will fail to install or
remove services.  Check for the token and bomb out early rather than
waste the user's time filling in the form only to find the service can't
be managed.