|
@@ -80,6 +80,7 @@ type ChangeRequest struct {
|
|
|
EventType uint32
|
|
EventType uint32
|
|
|
EventData uintptr
|
|
EventData uintptr
|
|
|
CurrentStatus Status
|
|
CurrentStatus Status
|
|
|
|
|
+ Context uintptr
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Handler is the interface that must be implemented to build Windows service.
|
|
// Handler is the interface that must be implemented to build Windows service.
|
|
@@ -121,12 +122,11 @@ func init() {
|
|
|
cRegisterServiceCtrlHandlerExW = a.MustFindProc("RegisterServiceCtrlHandlerExW").Addr()
|
|
cRegisterServiceCtrlHandlerExW = a.MustFindProc("RegisterServiceCtrlHandlerExW").Addr()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// The HandlerEx prototype also has a context pointer but since we don't use
|
|
|
|
|
-// it at start-up time we don't have to pass it over either.
|
|
|
|
|
type ctlEvent struct {
|
|
type ctlEvent struct {
|
|
|
cmd Cmd
|
|
cmd Cmd
|
|
|
eventType uint32
|
|
eventType uint32
|
|
|
eventData uintptr
|
|
eventData uintptr
|
|
|
|
|
+ context uintptr
|
|
|
errno uint32
|
|
errno uint32
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -238,13 +238,12 @@ func (s *service) run() {
|
|
|
exitFromHandler <- exitCode{ss, errno}
|
|
exitFromHandler <- exitCode{ss, errno}
|
|
|
}()
|
|
}()
|
|
|
|
|
|
|
|
- status := Status{State: Stopped}
|
|
|
|
|
ec := exitCode{isSvcSpecific: true, errno: 0}
|
|
ec := exitCode{isSvcSpecific: true, errno: 0}
|
|
|
|
|
+ outcr := ChangeRequest{
|
|
|
|
|
+ CurrentStatus: Status{State: Stopped},
|
|
|
|
|
+ }
|
|
|
var outch chan ChangeRequest
|
|
var outch chan ChangeRequest
|
|
|
inch := s.c
|
|
inch := s.c
|
|
|
- var cmd Cmd
|
|
|
|
|
- var evtype uint32
|
|
|
|
|
- var evdata uintptr
|
|
|
|
|
loop:
|
|
loop:
|
|
|
for {
|
|
for {
|
|
|
select {
|
|
select {
|
|
@@ -255,10 +254,11 @@ loop:
|
|
|
}
|
|
}
|
|
|
inch = nil
|
|
inch = nil
|
|
|
outch = cmdsToHandler
|
|
outch = cmdsToHandler
|
|
|
- cmd = r.cmd
|
|
|
|
|
- evtype = r.eventType
|
|
|
|
|
- evdata = r.eventData
|
|
|
|
|
- case outch <- ChangeRequest{cmd, evtype, evdata, status}:
|
|
|
|
|
|
|
+ outcr.Cmd = r.cmd
|
|
|
|
|
+ outcr.EventType = r.eventType
|
|
|
|
|
+ outcr.EventData = r.eventData
|
|
|
|
|
+ outcr.Context = r.context
|
|
|
|
|
+ case outch <- outcr:
|
|
|
inch = s.c
|
|
inch = s.c
|
|
|
outch = nil
|
|
outch = nil
|
|
|
case c := <-changesFromHandler:
|
|
case c := <-changesFromHandler:
|
|
@@ -271,7 +271,7 @@ loop:
|
|
|
}
|
|
}
|
|
|
break loop
|
|
break loop
|
|
|
}
|
|
}
|
|
|
- status = c
|
|
|
|
|
|
|
+ outcr.CurrentStatus = c
|
|
|
case ec = <-exitFromHandler:
|
|
case ec = <-exitFromHandler:
|
|
|
break loop
|
|
break loop
|
|
|
}
|
|
}
|
|
@@ -316,7 +316,7 @@ func Run(name string, handler Handler) error {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
ctlHandler := func(ctl uint32, evtype uint32, evdata uintptr, context uintptr) uintptr {
|
|
ctlHandler := func(ctl uint32, evtype uint32, evdata uintptr, context uintptr) uintptr {
|
|
|
- e := ctlEvent{cmd: Cmd(ctl), eventType: evtype, eventData: evdata}
|
|
|
|
|
|
|
+ e := ctlEvent{cmd: Cmd(ctl), eventType: evtype, eventData: evdata, context: context}
|
|
|
// We assume that this callback function is running on
|
|
// We assume that this callback function is running on
|
|
|
// the same thread as Run. Nowhere in MS documentation
|
|
// the same thread as Run. Nowhere in MS documentation
|
|
|
// I could find statement to guarantee that. So putting
|
|
// I could find statement to guarantee that. So putting
|