Merge pull request #3550 from kevpar/remove-eventlog
Remove Windows EventLog logging hook
This commit is contained in:
		| @@ -17,7 +17,6 @@ | ||||
| package command | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"fmt" | ||||
| 	"io/ioutil" | ||||
| 	"log" | ||||
| @@ -35,7 +34,6 @@ import ( | ||||
| 	"golang.org/x/sys/windows" | ||||
| 	"golang.org/x/sys/windows/svc" | ||||
| 	"golang.org/x/sys/windows/svc/debug" | ||||
| 	"golang.org/x/sys/windows/svc/eventlog" | ||||
| 	"golang.org/x/sys/windows/svc/mgr" | ||||
| ) | ||||
|  | ||||
| @@ -54,18 +52,6 @@ var ( | ||||
| 	service *handler | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	// These should match the values in event_messages.mc. | ||||
| 	eventInfo  = 1 | ||||
| 	eventWarn  = 1 | ||||
| 	eventError = 1 | ||||
| 	eventDebug = 2 | ||||
| 	eventPanic = 3 | ||||
| 	eventFatal = 4 | ||||
|  | ||||
| 	eventExtraOffset = 10 // Add this to any event to get a string that supports extended data | ||||
| ) | ||||
|  | ||||
| // serviceFlags returns an array of flags for configuring containerd to run | ||||
| // as a Windows service under control of SCM. | ||||
| func serviceFlags() []cli.Flag { | ||||
| @@ -124,93 +110,6 @@ type handler struct { | ||||
| 	done    chan struct{} // Indicates back to app main to quit | ||||
| } | ||||
|  | ||||
| type etwHook struct { | ||||
| 	log *eventlog.Log | ||||
| } | ||||
|  | ||||
| func (h *etwHook) Levels() []logrus.Level { | ||||
| 	return []logrus.Level{ | ||||
| 		logrus.PanicLevel, | ||||
| 		logrus.FatalLevel, | ||||
| 		logrus.ErrorLevel, | ||||
| 		logrus.WarnLevel, | ||||
| 		logrus.InfoLevel, | ||||
| 		logrus.DebugLevel, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (h *etwHook) Fire(e *logrus.Entry) error { | ||||
| 	var ( | ||||
| 		etype uint16 | ||||
| 		eid   uint32 | ||||
| 	) | ||||
|  | ||||
| 	switch e.Level { | ||||
| 	case logrus.PanicLevel: | ||||
| 		etype = windows.EVENTLOG_ERROR_TYPE | ||||
| 		eid = eventPanic | ||||
| 	case logrus.FatalLevel: | ||||
| 		etype = windows.EVENTLOG_ERROR_TYPE | ||||
| 		eid = eventFatal | ||||
| 	case logrus.ErrorLevel: | ||||
| 		etype = windows.EVENTLOG_ERROR_TYPE | ||||
| 		eid = eventError | ||||
| 	case logrus.WarnLevel: | ||||
| 		etype = windows.EVENTLOG_WARNING_TYPE | ||||
| 		eid = eventWarn | ||||
| 	case logrus.InfoLevel: | ||||
| 		etype = windows.EVENTLOG_INFORMATION_TYPE | ||||
| 		eid = eventInfo | ||||
| 	case logrus.DebugLevel: | ||||
| 		etype = windows.EVENTLOG_INFORMATION_TYPE | ||||
| 		eid = eventDebug | ||||
| 	default: | ||||
| 		return errors.Wrap(errdefs.ErrInvalidArgument, "unknown level") | ||||
| 	} | ||||
|  | ||||
| 	// If there is additional data, include it as a second string. | ||||
| 	exts := "" | ||||
| 	if len(e.Data) > 0 { | ||||
| 		fs := bytes.Buffer{} | ||||
| 		for k, v := range e.Data { | ||||
| 			fs.WriteString(k) | ||||
| 			fs.WriteByte('=') | ||||
| 			fmt.Fprint(&fs, v) | ||||
| 			fs.WriteByte(' ') | ||||
| 		} | ||||
|  | ||||
| 		exts = fs.String()[:fs.Len()-1] | ||||
| 		eid += eventExtraOffset | ||||
| 	} | ||||
|  | ||||
| 	if h.log == nil { | ||||
| 		fmt.Fprintf(os.Stderr, "%s [%s]\n", e.Message, exts) | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	var ( | ||||
| 		ss  [2]*uint16 | ||||
| 		err error | ||||
| 	) | ||||
|  | ||||
| 	ss[0], err = windows.UTF16PtrFromString(e.Message) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	count := uint16(1) | ||||
| 	if exts != "" { | ||||
| 		ss[1], err = windows.UTF16PtrFromString(exts) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|  | ||||
| 		count++ | ||||
| 	} | ||||
|  | ||||
| 	return windows.ReportEvent(h.log.Handle, etype, 0, eid, 0, count, 0, &ss[0], nil) | ||||
| } | ||||
|  | ||||
| func getServicePath() (string, error) { | ||||
| 	p, err := exec.LookPath(os.Args[0]) | ||||
| 	if err != nil { | ||||
| @@ -283,7 +182,7 @@ func registerService() error { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	return eventlog.Install(serviceNameFlag, p, false, eventlog.Info|eventlog.Warning|eventlog.Error) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func unregisterService() error { | ||||
| @@ -299,7 +198,6 @@ func unregisterService() error { | ||||
| 	} | ||||
| 	defer s.Close() | ||||
|  | ||||
| 	eventlog.Remove(serviceNameFlag) | ||||
| 	err = s.Delete() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| @@ -345,20 +243,6 @@ func registerUnregisterService(root string) (bool, error) { | ||||
| 			return true, err | ||||
| 		} | ||||
|  | ||||
| 		interactive, err := svc.IsAnInteractiveSession() | ||||
| 		if err != nil { | ||||
| 			return true, err | ||||
| 		} | ||||
|  | ||||
| 		var log *eventlog.Log | ||||
| 		if !interactive { | ||||
| 			log, err = eventlog.Open(serviceNameFlag) | ||||
| 			if err != nil { | ||||
| 				return true, err | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		logrus.AddHook(&etwHook{log}) | ||||
| 		logrus.SetOutput(ioutil.Discard) | ||||
| 	} | ||||
| 	return false, nil | ||||
|   | ||||
							
								
								
									
										198
									
								
								vendor/golang.org/x/sys/windows/registry/key.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										198
									
								
								vendor/golang.org/x/sys/windows/registry/key.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,198 +0,0 @@ | ||||
| // Copyright 2015 The Go Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| // +build windows | ||||
|  | ||||
| // Package registry provides access to the Windows registry. | ||||
| // | ||||
| // Here is a simple example, opening a registry key and reading a string value from it. | ||||
| // | ||||
| //	k, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Windows NT\CurrentVersion`, registry.QUERY_VALUE) | ||||
| //	if err != nil { | ||||
| //		log.Fatal(err) | ||||
| //	} | ||||
| //	defer k.Close() | ||||
| // | ||||
| //	s, _, err := k.GetStringValue("SystemRoot") | ||||
| //	if err != nil { | ||||
| //		log.Fatal(err) | ||||
| //	} | ||||
| //	fmt.Printf("Windows system root is %q\n", s) | ||||
| // | ||||
| package registry | ||||
|  | ||||
| import ( | ||||
| 	"io" | ||||
| 	"syscall" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	// Registry key security and access rights. | ||||
| 	// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms724878.aspx | ||||
| 	// for details. | ||||
| 	ALL_ACCESS         = 0xf003f | ||||
| 	CREATE_LINK        = 0x00020 | ||||
| 	CREATE_SUB_KEY     = 0x00004 | ||||
| 	ENUMERATE_SUB_KEYS = 0x00008 | ||||
| 	EXECUTE            = 0x20019 | ||||
| 	NOTIFY             = 0x00010 | ||||
| 	QUERY_VALUE        = 0x00001 | ||||
| 	READ               = 0x20019 | ||||
| 	SET_VALUE          = 0x00002 | ||||
| 	WOW64_32KEY        = 0x00200 | ||||
| 	WOW64_64KEY        = 0x00100 | ||||
| 	WRITE              = 0x20006 | ||||
| ) | ||||
|  | ||||
| // Key is a handle to an open Windows registry key. | ||||
| // Keys can be obtained by calling OpenKey; there are | ||||
| // also some predefined root keys such as CURRENT_USER. | ||||
| // Keys can be used directly in the Windows API. | ||||
| type Key syscall.Handle | ||||
|  | ||||
| const ( | ||||
| 	// Windows defines some predefined root keys that are always open. | ||||
| 	// An application can use these keys as entry points to the registry. | ||||
| 	// Normally these keys are used in OpenKey to open new keys, | ||||
| 	// but they can also be used anywhere a Key is required. | ||||
| 	CLASSES_ROOT     = Key(syscall.HKEY_CLASSES_ROOT) | ||||
| 	CURRENT_USER     = Key(syscall.HKEY_CURRENT_USER) | ||||
| 	LOCAL_MACHINE    = Key(syscall.HKEY_LOCAL_MACHINE) | ||||
| 	USERS            = Key(syscall.HKEY_USERS) | ||||
| 	CURRENT_CONFIG   = Key(syscall.HKEY_CURRENT_CONFIG) | ||||
| 	PERFORMANCE_DATA = Key(syscall.HKEY_PERFORMANCE_DATA) | ||||
| ) | ||||
|  | ||||
| // Close closes open key k. | ||||
| func (k Key) Close() error { | ||||
| 	return syscall.RegCloseKey(syscall.Handle(k)) | ||||
| } | ||||
|  | ||||
| // OpenKey opens a new key with path name relative to key k. | ||||
| // It accepts any open key, including CURRENT_USER and others, | ||||
| // and returns the new key and an error. | ||||
| // The access parameter specifies desired access rights to the | ||||
| // key to be opened. | ||||
| func OpenKey(k Key, path string, access uint32) (Key, error) { | ||||
| 	p, err := syscall.UTF16PtrFromString(path) | ||||
| 	if err != nil { | ||||
| 		return 0, err | ||||
| 	} | ||||
| 	var subkey syscall.Handle | ||||
| 	err = syscall.RegOpenKeyEx(syscall.Handle(k), p, 0, access, &subkey) | ||||
| 	if err != nil { | ||||
| 		return 0, err | ||||
| 	} | ||||
| 	return Key(subkey), nil | ||||
| } | ||||
|  | ||||
| // OpenRemoteKey opens a predefined registry key on another | ||||
| // computer pcname. The key to be opened is specified by k, but | ||||
| // can only be one of LOCAL_MACHINE, PERFORMANCE_DATA or USERS. | ||||
| // If pcname is "", OpenRemoteKey returns local computer key. | ||||
| func OpenRemoteKey(pcname string, k Key) (Key, error) { | ||||
| 	var err error | ||||
| 	var p *uint16 | ||||
| 	if pcname != "" { | ||||
| 		p, err = syscall.UTF16PtrFromString(`\\` + pcname) | ||||
| 		if err != nil { | ||||
| 			return 0, err | ||||
| 		} | ||||
| 	} | ||||
| 	var remoteKey syscall.Handle | ||||
| 	err = regConnectRegistry(p, syscall.Handle(k), &remoteKey) | ||||
| 	if err != nil { | ||||
| 		return 0, err | ||||
| 	} | ||||
| 	return Key(remoteKey), nil | ||||
| } | ||||
|  | ||||
| // ReadSubKeyNames returns the names of subkeys of key k. | ||||
| // The parameter n controls the number of returned names, | ||||
| // analogous to the way os.File.Readdirnames works. | ||||
| func (k Key) ReadSubKeyNames(n int) ([]string, error) { | ||||
| 	names := make([]string, 0) | ||||
| 	// Registry key size limit is 255 bytes and described there: | ||||
| 	// https://msdn.microsoft.com/library/windows/desktop/ms724872.aspx | ||||
| 	buf := make([]uint16, 256) //plus extra room for terminating zero byte | ||||
| loopItems: | ||||
| 	for i := uint32(0); ; i++ { | ||||
| 		if n > 0 { | ||||
| 			if len(names) == n { | ||||
| 				return names, nil | ||||
| 			} | ||||
| 		} | ||||
| 		l := uint32(len(buf)) | ||||
| 		for { | ||||
| 			err := syscall.RegEnumKeyEx(syscall.Handle(k), i, &buf[0], &l, nil, nil, nil, nil) | ||||
| 			if err == nil { | ||||
| 				break | ||||
| 			} | ||||
| 			if err == syscall.ERROR_MORE_DATA { | ||||
| 				// Double buffer size and try again. | ||||
| 				l = uint32(2 * len(buf)) | ||||
| 				buf = make([]uint16, l) | ||||
| 				continue | ||||
| 			} | ||||
| 			if err == _ERROR_NO_MORE_ITEMS { | ||||
| 				break loopItems | ||||
| 			} | ||||
| 			return names, err | ||||
| 		} | ||||
| 		names = append(names, syscall.UTF16ToString(buf[:l])) | ||||
| 	} | ||||
| 	if n > len(names) { | ||||
| 		return names, io.EOF | ||||
| 	} | ||||
| 	return names, nil | ||||
| } | ||||
|  | ||||
| // CreateKey creates a key named path under open key k. | ||||
| // CreateKey returns the new key and a boolean flag that reports | ||||
| // whether the key already existed. | ||||
| // The access parameter specifies the access rights for the key | ||||
| // to be created. | ||||
| func CreateKey(k Key, path string, access uint32) (newk Key, openedExisting bool, err error) { | ||||
| 	var h syscall.Handle | ||||
| 	var d uint32 | ||||
| 	err = regCreateKeyEx(syscall.Handle(k), syscall.StringToUTF16Ptr(path), | ||||
| 		0, nil, _REG_OPTION_NON_VOLATILE, access, nil, &h, &d) | ||||
| 	if err != nil { | ||||
| 		return 0, false, err | ||||
| 	} | ||||
| 	return Key(h), d == _REG_OPENED_EXISTING_KEY, nil | ||||
| } | ||||
|  | ||||
| // DeleteKey deletes the subkey path of key k and its values. | ||||
| func DeleteKey(k Key, path string) error { | ||||
| 	return regDeleteKey(syscall.Handle(k), syscall.StringToUTF16Ptr(path)) | ||||
| } | ||||
|  | ||||
| // A KeyInfo describes the statistics of a key. It is returned by Stat. | ||||
| type KeyInfo struct { | ||||
| 	SubKeyCount     uint32 | ||||
| 	MaxSubKeyLen    uint32 // size of the key's subkey with the longest name, in Unicode characters, not including the terminating zero byte | ||||
| 	ValueCount      uint32 | ||||
| 	MaxValueNameLen uint32 // size of the key's longest value name, in Unicode characters, not including the terminating zero byte | ||||
| 	MaxValueLen     uint32 // longest data component among the key's values, in bytes | ||||
| 	lastWriteTime   syscall.Filetime | ||||
| } | ||||
|  | ||||
| // ModTime returns the key's last write time. | ||||
| func (ki *KeyInfo) ModTime() time.Time { | ||||
| 	return time.Unix(0, ki.lastWriteTime.Nanoseconds()) | ||||
| } | ||||
|  | ||||
| // Stat retrieves information about the open key k. | ||||
| func (k Key) Stat() (*KeyInfo, error) { | ||||
| 	var ki KeyInfo | ||||
| 	err := syscall.RegQueryInfoKey(syscall.Handle(k), nil, nil, nil, | ||||
| 		&ki.SubKeyCount, &ki.MaxSubKeyLen, nil, &ki.ValueCount, | ||||
| 		&ki.MaxValueNameLen, &ki.MaxValueLen, nil, &ki.lastWriteTime) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return &ki, nil | ||||
| } | ||||
							
								
								
									
										9
									
								
								vendor/golang.org/x/sys/windows/registry/mksyscall.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								vendor/golang.org/x/sys/windows/registry/mksyscall.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,9 +0,0 @@ | ||||
| // Copyright 2015 The Go Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| // +build generate | ||||
|  | ||||
| package registry | ||||
|  | ||||
| //go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go syscall.go | ||||
							
								
								
									
										32
									
								
								vendor/golang.org/x/sys/windows/registry/syscall.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										32
									
								
								vendor/golang.org/x/sys/windows/registry/syscall.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,32 +0,0 @@ | ||||
| // Copyright 2015 The Go Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| // +build windows | ||||
|  | ||||
| package registry | ||||
|  | ||||
| import "syscall" | ||||
|  | ||||
| const ( | ||||
| 	_REG_OPTION_NON_VOLATILE = 0 | ||||
|  | ||||
| 	_REG_CREATED_NEW_KEY     = 1 | ||||
| 	_REG_OPENED_EXISTING_KEY = 2 | ||||
|  | ||||
| 	_ERROR_NO_MORE_ITEMS syscall.Errno = 259 | ||||
| ) | ||||
|  | ||||
| func LoadRegLoadMUIString() error { | ||||
| 	return procRegLoadMUIStringW.Find() | ||||
| } | ||||
|  | ||||
| //sys	regCreateKeyEx(key syscall.Handle, subkey *uint16, reserved uint32, class *uint16, options uint32, desired uint32, sa *syscall.SecurityAttributes, result *syscall.Handle, disposition *uint32) (regerrno error) = advapi32.RegCreateKeyExW | ||||
| //sys	regDeleteKey(key syscall.Handle, subkey *uint16) (regerrno error) = advapi32.RegDeleteKeyW | ||||
| //sys	regSetValueEx(key syscall.Handle, valueName *uint16, reserved uint32, vtype uint32, buf *byte, bufsize uint32) (regerrno error) = advapi32.RegSetValueExW | ||||
| //sys	regEnumValue(key syscall.Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) = advapi32.RegEnumValueW | ||||
| //sys	regDeleteValue(key syscall.Handle, name *uint16) (regerrno error) = advapi32.RegDeleteValueW | ||||
| //sys   regLoadMUIString(key syscall.Handle, name *uint16, buf *uint16, buflen uint32, buflenCopied *uint32, flags uint32, dir *uint16) (regerrno error) = advapi32.RegLoadMUIStringW | ||||
| //sys	regConnectRegistry(machinename *uint16, key syscall.Handle, result *syscall.Handle) (regerrno error) = advapi32.RegConnectRegistryW | ||||
|  | ||||
| //sys	expandEnvironmentStrings(src *uint16, dst *uint16, size uint32) (n uint32, err error) = kernel32.ExpandEnvironmentStringsW | ||||
							
								
								
									
										387
									
								
								vendor/golang.org/x/sys/windows/registry/value.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										387
									
								
								vendor/golang.org/x/sys/windows/registry/value.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,387 +0,0 @@ | ||||
| // Copyright 2015 The Go Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| // +build windows | ||||
|  | ||||
| package registry | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"io" | ||||
| 	"syscall" | ||||
| 	"unicode/utf16" | ||||
| 	"unsafe" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	// Registry value types. | ||||
| 	NONE                       = 0 | ||||
| 	SZ                         = 1 | ||||
| 	EXPAND_SZ                  = 2 | ||||
| 	BINARY                     = 3 | ||||
| 	DWORD                      = 4 | ||||
| 	DWORD_BIG_ENDIAN           = 5 | ||||
| 	LINK                       = 6 | ||||
| 	MULTI_SZ                   = 7 | ||||
| 	RESOURCE_LIST              = 8 | ||||
| 	FULL_RESOURCE_DESCRIPTOR   = 9 | ||||
| 	RESOURCE_REQUIREMENTS_LIST = 10 | ||||
| 	QWORD                      = 11 | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	// ErrShortBuffer is returned when the buffer was too short for the operation. | ||||
| 	ErrShortBuffer = syscall.ERROR_MORE_DATA | ||||
|  | ||||
| 	// ErrNotExist is returned when a registry key or value does not exist. | ||||
| 	ErrNotExist = syscall.ERROR_FILE_NOT_FOUND | ||||
|  | ||||
| 	// ErrUnexpectedType is returned by Get*Value when the value's type was unexpected. | ||||
| 	ErrUnexpectedType = errors.New("unexpected key value type") | ||||
| ) | ||||
|  | ||||
| // GetValue retrieves the type and data for the specified value associated | ||||
| // with an open key k. It fills up buffer buf and returns the retrieved | ||||
| // byte count n. If buf is too small to fit the stored value it returns | ||||
| // ErrShortBuffer error along with the required buffer size n. | ||||
| // If no buffer is provided, it returns true and actual buffer size n. | ||||
| // If no buffer is provided, GetValue returns the value's type only. | ||||
| // If the value does not exist, the error returned is ErrNotExist. | ||||
| // | ||||
| // GetValue is a low level function. If value's type is known, use the appropriate | ||||
| // Get*Value function instead. | ||||
| func (k Key) GetValue(name string, buf []byte) (n int, valtype uint32, err error) { | ||||
| 	pname, err := syscall.UTF16PtrFromString(name) | ||||
| 	if err != nil { | ||||
| 		return 0, 0, err | ||||
| 	} | ||||
| 	var pbuf *byte | ||||
| 	if len(buf) > 0 { | ||||
| 		pbuf = (*byte)(unsafe.Pointer(&buf[0])) | ||||
| 	} | ||||
| 	l := uint32(len(buf)) | ||||
| 	err = syscall.RegQueryValueEx(syscall.Handle(k), pname, nil, &valtype, pbuf, &l) | ||||
| 	if err != nil { | ||||
| 		return int(l), valtype, err | ||||
| 	} | ||||
| 	return int(l), valtype, nil | ||||
| } | ||||
|  | ||||
| func (k Key) getValue(name string, buf []byte) (data []byte, valtype uint32, err error) { | ||||
| 	p, err := syscall.UTF16PtrFromString(name) | ||||
| 	if err != nil { | ||||
| 		return nil, 0, err | ||||
| 	} | ||||
| 	var t uint32 | ||||
| 	n := uint32(len(buf)) | ||||
| 	for { | ||||
| 		err = syscall.RegQueryValueEx(syscall.Handle(k), p, nil, &t, (*byte)(unsafe.Pointer(&buf[0])), &n) | ||||
| 		if err == nil { | ||||
| 			return buf[:n], t, nil | ||||
| 		} | ||||
| 		if err != syscall.ERROR_MORE_DATA { | ||||
| 			return nil, 0, err | ||||
| 		} | ||||
| 		if n <= uint32(len(buf)) { | ||||
| 			return nil, 0, err | ||||
| 		} | ||||
| 		buf = make([]byte, n) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // GetStringValue retrieves the string value for the specified | ||||
| // value name associated with an open key k. It also returns the value's type. | ||||
| // If value does not exist, GetStringValue returns ErrNotExist. | ||||
| // If value is not SZ or EXPAND_SZ, it will return the correct value | ||||
| // type and ErrUnexpectedType. | ||||
| func (k Key) GetStringValue(name string) (val string, valtype uint32, err error) { | ||||
| 	data, typ, err2 := k.getValue(name, make([]byte, 64)) | ||||
| 	if err2 != nil { | ||||
| 		return "", typ, err2 | ||||
| 	} | ||||
| 	switch typ { | ||||
| 	case SZ, EXPAND_SZ: | ||||
| 	default: | ||||
| 		return "", typ, ErrUnexpectedType | ||||
| 	} | ||||
| 	if len(data) == 0 { | ||||
| 		return "", typ, nil | ||||
| 	} | ||||
| 	u := (*[1 << 29]uint16)(unsafe.Pointer(&data[0]))[:] | ||||
| 	return syscall.UTF16ToString(u), typ, nil | ||||
| } | ||||
|  | ||||
| // GetMUIStringValue retrieves the localized string value for | ||||
| // the specified value name associated with an open key k. | ||||
| // If the value name doesn't exist or the localized string value | ||||
| // can't be resolved, GetMUIStringValue returns ErrNotExist. | ||||
| // GetMUIStringValue panics if the system doesn't support | ||||
| // regLoadMUIString; use LoadRegLoadMUIString to check if | ||||
| // regLoadMUIString is supported before calling this function. | ||||
| func (k Key) GetMUIStringValue(name string) (string, error) { | ||||
| 	pname, err := syscall.UTF16PtrFromString(name) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
|  | ||||
| 	buf := make([]uint16, 1024) | ||||
| 	var buflen uint32 | ||||
| 	var pdir *uint16 | ||||
|  | ||||
| 	err = regLoadMUIString(syscall.Handle(k), pname, &buf[0], uint32(len(buf)), &buflen, 0, pdir) | ||||
| 	if err == syscall.ERROR_FILE_NOT_FOUND { // Try fallback path | ||||
|  | ||||
| 		// Try to resolve the string value using the system directory as | ||||
| 		// a DLL search path; this assumes the string value is of the form | ||||
| 		// @[path]\dllname,-strID but with no path given, e.g. @tzres.dll,-320. | ||||
|  | ||||
| 		// This approach works with tzres.dll but may have to be revised | ||||
| 		// in the future to allow callers to provide custom search paths. | ||||
|  | ||||
| 		var s string | ||||
| 		s, err = ExpandString("%SystemRoot%\\system32\\") | ||||
| 		if err != nil { | ||||
| 			return "", err | ||||
| 		} | ||||
| 		pdir, err = syscall.UTF16PtrFromString(s) | ||||
| 		if err != nil { | ||||
| 			return "", err | ||||
| 		} | ||||
|  | ||||
| 		err = regLoadMUIString(syscall.Handle(k), pname, &buf[0], uint32(len(buf)), &buflen, 0, pdir) | ||||
| 	} | ||||
|  | ||||
| 	for err == syscall.ERROR_MORE_DATA { // Grow buffer if needed | ||||
| 		if buflen <= uint32(len(buf)) { | ||||
| 			break // Buffer not growing, assume race; break | ||||
| 		} | ||||
| 		buf = make([]uint16, buflen) | ||||
| 		err = regLoadMUIString(syscall.Handle(k), pname, &buf[0], uint32(len(buf)), &buflen, 0, pdir) | ||||
| 	} | ||||
|  | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
|  | ||||
| 	return syscall.UTF16ToString(buf), nil | ||||
| } | ||||
|  | ||||
| // ExpandString expands environment-variable strings and replaces | ||||
| // them with the values defined for the current user. | ||||
| // Use ExpandString to expand EXPAND_SZ strings. | ||||
| func ExpandString(value string) (string, error) { | ||||
| 	if value == "" { | ||||
| 		return "", nil | ||||
| 	} | ||||
| 	p, err := syscall.UTF16PtrFromString(value) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
| 	r := make([]uint16, 100) | ||||
| 	for { | ||||
| 		n, err := expandEnvironmentStrings(p, &r[0], uint32(len(r))) | ||||
| 		if err != nil { | ||||
| 			return "", err | ||||
| 		} | ||||
| 		if n <= uint32(len(r)) { | ||||
| 			u := (*[1 << 29]uint16)(unsafe.Pointer(&r[0]))[:] | ||||
| 			return syscall.UTF16ToString(u), nil | ||||
| 		} | ||||
| 		r = make([]uint16, n) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // GetStringsValue retrieves the []string value for the specified | ||||
| // value name associated with an open key k. It also returns the value's type. | ||||
| // If value does not exist, GetStringsValue returns ErrNotExist. | ||||
| // If value is not MULTI_SZ, it will return the correct value | ||||
| // type and ErrUnexpectedType. | ||||
| func (k Key) GetStringsValue(name string) (val []string, valtype uint32, err error) { | ||||
| 	data, typ, err2 := k.getValue(name, make([]byte, 64)) | ||||
| 	if err2 != nil { | ||||
| 		return nil, typ, err2 | ||||
| 	} | ||||
| 	if typ != MULTI_SZ { | ||||
| 		return nil, typ, ErrUnexpectedType | ||||
| 	} | ||||
| 	if len(data) == 0 { | ||||
| 		return nil, typ, nil | ||||
| 	} | ||||
| 	p := (*[1 << 29]uint16)(unsafe.Pointer(&data[0]))[:len(data)/2] | ||||
| 	if len(p) == 0 { | ||||
| 		return nil, typ, nil | ||||
| 	} | ||||
| 	if p[len(p)-1] == 0 { | ||||
| 		p = p[:len(p)-1] // remove terminating null | ||||
| 	} | ||||
| 	val = make([]string, 0, 5) | ||||
| 	from := 0 | ||||
| 	for i, c := range p { | ||||
| 		if c == 0 { | ||||
| 			val = append(val, string(utf16.Decode(p[from:i]))) | ||||
| 			from = i + 1 | ||||
| 		} | ||||
| 	} | ||||
| 	return val, typ, nil | ||||
| } | ||||
|  | ||||
| // GetIntegerValue retrieves the integer value for the specified | ||||
| // value name associated with an open key k. It also returns the value's type. | ||||
| // If value does not exist, GetIntegerValue returns ErrNotExist. | ||||
| // If value is not DWORD or QWORD, it will return the correct value | ||||
| // type and ErrUnexpectedType. | ||||
| func (k Key) GetIntegerValue(name string) (val uint64, valtype uint32, err error) { | ||||
| 	data, typ, err2 := k.getValue(name, make([]byte, 8)) | ||||
| 	if err2 != nil { | ||||
| 		return 0, typ, err2 | ||||
| 	} | ||||
| 	switch typ { | ||||
| 	case DWORD: | ||||
| 		if len(data) != 4 { | ||||
| 			return 0, typ, errors.New("DWORD value is not 4 bytes long") | ||||
| 		} | ||||
| 		var val32 uint32 | ||||
| 		copy((*[4]byte)(unsafe.Pointer(&val32))[:], data) | ||||
| 		return uint64(val32), DWORD, nil | ||||
| 	case QWORD: | ||||
| 		if len(data) != 8 { | ||||
| 			return 0, typ, errors.New("QWORD value is not 8 bytes long") | ||||
| 		} | ||||
| 		copy((*[8]byte)(unsafe.Pointer(&val))[:], data) | ||||
| 		return val, QWORD, nil | ||||
| 	default: | ||||
| 		return 0, typ, ErrUnexpectedType | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // GetBinaryValue retrieves the binary value for the specified | ||||
| // value name associated with an open key k. It also returns the value's type. | ||||
| // If value does not exist, GetBinaryValue returns ErrNotExist. | ||||
| // If value is not BINARY, it will return the correct value | ||||
| // type and ErrUnexpectedType. | ||||
| func (k Key) GetBinaryValue(name string) (val []byte, valtype uint32, err error) { | ||||
| 	data, typ, err2 := k.getValue(name, make([]byte, 64)) | ||||
| 	if err2 != nil { | ||||
| 		return nil, typ, err2 | ||||
| 	} | ||||
| 	if typ != BINARY { | ||||
| 		return nil, typ, ErrUnexpectedType | ||||
| 	} | ||||
| 	return data, typ, nil | ||||
| } | ||||
|  | ||||
| func (k Key) setValue(name string, valtype uint32, data []byte) error { | ||||
| 	p, err := syscall.UTF16PtrFromString(name) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if len(data) == 0 { | ||||
| 		return regSetValueEx(syscall.Handle(k), p, 0, valtype, nil, 0) | ||||
| 	} | ||||
| 	return regSetValueEx(syscall.Handle(k), p, 0, valtype, &data[0], uint32(len(data))) | ||||
| } | ||||
|  | ||||
| // SetDWordValue sets the data and type of a name value | ||||
| // under key k to value and DWORD. | ||||
| func (k Key) SetDWordValue(name string, value uint32) error { | ||||
| 	return k.setValue(name, DWORD, (*[4]byte)(unsafe.Pointer(&value))[:]) | ||||
| } | ||||
|  | ||||
| // SetQWordValue sets the data and type of a name value | ||||
| // under key k to value and QWORD. | ||||
| func (k Key) SetQWordValue(name string, value uint64) error { | ||||
| 	return k.setValue(name, QWORD, (*[8]byte)(unsafe.Pointer(&value))[:]) | ||||
| } | ||||
|  | ||||
| func (k Key) setStringValue(name string, valtype uint32, value string) error { | ||||
| 	v, err := syscall.UTF16FromString(value) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	buf := (*[1 << 29]byte)(unsafe.Pointer(&v[0]))[:len(v)*2] | ||||
| 	return k.setValue(name, valtype, buf) | ||||
| } | ||||
|  | ||||
| // SetStringValue sets the data and type of a name value | ||||
| // under key k to value and SZ. The value must not contain a zero byte. | ||||
| func (k Key) SetStringValue(name, value string) error { | ||||
| 	return k.setStringValue(name, SZ, value) | ||||
| } | ||||
|  | ||||
| // SetExpandStringValue sets the data and type of a name value | ||||
| // under key k to value and EXPAND_SZ. The value must not contain a zero byte. | ||||
| func (k Key) SetExpandStringValue(name, value string) error { | ||||
| 	return k.setStringValue(name, EXPAND_SZ, value) | ||||
| } | ||||
|  | ||||
| // SetStringsValue sets the data and type of a name value | ||||
| // under key k to value and MULTI_SZ. The value strings | ||||
| // must not contain a zero byte. | ||||
| func (k Key) SetStringsValue(name string, value []string) error { | ||||
| 	ss := "" | ||||
| 	for _, s := range value { | ||||
| 		for i := 0; i < len(s); i++ { | ||||
| 			if s[i] == 0 { | ||||
| 				return errors.New("string cannot have 0 inside") | ||||
| 			} | ||||
| 		} | ||||
| 		ss += s + "\x00" | ||||
| 	} | ||||
| 	v := utf16.Encode([]rune(ss + "\x00")) | ||||
| 	buf := (*[1 << 29]byte)(unsafe.Pointer(&v[0]))[:len(v)*2] | ||||
| 	return k.setValue(name, MULTI_SZ, buf) | ||||
| } | ||||
|  | ||||
| // SetBinaryValue sets the data and type of a name value | ||||
| // under key k to value and BINARY. | ||||
| func (k Key) SetBinaryValue(name string, value []byte) error { | ||||
| 	return k.setValue(name, BINARY, value) | ||||
| } | ||||
|  | ||||
| // DeleteValue removes a named value from the key k. | ||||
| func (k Key) DeleteValue(name string) error { | ||||
| 	return regDeleteValue(syscall.Handle(k), syscall.StringToUTF16Ptr(name)) | ||||
| } | ||||
|  | ||||
| // ReadValueNames returns the value names of key k. | ||||
| // The parameter n controls the number of returned names, | ||||
| // analogous to the way os.File.Readdirnames works. | ||||
| func (k Key) ReadValueNames(n int) ([]string, error) { | ||||
| 	ki, err := k.Stat() | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	names := make([]string, 0, ki.ValueCount) | ||||
| 	buf := make([]uint16, ki.MaxValueNameLen+1) // extra room for terminating null character | ||||
| loopItems: | ||||
| 	for i := uint32(0); ; i++ { | ||||
| 		if n > 0 { | ||||
| 			if len(names) == n { | ||||
| 				return names, nil | ||||
| 			} | ||||
| 		} | ||||
| 		l := uint32(len(buf)) | ||||
| 		for { | ||||
| 			err := regEnumValue(syscall.Handle(k), i, &buf[0], &l, nil, nil, nil, nil) | ||||
| 			if err == nil { | ||||
| 				break | ||||
| 			} | ||||
| 			if err == syscall.ERROR_MORE_DATA { | ||||
| 				// Double buffer size and try again. | ||||
| 				l = uint32(2 * len(buf)) | ||||
| 				buf = make([]uint16, l) | ||||
| 				continue | ||||
| 			} | ||||
| 			if err == _ERROR_NO_MORE_ITEMS { | ||||
| 				break loopItems | ||||
| 			} | ||||
| 			return names, err | ||||
| 		} | ||||
| 		names = append(names, syscall.UTF16ToString(buf[:l])) | ||||
| 	} | ||||
| 	if n > len(names) { | ||||
| 		return names, io.EOF | ||||
| 	} | ||||
| 	return names, nil | ||||
| } | ||||
							
								
								
									
										120
									
								
								vendor/golang.org/x/sys/windows/registry/zsyscall_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										120
									
								
								vendor/golang.org/x/sys/windows/registry/zsyscall_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,120 +0,0 @@ | ||||
| // Code generated by 'go generate'; DO NOT EDIT. | ||||
|  | ||||
| package registry | ||||
|  | ||||
| import ( | ||||
| 	"syscall" | ||||
| 	"unsafe" | ||||
|  | ||||
| 	"golang.org/x/sys/windows" | ||||
| ) | ||||
|  | ||||
| var _ unsafe.Pointer | ||||
|  | ||||
| // Do the interface allocations only once for common | ||||
| // Errno values. | ||||
| const ( | ||||
| 	errnoERROR_IO_PENDING = 997 | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) | ||||
| ) | ||||
|  | ||||
| // errnoErr returns common boxed Errno values, to prevent | ||||
| // allocations at runtime. | ||||
| func errnoErr(e syscall.Errno) error { | ||||
| 	switch e { | ||||
| 	case 0: | ||||
| 		return nil | ||||
| 	case errnoERROR_IO_PENDING: | ||||
| 		return errERROR_IO_PENDING | ||||
| 	} | ||||
| 	// TODO: add more here, after collecting data on the common | ||||
| 	// error values see on Windows. (perhaps when running | ||||
| 	// all.bat?) | ||||
| 	return e | ||||
| } | ||||
|  | ||||
| var ( | ||||
| 	modadvapi32 = windows.NewLazySystemDLL("advapi32.dll") | ||||
| 	modkernel32 = windows.NewLazySystemDLL("kernel32.dll") | ||||
|  | ||||
| 	procRegCreateKeyExW           = modadvapi32.NewProc("RegCreateKeyExW") | ||||
| 	procRegDeleteKeyW             = modadvapi32.NewProc("RegDeleteKeyW") | ||||
| 	procRegSetValueExW            = modadvapi32.NewProc("RegSetValueExW") | ||||
| 	procRegEnumValueW             = modadvapi32.NewProc("RegEnumValueW") | ||||
| 	procRegDeleteValueW           = modadvapi32.NewProc("RegDeleteValueW") | ||||
| 	procRegLoadMUIStringW         = modadvapi32.NewProc("RegLoadMUIStringW") | ||||
| 	procRegConnectRegistryW       = modadvapi32.NewProc("RegConnectRegistryW") | ||||
| 	procExpandEnvironmentStringsW = modkernel32.NewProc("ExpandEnvironmentStringsW") | ||||
| ) | ||||
|  | ||||
| func regCreateKeyEx(key syscall.Handle, subkey *uint16, reserved uint32, class *uint16, options uint32, desired uint32, sa *syscall.SecurityAttributes, result *syscall.Handle, disposition *uint32) (regerrno error) { | ||||
| 	r0, _, _ := syscall.Syscall9(procRegCreateKeyExW.Addr(), 9, uintptr(key), uintptr(unsafe.Pointer(subkey)), uintptr(reserved), uintptr(unsafe.Pointer(class)), uintptr(options), uintptr(desired), uintptr(unsafe.Pointer(sa)), uintptr(unsafe.Pointer(result)), uintptr(unsafe.Pointer(disposition))) | ||||
| 	if r0 != 0 { | ||||
| 		regerrno = syscall.Errno(r0) | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func regDeleteKey(key syscall.Handle, subkey *uint16) (regerrno error) { | ||||
| 	r0, _, _ := syscall.Syscall(procRegDeleteKeyW.Addr(), 2, uintptr(key), uintptr(unsafe.Pointer(subkey)), 0) | ||||
| 	if r0 != 0 { | ||||
| 		regerrno = syscall.Errno(r0) | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func regSetValueEx(key syscall.Handle, valueName *uint16, reserved uint32, vtype uint32, buf *byte, bufsize uint32) (regerrno error) { | ||||
| 	r0, _, _ := syscall.Syscall6(procRegSetValueExW.Addr(), 6, uintptr(key), uintptr(unsafe.Pointer(valueName)), uintptr(reserved), uintptr(vtype), uintptr(unsafe.Pointer(buf)), uintptr(bufsize)) | ||||
| 	if r0 != 0 { | ||||
| 		regerrno = syscall.Errno(r0) | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func regEnumValue(key syscall.Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) { | ||||
| 	r0, _, _ := syscall.Syscall9(procRegEnumValueW.Addr(), 8, uintptr(key), uintptr(index), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(nameLen)), uintptr(unsafe.Pointer(reserved)), uintptr(unsafe.Pointer(valtype)), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(buflen)), 0) | ||||
| 	if r0 != 0 { | ||||
| 		regerrno = syscall.Errno(r0) | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func regDeleteValue(key syscall.Handle, name *uint16) (regerrno error) { | ||||
| 	r0, _, _ := syscall.Syscall(procRegDeleteValueW.Addr(), 2, uintptr(key), uintptr(unsafe.Pointer(name)), 0) | ||||
| 	if r0 != 0 { | ||||
| 		regerrno = syscall.Errno(r0) | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func regLoadMUIString(key syscall.Handle, name *uint16, buf *uint16, buflen uint32, buflenCopied *uint32, flags uint32, dir *uint16) (regerrno error) { | ||||
| 	r0, _, _ := syscall.Syscall9(procRegLoadMUIStringW.Addr(), 7, uintptr(key), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(buf)), uintptr(buflen), uintptr(unsafe.Pointer(buflenCopied)), uintptr(flags), uintptr(unsafe.Pointer(dir)), 0, 0) | ||||
| 	if r0 != 0 { | ||||
| 		regerrno = syscall.Errno(r0) | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func regConnectRegistry(machinename *uint16, key syscall.Handle, result *syscall.Handle) (regerrno error) { | ||||
| 	r0, _, _ := syscall.Syscall(procRegConnectRegistryW.Addr(), 3, uintptr(unsafe.Pointer(machinename)), uintptr(key), uintptr(unsafe.Pointer(result))) | ||||
| 	if r0 != 0 { | ||||
| 		regerrno = syscall.Errno(r0) | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func expandEnvironmentStrings(src *uint16, dst *uint16, size uint32) (n uint32, err error) { | ||||
| 	r0, _, e1 := syscall.Syscall(procExpandEnvironmentStringsW.Addr(), 3, uintptr(unsafe.Pointer(src)), uintptr(unsafe.Pointer(dst)), uintptr(size)) | ||||
| 	n = uint32(r0) | ||||
| 	if n == 0 { | ||||
| 		if e1 != 0 { | ||||
| 			err = errnoErr(e1) | ||||
| 		} else { | ||||
| 			err = syscall.EINVAL | ||||
| 		} | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
							
								
								
									
										80
									
								
								vendor/golang.org/x/sys/windows/svc/eventlog/install.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										80
									
								
								vendor/golang.org/x/sys/windows/svc/eventlog/install.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,80 +0,0 @@ | ||||
| // Copyright 2012 The Go Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| // +build windows | ||||
|  | ||||
| package eventlog | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
|  | ||||
| 	"golang.org/x/sys/windows" | ||||
| 	"golang.org/x/sys/windows/registry" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	// Log levels. | ||||
| 	Info    = windows.EVENTLOG_INFORMATION_TYPE | ||||
| 	Warning = windows.EVENTLOG_WARNING_TYPE | ||||
| 	Error   = windows.EVENTLOG_ERROR_TYPE | ||||
| ) | ||||
|  | ||||
| const addKeyName = `SYSTEM\CurrentControlSet\Services\EventLog\Application` | ||||
|  | ||||
| // Install modifies PC registry to allow logging with an event source src. | ||||
| // It adds all required keys and values to the event log registry key. | ||||
| // Install uses msgFile as the event message file. If useExpandKey is true, | ||||
| // the event message file is installed as REG_EXPAND_SZ value, | ||||
| // otherwise as REG_SZ. Use bitwise of log.Error, log.Warning and | ||||
| // log.Info to specify events supported by the new event source. | ||||
| func Install(src, msgFile string, useExpandKey bool, eventsSupported uint32) error { | ||||
| 	appkey, err := registry.OpenKey(registry.LOCAL_MACHINE, addKeyName, registry.CREATE_SUB_KEY) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer appkey.Close() | ||||
|  | ||||
| 	sk, alreadyExist, err := registry.CreateKey(appkey, src, registry.SET_VALUE) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer sk.Close() | ||||
| 	if alreadyExist { | ||||
| 		return errors.New(addKeyName + `\` + src + " registry key already exists") | ||||
| 	} | ||||
|  | ||||
| 	err = sk.SetDWordValue("CustomSource", 1) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if useExpandKey { | ||||
| 		err = sk.SetExpandStringValue("EventMessageFile", msgFile) | ||||
| 	} else { | ||||
| 		err = sk.SetStringValue("EventMessageFile", msgFile) | ||||
| 	} | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	err = sk.SetDWordValue("TypesSupported", eventsSupported) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // InstallAsEventCreate is the same as Install, but uses | ||||
| // %SystemRoot%\System32\EventCreate.exe as the event message file. | ||||
| func InstallAsEventCreate(src string, eventsSupported uint32) error { | ||||
| 	return Install(src, "%SystemRoot%\\System32\\EventCreate.exe", true, eventsSupported) | ||||
| } | ||||
|  | ||||
| // Remove deletes all registry elements installed by the correspondent Install. | ||||
| func Remove(src string) error { | ||||
| 	appkey, err := registry.OpenKey(registry.LOCAL_MACHINE, addKeyName, registry.SET_VALUE) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer appkey.Close() | ||||
| 	return registry.DeleteKey(appkey, src) | ||||
| } | ||||
							
								
								
									
										70
									
								
								vendor/golang.org/x/sys/windows/svc/eventlog/log.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										70
									
								
								vendor/golang.org/x/sys/windows/svc/eventlog/log.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,70 +0,0 @@ | ||||
| // Copyright 2012 The Go Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| // +build windows | ||||
|  | ||||
| // Package eventlog implements access to Windows event log. | ||||
| // | ||||
| package eventlog | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"syscall" | ||||
|  | ||||
| 	"golang.org/x/sys/windows" | ||||
| ) | ||||
|  | ||||
| // Log provides access to the system log. | ||||
| type Log struct { | ||||
| 	Handle windows.Handle | ||||
| } | ||||
|  | ||||
| // Open retrieves a handle to the specified event log. | ||||
| func Open(source string) (*Log, error) { | ||||
| 	return OpenRemote("", source) | ||||
| } | ||||
|  | ||||
| // OpenRemote does the same as Open, but on different computer host. | ||||
| func OpenRemote(host, source string) (*Log, error) { | ||||
| 	if source == "" { | ||||
| 		return nil, errors.New("Specify event log source") | ||||
| 	} | ||||
| 	var s *uint16 | ||||
| 	if host != "" { | ||||
| 		s = syscall.StringToUTF16Ptr(host) | ||||
| 	} | ||||
| 	h, err := windows.RegisterEventSource(s, syscall.StringToUTF16Ptr(source)) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return &Log{Handle: h}, nil | ||||
| } | ||||
|  | ||||
| // Close closes event log l. | ||||
| func (l *Log) Close() error { | ||||
| 	return windows.DeregisterEventSource(l.Handle) | ||||
| } | ||||
|  | ||||
| func (l *Log) report(etype uint16, eid uint32, msg string) error { | ||||
| 	ss := []*uint16{syscall.StringToUTF16Ptr(msg)} | ||||
| 	return windows.ReportEvent(l.Handle, etype, 0, eid, 0, 1, 0, &ss[0], nil) | ||||
| } | ||||
|  | ||||
| // Info writes an information event msg with event id eid to the end of event log l. | ||||
| // When EventCreate.exe is used, eid must be between 1 and 1000. | ||||
| func (l *Log) Info(eid uint32, msg string) error { | ||||
| 	return l.report(windows.EVENTLOG_INFORMATION_TYPE, eid, msg) | ||||
| } | ||||
|  | ||||
| // Warning writes an warning event msg with event id eid to the end of event log l. | ||||
| // When EventCreate.exe is used, eid must be between 1 and 1000. | ||||
| func (l *Log) Warning(eid uint32, msg string) error { | ||||
| 	return l.report(windows.EVENTLOG_WARNING_TYPE, eid, msg) | ||||
| } | ||||
|  | ||||
| // Error writes an error event msg with event id eid to the end of event log l. | ||||
| // When EventCreate.exe is used, eid must be between 1 and 1000. | ||||
| func (l *Log) Error(eid uint32, msg string) error { | ||||
| 	return l.report(windows.EVENTLOG_ERROR_TYPE, eid, msg) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Phil Estes
					Phil Estes