setupapi: Make toUTF16() public and add UTF16ToBuf() counterpart
Signed-off-by: Simon Rozman <simon@rozman.si>
This commit is contained in:
parent
c599bf9497
commit
3c29434a79
|
@ -264,9 +264,9 @@ func SetupDiGetDeviceRegistryProperty(DeviceInfoSet DevInfo, DeviceInfoData *SP_
|
||||||
func getRegistryValue(buf []byte, dataType uint32) (interface{}, error) {
|
func getRegistryValue(buf []byte, dataType uint32) (interface{}, error) {
|
||||||
switch dataType {
|
switch dataType {
|
||||||
case windows.REG_SZ:
|
case windows.REG_SZ:
|
||||||
return windows.UTF16ToString(toUTF16(buf)), nil
|
return windows.UTF16ToString(BufToUTF16(buf)), nil
|
||||||
case windows.REG_EXPAND_SZ:
|
case windows.REG_EXPAND_SZ:
|
||||||
return registry.ExpandString(windows.UTF16ToString(toUTF16(buf)))
|
return registry.ExpandString(windows.UTF16ToString(BufToUTF16(buf)))
|
||||||
case windows.REG_BINARY:
|
case windows.REG_BINARY:
|
||||||
return buf, nil
|
return buf, nil
|
||||||
case windows.REG_DWORD_LITTLE_ENDIAN:
|
case windows.REG_DWORD_LITTLE_ENDIAN:
|
||||||
|
@ -274,7 +274,7 @@ func getRegistryValue(buf []byte, dataType uint32) (interface{}, error) {
|
||||||
case windows.REG_DWORD_BIG_ENDIAN:
|
case windows.REG_DWORD_BIG_ENDIAN:
|
||||||
return binary.BigEndian.Uint32(buf), nil
|
return binary.BigEndian.Uint32(buf), nil
|
||||||
case windows.REG_MULTI_SZ:
|
case windows.REG_MULTI_SZ:
|
||||||
bufW := toUTF16(buf)
|
bufW := BufToUTF16(buf)
|
||||||
a := []string{}
|
a := []string{}
|
||||||
for i := 0; i < len(bufW); {
|
for i := 0; i < len(bufW); {
|
||||||
j := i + wcslen(bufW[i:])
|
j := i + wcslen(bufW[i:])
|
||||||
|
@ -291,7 +291,8 @@ func getRegistryValue(buf []byte, dataType uint32) (interface{}, error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func toUTF16(buf []byte) []uint16 {
|
// BufToUTF16 function reinterprets []byte buffer as []uint16
|
||||||
|
func BufToUTF16(buf []byte) []uint16 {
|
||||||
sl := struct {
|
sl := struct {
|
||||||
addr *uint16
|
addr *uint16
|
||||||
len int
|
len int
|
||||||
|
@ -300,6 +301,16 @@ func toUTF16(buf []byte) []uint16 {
|
||||||
return *(*[]uint16)(unsafe.Pointer(&sl))
|
return *(*[]uint16)(unsafe.Pointer(&sl))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// UTF16ToBuf function reinterprets []uint16 as []byte
|
||||||
|
func UTF16ToBuf(buf []uint16) []byte {
|
||||||
|
sl := struct {
|
||||||
|
addr *byte
|
||||||
|
len int
|
||||||
|
cap int
|
||||||
|
}{(*byte)(unsafe.Pointer(&buf[0])), len(buf) * 2, cap(buf) * 2}
|
||||||
|
return *(*[]byte)(unsafe.Pointer(&sl))
|
||||||
|
}
|
||||||
|
|
||||||
func wcslen(str []uint16) int {
|
func wcslen(str []uint16) int {
|
||||||
for i := 0; i < len(str); i++ {
|
for i := 0; i < len(str); i++ {
|
||||||
if str[i] == 0 {
|
if str[i] == 0 {
|
||||||
|
|
|
@ -403,3 +403,16 @@ func TestSetupDiGetSelectedDevice(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestUTF16ToBuf(t *testing.T) {
|
||||||
|
buf := []uint16{0x0123, 0x4567, 0x89ab, 0xcdef}
|
||||||
|
buf2 := UTF16ToBuf(buf)
|
||||||
|
if len(buf)*2 != len(buf2) ||
|
||||||
|
cap(buf)*2 != cap(buf2) ||
|
||||||
|
buf2[0] != 0x23 || buf2[1] != 0x01 ||
|
||||||
|
buf2[2] != 0x67 || buf2[3] != 0x45 ||
|
||||||
|
buf2[4] != 0xab || buf2[5] != 0x89 ||
|
||||||
|
buf2[6] != 0xef || buf2[7] != 0xcd {
|
||||||
|
t.Errorf("SetupDiSetSelectedDevice(nil) should fail with ERROR_INVALID_USER_BUFFER")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue