//go:build windows package version import ( "fmt" "os/exec" "golang.org/x/sys/windows" ) func processAlive(pid int) bool { if pid <= 0 { return false } handle, err := windows.OpenProcess(windows.SYNCHRONIZE, false, uint32(pid)) if err != nil { return false } defer windows.CloseHandle(handle) status, err := windows.WaitForSingleObject(handle, 0) return err == nil && status == uint32(windows.WAIT_TIMEOUT) } func processIdentityToken(pid int) (string, error) { if pid <= 0 { return "", fmt.Errorf("invalid process ID %d", pid) } handle, err := windows.OpenProcess(windows.PROCESS_QUERY_LIMITED_INFORMATION|windows.SYNCHRONIZE, false, uint32(pid)) if err != nil { return "", err } defer windows.CloseHandle(handle) var creation, exit, kernel, user windows.Filetime if err := windows.GetProcessTimes(handle, &creation, &exit, &kernel, &user); err != nil { return "", err } return fmt.Sprintf("%08x%08x", creation.HighDateTime, creation.LowDateTime), nil } func processMatches(pid int, expectedToken string) bool { if !processAlive(pid) { return false } if expectedToken == "" { return true } actualToken, err := processIdentityToken(pid) return err == nil && actualToken == expectedToken } // Windows CommandContext terminates the directly executed identity probe on // cancellation. The manager identity command does not launch a helper tree. func configureIdentityCommand(*exec.Cmd) {}