Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
138 lines (116 sloc) 3.87 KB
// 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)
}
You can’t perform that action at this time.