func nativeGetPortsList() ([]string, error) { subKey, err := syscall.UTF16PtrFromString("HARDWARE\\DEVICEMAP\\SERIALCOMM\\") if err != nil { return nil, &PortError{code: ErrorEnumeratingPorts} } var h syscall.Handle if syscall.RegOpenKeyEx(syscall.HKEY_LOCAL_MACHINE, subKey, 0, syscall.KEY_READ, &h) != nil { return nil, &PortError{code: ErrorEnumeratingPorts} } defer syscall.RegCloseKey(h) var valuesCount uint32 if syscall.RegQueryInfoKey(h, nil, nil, nil, nil, nil, nil, &valuesCount, nil, nil, nil, nil) != nil { return nil, &PortError{code: ErrorEnumeratingPorts} } list := make([]string, valuesCount) for i := range list { var data [1024]uint16 dataSize := uint32(len(data)) var name [1024]uint16 nameSize := uint32(len(name)) if regEnumValue(h, uint32(i), &name[0], &nameSize, nil, nil, &data[0], &dataSize) != nil { return nil, &PortError{code: ErrorEnumeratingPorts} } list[i] = syscall.UTF16ToString(data[:]) } return list, nil }
// toEnglishName searches the registry for an English name of a time zone // whose zone names are stdname and dstname and returns the English name. func toEnglishName(stdname, dstname string) (string, error) { var zones syscall.Handle p, _ := syscall.UTF16PtrFromString(`SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones`) if err := syscall.RegOpenKeyEx(syscall.HKEY_LOCAL_MACHINE, p, 0, syscall.KEY_READ, &zones); err != nil { return "", err } defer syscall.RegCloseKey(zones) var count uint32 if err := syscall.RegQueryInfoKey(zones, nil, nil, nil, &count, nil, nil, nil, nil, nil, nil, nil); err != nil { return "", err } var buf [50]uint16 // buf needs to be large enough to fit zone descriptions for i := uint32(0); i < count; i++ { n := uint32(len(buf)) if syscall.RegEnumKeyEx(zones, i, &buf[0], &n, nil, nil, nil, nil) != nil { continue } kname := syscall.UTF16ToString(buf[:]) matched, err := matchZoneKey(zones, kname, stdname, dstname) if err == nil && matched { return kname, nil } } return "", errors.New(`English name for time zone "` + stdname + `" not found in registry`) }
// 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 }
func initMime() { var root syscall.Handle rootpathp, _ := syscall.UTF16PtrFromString(`\`) if syscall.RegOpenKeyEx(syscall.HKEY_CLASSES_ROOT, rootpathp, 0, syscall.KEY_READ, &root) != nil { return } defer syscall.RegCloseKey(root) var count uint32 if syscall.RegQueryInfoKey(root, nil, nil, nil, &count, nil, nil, nil, nil, nil, nil, nil) != nil { return } var buf [1 << 10]uint16 for i := uint32(0); i < count; i++ { n := uint32(len(buf)) if syscall.RegEnumKeyEx(root, i, &buf[0], &n, nil, nil, nil, nil) != nil { continue } ext := syscall.UTF16ToString(buf[:]) if len(ext) < 2 || ext[0] != '.' { // looking for extensions only continue } var h syscall.Handle extpathp, _ := syscall.UTF16PtrFromString(`\` + ext) if syscall.RegOpenKeyEx( syscall.HKEY_CLASSES_ROOT, extpathp, 0, syscall.KEY_READ, &h) != nil { continue } var typ uint32 n = uint32(len(buf) * 2) // api expects array of bytes, not uint16 contenttypep, _ := syscall.UTF16PtrFromString("Content Type") if syscall.RegQueryValueEx( h, contenttypep, nil, &typ, (*byte)(unsafe.Pointer(&buf[0])), &n) != nil { syscall.RegCloseKey(h) continue } syscall.RegCloseKey(h) if typ != syscall.REG_SZ { // null terminated strings only continue } mimeType := syscall.UTF16ToString(buf[:]) setExtensionType(ext, mimeType) } }
func QueryKey(handle syscall.Handle, mylist *[1 << 10]string) (csubkeys uint32) { var cvalues uint32 var achvalue []uint16 cbName := uint32(255) if syscall.RegQueryInfoKey(handle, nil, nil, nil, &csubkeys, nil, nil, &cvalues, nil, nil, nil, nil) != nil { return } //fmt.Println(csubkeys, cvalues, mylist) if csubkeys != 0 { var buf [1 << 10]uint16 for i := uint32(0); i < csubkeys; i = i + 1 { n := uint32(len(buf)) //fmt.Println(i, int(csubkeys), achkey) if syscall.RegEnumKeyEx(handle, i, &buf[0], &n, nil, nil, nil, nil) != nil { return } ext := syscall.UTF16ToString(buf[:]) //fmt.Println(i, ext, (*mylist)[i]) (*mylist)[i] = ext } } //fmt.Println(mylist) if cvalues != 0 { var j uint32 for j = 0; j < cvalues; j++ { if syscall.RegEnumKeyEx(handle, j, (*uint16)(unsafe.Pointer(&achvalue[0])), &cbName, nil, nil, nil, nil) != nil { return } } } return csubkeys }