//go:build windows package procstat import ( "errors" "unsafe" "github.com/shirou/gopsutil/v3/process" "golang.org/x/sys/windows" "golang.org/x/sys/windows/svc/mgr" ) func processName(p *process.Process) (string, error) { return p.Name() } func getService(name string) (*mgr.Service, error) { m, err := mgr.Connect() if err != nil { return nil, err } defer m.Disconnect() srv, err := m.OpenService(name) if err != nil { return nil, err } return srv, nil } func queryPidWithWinServiceName(winServiceName string) (uint32, error) { srv, err := getService(winServiceName) if err != nil { return 0, err } var p *windows.SERVICE_STATUS_PROCESS var bytesNeeded uint32 var buf []byte err = windows.QueryServiceStatusEx(srv.Handle, windows.SC_STATUS_PROCESS_INFO, nil, 0, &bytesNeeded) if !errors.Is(err, windows.ERROR_INSUFFICIENT_BUFFER) { return 0, err } buf = make([]byte, bytesNeeded) p = (*windows.SERVICE_STATUS_PROCESS)(unsafe.Pointer(&buf[0])) //nolint:gosec // G103: Valid use of unsafe call to create SERVICE_STATUS_PROCESS if err := windows.QueryServiceStatusEx(srv.Handle, windows.SC_STATUS_PROCESS_INFO, &buf[0], uint32(len(buf)), &bytesNeeded); err != nil { return 0, err } return p.ProcessId, nil } func collectMemmap(Process, string, map[string]any) {}