Files

51 lines
915 B
Go

package instance
import (
"errors"
"golang.org/x/sys/windows"
"tea.chunkbyte.com/kato/go-worm/lib/config"
)
type Guard struct {
handle windows.Handle
}
func Acquire() (*Guard, error) {
name, err := windows.UTF16PtrFromString(config.MutexName)
if err != nil {
return nil, err
}
h, err := windows.CreateMutex(nil, false, name)
if h == 0 {
return nil, err
}
if errors.Is(err, windows.ERROR_ALREADY_EXISTS) {
windows.CloseHandle(h)
return nil, errors.New("agent already running")
}
return &Guard{handle: h}, nil
}
func AlreadyRunning() bool {
name, err := windows.UTF16PtrFromString(config.MutexName)
if err != nil {
return false
}
h, err := windows.OpenMutex(windows.SYNCHRONIZE, false, name)
if err != nil {
return false
}
windows.CloseHandle(h)
return true
}
func (g *Guard) Close() {
if g == nil || g.handle == 0 {
return
}
windows.CloseHandle(g.handle)
g.handle = 0
}