agent/app/agent_windows.go
func (h *handler) handleWindowsRequests(ctx context.Context, requests <-chan svc.ChangeRequest, responses chan<- svc.Status) {
	// Immediately tell Windows that we are pending service start.
	responses <- svc.Status{State: svc.StartPending}
	seelog.Info("Starting Windows service")

	// TODO: Pre-start hooks go here (unclear if we need any yet)

	// https://msdn.microsoft.com/en-us/library/windows/desktop/ms682108(v=vs.85).aspx
	// Not sure if a better link exists to describe what these values mean
	accepts := svc.AcceptStop | svc.AcceptShutdown

	// Announce that we are running and we accept the above-mentioned commands
	responses <- svc.Status{State: svc.Running, Accepts: accepts}

	defer func() {
		// Announce that we are stopping
		seelog.Info("Stopping Windows service")
		responses <- svc.Status{State: svc.StopPending}
	}()

	for {
		select {
		case <-ctx.Done():
			return
		case r := <-requests:
			switch r.Cmd {
			case svc.Interrogate:
				// Our status doesn't change unless we are told to stop or shutdown
				responses <- r.CurrentStatus
			case svc.Stop, svc.Shutdown:
				return
			default:
				continue
			}
		}
	}
}
func (h *handler) handleWindowsRequests(ctx context.Context, requests <-chan svc.ChangeRequest, responses chan<- svc.Status) {
	// Immediately tell Windows that we are pending service start.
	responses <- svc.Status{State: svc.StartPending}
	seelog.Info("Starting Windows service")

	// TODO: Pre-start hooks go here (unclear if we need any yet)

	// https://msdn.microsoft.com/en-us/library/windows/desktop/ms682108(v=vs.85).aspx
	// Not sure if a better link exists to describe what these values mean
	accepts := svc.AcceptStop | svc.AcceptShutdown

	// Announce that we are running and we accept the above-mentioned commands
	responses <- svc.Status{State: svc.Running, Accepts: accepts}

	defer func() {
		// Announce that we are stopping
		seelog.Info("Stopping Windows service")
		responses <- svc.Status{State: svc.StopPending}
	}()

	for {
		select {
		case <-ctx.Done():
			return
		case r := <-requests:
			switch r.Cmd {
			case svc.Interrogate:
				// Our status doesn't change unless we are told to stop or shutdown
				responses <- r.CurrentStatus
			case svc.Stop, svc.Shutdown:
				return
			default:
				continue
			}
		}
	}
}
func ( h * handler ) handleWindowsRequests ( ctx context . Context , requests <- chan svc . ChangeRequest , responses chan <- svc . Status ) { // Immediately tell Windows that we are pending service start. responses <- svc . Status { State : svc . StartPending } seelog . Info ( " " ) // TODO: Pre-start hooks go here (unclear if we need any yet) // https://msdn.microsoft.com/en-us/library/windows/desktop/ms682108(v=vs.85).aspx // Not sure if a better link exists to describe what these values mean accepts := svc . AcceptStop | svc . AcceptShutdown // Announce that we are running and we accept the above-mentioned commands responses <- svc . Status { State : svc . Running , Accepts : accepts } defer func ( ) { // Announce that we are stopping seelog . Info ( " " ) responses <- svc . Status { State : svc . StopPending } } ( ) for { select { case <- ctx . Done ( ) : return case r := <- requests : switch r . Cmd { case svc . Interrogate : // Our status doesn't change unless we are told to stop or shutdown responses <- r . CurrentStatus case svc . Stop , svc . Shutdown : return default : continue } } } }
// handleWindowsRequests is a loop intended to run in a goroutine.  It handles bidirectional communication with the
// Windows service manager.  This function works by pretty much immediately moving to running and then waiting for a
// stop or shut down message from Windows or to be canceled (which could happen if the agent exits by itself and the
// calling function cancels the context).
handleWindowsRequests is a loop intended to run in a goroutine . It handles bidirectional communication with the Windows service manager . This function works by pretty much immediately moving to running and then waiting for a stop or shut down message from Windows or to be canceled ( which could happen if the agent exits by itself and the calling function cancels the context ) .