package windows import ( "fmt" "path/filepath" "strings" ) // processSnapshot is deliberately small so the matching invariant can be // tested without a Windows host. NextImagePath returns more=false only after a // successful end-of-snapshot; any enumeration or image-path failure is an // error, rather than evidence that the target is not running. type processSnapshot interface { NextImagePath() (path string, more bool, err error) Close() error } type processSnapshotFactory func() (processSnapshot, error) func entrypointIsRunning(entrypoint string, newSnapshot processSnapshotFactory) (bool, error) { target, err := canonicalProcessPath(entrypoint) if err != nil { return false, fmt.Errorf("canonicalize target entrypoint: %w", err) } snapshot, err := newSnapshot() if err != nil { return false, fmt.Errorf("create process snapshot: %w", err) } defer snapshot.Close() for { path, more, err := snapshot.NextImagePath() if err != nil { return false, fmt.Errorf("enumerate process image path: %w", err) } if !more { return false, nil } candidate, err := canonicalProcessPath(path) if err != nil { return false, fmt.Errorf("canonicalize process image path: %w", err) } if strings.EqualFold(target, candidate) { return true, nil } } } func canonicalProcessPath(path string) (string, error) { abs, err := filepath.Abs(path) if err != nil { return "", err } return filepath.Clean(abs), nil }