138 lines
3.9 KiB
Go
138 lines
3.9 KiB
Go
|
// Copyright 2010 The win 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 win
|
||
|
|
||
|
import (
|
||
|
"golang.org/x/sys/windows"
|
||
|
"syscall"
|
||
|
"unsafe"
|
||
|
)
|
||
|
|
||
|
const KEY_READ REGSAM = 0x20019
|
||
|
const KEY_WRITE REGSAM = 0x20006
|
||
|
|
||
|
const (
|
||
|
HKEY_CLASSES_ROOT HKEY = 0x80000000
|
||
|
HKEY_CURRENT_USER HKEY = 0x80000001
|
||
|
HKEY_LOCAL_MACHINE HKEY = 0x80000002
|
||
|
HKEY_USERS HKEY = 0x80000003
|
||
|
HKEY_PERFORMANCE_DATA HKEY = 0x80000004
|
||
|
HKEY_CURRENT_CONFIG HKEY = 0x80000005
|
||
|
HKEY_DYN_DATA HKEY = 0x80000006
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
ERROR_NO_MORE_ITEMS = 259
|
||
|
)
|
||
|
|
||
|
type (
|
||
|
ACCESS_MASK uint32
|
||
|
HKEY HANDLE
|
||
|
REGSAM ACCESS_MASK
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
REG_NONE uint64 = 0 // No value type
|
||
|
REG_SZ = 1 // Unicode nul terminated string
|
||
|
REG_EXPAND_SZ = 2 // Unicode nul terminated string
|
||
|
// (with environment variable references)
|
||
|
REG_BINARY = 3 // Free form binary
|
||
|
REG_DWORD = 4 // 32-bit number
|
||
|
REG_DWORD_LITTLE_ENDIAN = 4 // 32-bit number (same as REG_DWORD)
|
||
|
REG_DWORD_BIG_ENDIAN = 5 // 32-bit number
|
||
|
REG_LINK = 6 // Symbolic Link (unicode)
|
||
|
REG_MULTI_SZ = 7 // Multiple Unicode strings
|
||
|
REG_RESOURCE_LIST = 8 // Resource list in the resource map
|
||
|
REG_FULL_RESOURCE_DESCRIPTOR = 9 // Resource list in the hardware description
|
||
|
REG_RESOURCE_REQUIREMENTS_LIST = 10
|
||
|
REG_QWORD = 11 // 64-bit number
|
||
|
REG_QWORD_LITTLE_ENDIAN = 11 // 64-bit number (same as REG_QWORD)
|
||
|
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
// Library
|
||
|
libadvapi32 *windows.LazyDLL
|
||
|
|
||
|
// Functions
|
||
|
regCloseKey *windows.LazyProc
|
||
|
regOpenKeyEx *windows.LazyProc
|
||
|
regQueryValueEx *windows.LazyProc
|
||
|
regEnumValue *windows.LazyProc
|
||
|
regSetValueEx *windows.LazyProc
|
||
|
)
|
||
|
|
||
|
func init() {
|
||
|
// Library
|
||
|
libadvapi32 = windows.NewLazySystemDLL("advapi32.dll")
|
||
|
|
||
|
// Functions
|
||
|
regCloseKey = libadvapi32.NewProc("RegCloseKey")
|
||
|
regOpenKeyEx = libadvapi32.NewProc("RegOpenKeyExW")
|
||
|
regQueryValueEx = libadvapi32.NewProc("RegQueryValueExW")
|
||
|
regEnumValue = libadvapi32.NewProc("RegEnumValueW")
|
||
|
regSetValueEx = libadvapi32.NewProc("RegSetValueExW")
|
||
|
}
|
||
|
|
||
|
func RegCloseKey(hKey HKEY) int32 {
|
||
|
ret, _, _ := syscall.Syscall(regCloseKey.Addr(), 1,
|
||
|
uintptr(hKey),
|
||
|
0,
|
||
|
0)
|
||
|
|
||
|
return int32(ret)
|
||
|
}
|
||
|
|
||
|
func RegOpenKeyEx(hKey HKEY, lpSubKey *uint16, ulOptions uint32, samDesired REGSAM, phkResult *HKEY) int32 {
|
||
|
ret, _, _ := syscall.Syscall6(regOpenKeyEx.Addr(), 5,
|
||
|
uintptr(hKey),
|
||
|
uintptr(unsafe.Pointer(lpSubKey)),
|
||
|
uintptr(ulOptions),
|
||
|
uintptr(samDesired),
|
||
|
uintptr(unsafe.Pointer(phkResult)),
|
||
|
0)
|
||
|
|
||
|
return int32(ret)
|
||
|
}
|
||
|
|
||
|
func RegQueryValueEx(hKey HKEY, lpValueName *uint16, lpReserved, lpType *uint32, lpData *byte, lpcbData *uint32) int32 {
|
||
|
ret, _, _ := syscall.Syscall6(regQueryValueEx.Addr(), 6,
|
||
|
uintptr(hKey),
|
||
|
uintptr(unsafe.Pointer(lpValueName)),
|
||
|
uintptr(unsafe.Pointer(lpReserved)),
|
||
|
uintptr(unsafe.Pointer(lpType)),
|
||
|
uintptr(unsafe.Pointer(lpData)),
|
||
|
uintptr(unsafe.Pointer(lpcbData)))
|
||
|
|
||
|
return int32(ret)
|
||
|
}
|
||
|
|
||
|
func RegEnumValue(hKey HKEY, index uint32, lpValueName *uint16, lpcchValueName *uint32, lpReserved, lpType *uint32, lpData *byte, lpcbData *uint32) int32 {
|
||
|
ret, _, _ := syscall.Syscall9(regEnumValue.Addr(), 8,
|
||
|
uintptr(hKey),
|
||
|
uintptr(index),
|
||
|
uintptr(unsafe.Pointer(lpValueName)),
|
||
|
uintptr(unsafe.Pointer(lpcchValueName)),
|
||
|
uintptr(unsafe.Pointer(lpReserved)),
|
||
|
uintptr(unsafe.Pointer(lpType)),
|
||
|
uintptr(unsafe.Pointer(lpData)),
|
||
|
uintptr(unsafe.Pointer(lpcbData)),
|
||
|
0)
|
||
|
return int32(ret)
|
||
|
}
|
||
|
|
||
|
func RegSetValueEx(hKey HKEY, lpValueName *uint16, lpReserved, lpDataType uint64, lpData *byte, cbData uint32) int32 {
|
||
|
ret, _, _ := syscall.Syscall6(regSetValueEx.Addr(), 6,
|
||
|
uintptr(hKey),
|
||
|
uintptr(unsafe.Pointer(lpValueName)),
|
||
|
uintptr(lpReserved),
|
||
|
uintptr(lpDataType),
|
||
|
uintptr(unsafe.Pointer(lpData)),
|
||
|
uintptr(cbData))
|
||
|
return int32(ret)
|
||
|
}
|