Files
go-worm/lib/startup/startup.go
T
kato 536ea9a53e fix(core): take over agent, reuse callbacks
- Kill running agents before replace
- Retry copy with backoff while locked
- Reuse syscall callbacks at package scope
- Add callback regression test
2026-09-02 00:00:24 +03:00

76 lines
1.6 KiB
Go

//go:build windows
package startup
import (
"errors"
"golang.org/x/sys/windows/registry"
"tea.chunkbyte.com/kato/go-worm/lib/config"
)
func Enabled() bool {
k, err := registry.OpenKey(registry.CURRENT_USER, config.StartupRunKey, registry.QUERY_VALUE)
if err != nil {
return false
}
defer k.Close()
_, _, err = k.GetStringValue(config.StartupValueName)
return err == nil
}
func Enable() error {
command, err := installedCommandLine()
if err != nil {
return err
}
k, _, err := registry.CreateKey(registry.CURRENT_USER, config.StartupRunKey, registry.SET_VALUE)
if err != nil {
return err
}
defer k.Close()
if err := k.SetStringValue(config.StartupValueName, command); err != nil {
return err
}
return enableWatchdog()
}
// SyncInstalledPath rewrites an existing Run entry to the AppData install path.
func SyncInstalledPath() error {
if !Enabled() {
return nil
}
return Enable()
}
func Disable() error {
var regErr error
k, err := registry.OpenKey(registry.CURRENT_USER, config.StartupRunKey, registry.SET_VALUE)
if err != nil {
if !errors.Is(err, registry.ErrNotExist) {
regErr = err
}
} else {
err = k.DeleteValue(config.StartupValueName)
_ = k.Close()
if err != nil && !errors.Is(err, registry.ErrNotExist) {
regErr = err
}
}
taskErr := disableWatchdog()
if regErr != nil {
return regErr
}
return taskErr
}
func installedCommandLine() (string, error) {
exe, err := config.InstalledExe()
if err != nil {
return "", err
}
// Registry Run requires quotes around a path that may contain spaces.
return `"` + exe + `"`, nil
}