diff --git a/example/main.go b/example/main.go index b188c98..aed3738 100644 --- a/example/main.go +++ b/example/main.go @@ -8,7 +8,8 @@ import ( func main() { var displayName = "Go Service Test2" - var ws = service.NewService("GoServiceTest2", displayName) + var desc = "This is a test Go service. It is designed to run well." + var ws = service.NewService("GoServiceTest2", displayName, desc) if len(os.Args) > 1 { var err error diff --git a/service_windows.go b/service_windows.go index f058403..64c26ef 100644 --- a/service_windows.go +++ b/service_windows.go @@ -6,15 +6,16 @@ import ( "unsafe" ) -func NewService(name, displayName string) Service { +func NewService(name, displayName, description string) Service { return &windowsService{ name: name, displayName: displayName, + description: description, } } type windowsService struct { - name, displayName string + name, displayName, description string } func (ws *windowsService) Install() error { @@ -34,6 +35,12 @@ func (ws *windowsService) Install() error { return err } defer closeServiceHandle(serviceHandle) + + err = changeServiceDescription(serviceHandle, ws.description) + if err != nil { + return err + } + return nil } @@ -74,7 +81,9 @@ func (ws *windowsService) LogInfo(text string) error { var ( advapi = syscall.MustLoadDLL("advapi32.dll") + kernel = syscall.MustLoadDLL("kernel32.dll") + //advapi32.dll createServiceProc = advapi.MustFindProc("CreateServiceW") openServiceProc = advapi.MustFindProc("OpenServiceW") deleteServiceProc = advapi.MustFindProc("DeleteService") @@ -85,10 +94,10 @@ var ( deregisterEventSourceProc = advapi.MustFindProc("DeregisterEventSource") reportEventProc = advapi.MustFindProc("ReportEventW") - openSCManagerProc = advapi.MustFindProc("OpenSCManagerW") - - kernel = syscall.MustLoadDLL("kernel32.dll") + openSCManagerProc = advapi.MustFindProc("OpenSCManagerW") + changeServiceConfig2Proc = advapi.MustFindProc("ChangeServiceConfig2W") + // kernel32.dll getModuleFileNameProc = kernel.MustFindProc("GetModuleFileNameW") ) @@ -195,7 +204,7 @@ func reportEvent(eventSource syscall.Handle, title, text string, level eventLeve uintptr(eventSource), uintptr(level), //type uintptr(0), //category - uintptr(3), //eventID + uintptr(1), //eventID uintptr(0), uintptr(2), uintptr(0), @@ -264,3 +273,24 @@ func openSCManager() (syscall.Handle, error) { } return syscall.Handle(r0), nil } + +const ( + _SERVICE_CONFIG_DESCRIPTION = 1 +) + +func changeServiceDescription(h syscall.Handle, desc string) error { + msg := &struct { + desc uintptr + }{ + desc: uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(desc))), + } + r0, _, e1 := changeServiceConfig2Proc.Call( + uintptr(h), + uintptr(_SERVICE_CONFIG_DESCRIPTION), + uintptr(unsafe.Pointer(msg)), + ) + if r0 == 0 { + return e1 + } + return nil +}