51 lines
915 B
Go
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
|
|
}
|