From 16072639606ea9e22c7d86e4cbd6af6314f4193c Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Thu, 25 Apr 2019 11:41:36 +0200 Subject: [PATCH] windows: allow querying service ProcessId The two functions have the same levels of compatibility, but this latter one gives us access to the process ID, which is important for things like WFP whitelisting. The change required is fairly trivial too. Change-Id: Ifb6b3ee3e897202b9cffa1388c53c25cbcfede61 Reviewed-on: https://go-review.googlesource.com/c/sys/+/173666 Run-TryBot: Jason Donenfeld TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- windows/svc/mgr/service.go | 11 +++++++---- windows/svc/service.go | 1 + 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/windows/svc/mgr/service.go b/windows/svc/mgr/service.go index fdc46af5..ded1c7a4 100644 --- a/windows/svc/mgr/service.go +++ b/windows/svc/mgr/service.go @@ -8,6 +8,7 @@ package mgr import ( "syscall" + "unsafe" "golang.org/x/sys/windows" "golang.org/x/sys/windows/svc" @@ -60,13 +61,15 @@ func (s *Service) Control(c svc.Cmd) (svc.Status, error) { // Query returns current status of service s. func (s *Service) Query() (svc.Status, error) { - var t windows.SERVICE_STATUS - err := windows.QueryServiceStatus(s.Handle, &t) + var t windows.SERVICE_STATUS_PROCESS + var needed uint32 + err := windows.QueryServiceStatusEx(s.Handle, windows.SC_STATUS_PROCESS_INFO, (*byte)(unsafe.Pointer(&t)), uint32(unsafe.Sizeof(t)), &needed) if err != nil { return svc.Status{}, err } return svc.Status{ - State: svc.State(t.CurrentState), - Accepts: svc.Accepted(t.ControlsAccepted), + State: svc.State(t.CurrentState), + Accepts: svc.Accepted(t.ControlsAccepted), + ProcessId: t.ProcessId, }, nil } diff --git a/windows/svc/service.go b/windows/svc/service.go index 94879d5e..51b94dff 100644 --- a/windows/svc/service.go +++ b/windows/svc/service.go @@ -72,6 +72,7 @@ type Status struct { Accepts Accepted CheckPoint uint32 // used to report progress during a lengthy operation WaitHint uint32 // estimated time required for a pending operation, in milliseconds + ProcessId uint32 } // ChangeRequest is sent to the service Handler to request service status change.