mirror of
https://github.com/golang/sys.git
synced 2026-02-08 11:46:04 +03:00
Second argument of servicemain is a pointer. See https://msdn.microsoft.com/en-us/library/windows/desktop/ms685138(v=vs.85).aspx So amd64 assembler code should use MOVQ to read that value. I probably copied 386 assembler code into amd64 and did not adjust the code. Broken code was used to pass parameters to the service, so add some tests to verify that parameter passing works. Fixes golang/go#24575 Change-Id: I89f8cad026ea13f8a5d78ff3e24b7236e27fc91f Reviewed-on: https://go-review.googlesource.com/110160 Run-TryBot: Alex Brainman <alex.brainman@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
85 lines
2.0 KiB
Go
85 lines
2.0 KiB
Go
// Copyright 2012 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// +build windows
|
|
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
"time"
|
|
|
|
"golang.org/x/sys/windows/svc"
|
|
"golang.org/x/sys/windows/svc/debug"
|
|
"golang.org/x/sys/windows/svc/eventlog"
|
|
)
|
|
|
|
var elog debug.Log
|
|
|
|
type myservice struct{}
|
|
|
|
func (m *myservice) Execute(args []string, r <-chan svc.ChangeRequest, changes chan<- svc.Status) (ssec bool, errno uint32) {
|
|
const cmdsAccepted = svc.AcceptStop | svc.AcceptShutdown | svc.AcceptPauseAndContinue
|
|
changes <- svc.Status{State: svc.StartPending}
|
|
fasttick := time.Tick(500 * time.Millisecond)
|
|
slowtick := time.Tick(2 * time.Second)
|
|
tick := fasttick
|
|
changes <- svc.Status{State: svc.Running, Accepts: cmdsAccepted}
|
|
elog.Info(1, strings.Join(args, "-"))
|
|
loop:
|
|
for {
|
|
select {
|
|
case <-tick:
|
|
beep()
|
|
elog.Info(1, "beep")
|
|
case c := <-r:
|
|
switch c.Cmd {
|
|
case svc.Interrogate:
|
|
changes <- c.CurrentStatus
|
|
// Testing deadlock from https://code.google.com/p/winsvc/issues/detail?id=4
|
|
time.Sleep(100 * time.Millisecond)
|
|
changes <- c.CurrentStatus
|
|
case svc.Stop, svc.Shutdown:
|
|
break loop
|
|
case svc.Pause:
|
|
changes <- svc.Status{State: svc.Paused, Accepts: cmdsAccepted}
|
|
tick = slowtick
|
|
case svc.Continue:
|
|
changes <- svc.Status{State: svc.Running, Accepts: cmdsAccepted}
|
|
tick = fasttick
|
|
default:
|
|
elog.Error(1, fmt.Sprintf("unexpected control request #%d", c))
|
|
}
|
|
}
|
|
}
|
|
changes <- svc.Status{State: svc.StopPending}
|
|
return
|
|
}
|
|
|
|
func runService(name string, isDebug bool) {
|
|
var err error
|
|
if isDebug {
|
|
elog = debug.New(name)
|
|
} else {
|
|
elog, err = eventlog.Open(name)
|
|
if err != nil {
|
|
return
|
|
}
|
|
}
|
|
defer elog.Close()
|
|
|
|
elog.Info(1, fmt.Sprintf("starting %s service", name))
|
|
run := svc.Run
|
|
if isDebug {
|
|
run = debug.Run
|
|
}
|
|
err = run(name, &myservice{})
|
|
if err != nil {
|
|
elog.Error(1, fmt.Sprintf("%s service failed: %v", name, err))
|
|
return
|
|
}
|
|
elog.Info(1, fmt.Sprintf("%s service stopped", name))
|
|
}
|