2026-09-01 23:12:22 +03:00
|
|
|
//go:build windows
|
|
|
|
|
|
2026-08-18 17:06:20 +03:00
|
|
|
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 {
|
2026-08-28 12:52:26 +03:00
|
|
|
command, err := installedCommandLine()
|
2026-08-18 17:06:20 +03:00
|
|
|
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()
|
2026-09-01 20:04:20 +03:00
|
|
|
if err := k.SetStringValue(config.StartupValueName, command); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
return enableWatchdog()
|
2026-08-18 17:06:20 +03:00
|
|
|
}
|
|
|
|
|
|
2026-08-28 12:52:26 +03:00
|
|
|
// SyncInstalledPath rewrites an existing Run entry to the AppData install path.
|
|
|
|
|
func SyncInstalledPath() error {
|
|
|
|
|
if !Enabled() {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
return Enable()
|
|
|
|
|
}
|
|
|
|
|
|
2026-08-18 17:06:20 +03:00
|
|
|
func Disable() error {
|
2026-09-02 00:00:24 +03:00
|
|
|
var regErr error
|
2026-08-18 17:06:20 +03:00
|
|
|
k, err := registry.OpenKey(registry.CURRENT_USER, config.StartupRunKey, registry.SET_VALUE)
|
|
|
|
|
if err != nil {
|
2026-09-02 00:00:24 +03:00
|
|
|
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
|
2026-08-18 17:06:20 +03:00
|
|
|
}
|
|
|
|
|
}
|
2026-09-02 00:00:24 +03:00
|
|
|
taskErr := disableWatchdog()
|
|
|
|
|
if regErr != nil {
|
|
|
|
|
return regErr
|
2026-08-18 17:06:20 +03:00
|
|
|
}
|
2026-09-02 00:00:24 +03:00
|
|
|
return taskErr
|
2026-08-18 17:06:20 +03:00
|
|
|
}
|
|
|
|
|
|
2026-08-28 12:52:26 +03:00
|
|
|
func installedCommandLine() (string, error) {
|
|
|
|
|
exe, err := config.InstalledExe()
|
2026-08-18 17:06:20 +03:00
|
|
|
if err != nil {
|
|
|
|
|
return "", err
|
|
|
|
|
}
|
2026-09-01 23:12:22 +03:00
|
|
|
// Registry Run requires quotes around a path that may contain spaces.
|
|
|
|
|
return `"` + exe + `"`, nil
|
2026-08-18 17:06:20 +03:00
|
|
|
}
|