in windows/setupapi_windows.go [1123:1172]
func getRegistryValue(buf []byte, dataType uint32) (interface{}, error) {
switch dataType {
case REG_SZ:
ret := UTF16ToString(bufToUTF16(buf))
runtime.KeepAlive(buf)
return ret, nil
case REG_EXPAND_SZ:
value := UTF16ToString(bufToUTF16(buf))
if value == "" {
return "", nil
}
p, err := syscall.UTF16PtrFromString(value)
if err != nil {
return "", err
}
ret := make([]uint16, 100)
for {
n, err := ExpandEnvironmentStrings(p, &ret[0], uint32(len(ret)))
if err != nil {
return "", err
}
if n <= uint32(len(ret)) {
return UTF16ToString(ret[:n]), nil
}
ret = make([]uint16, n)
}
case REG_BINARY:
return buf, nil
case REG_DWORD_LITTLE_ENDIAN:
return binary.LittleEndian.Uint32(buf), nil
case REG_DWORD_BIG_ENDIAN:
return binary.BigEndian.Uint32(buf), nil
case REG_MULTI_SZ:
bufW := bufToUTF16(buf)
a := []string{}
for i := 0; i < len(bufW); {
j := i + wcslen(bufW[i:])
if i < j {
a = append(a, UTF16ToString(bufW[i:j]))
}
i = j + 1
}
runtime.KeepAlive(buf)
return a, nil
case REG_QWORD_LITTLE_ENDIAN:
return binary.LittleEndian.Uint64(buf), nil
default:
return nil, fmt.Errorf("Unsupported registry value type: %v", dataType)
}
}