advapi32.go 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. // Copyright 2010-2012 The W32 Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. // +build windows
  5. package w32
  6. import (
  7. "errors"
  8. "fmt"
  9. "syscall"
  10. "unsafe"
  11. )
  12. var (
  13. modadvapi32 = syscall.NewLazyDLL("advapi32.dll")
  14. procRegCreateKeyEx = modadvapi32.NewProc("RegCreateKeyExW")
  15. procRegOpenKeyEx = modadvapi32.NewProc("RegOpenKeyExW")
  16. procRegCloseKey = modadvapi32.NewProc("RegCloseKey")
  17. procRegGetValue = modadvapi32.NewProc("RegGetValueW")
  18. procRegEnumKeyEx = modadvapi32.NewProc("RegEnumKeyExW")
  19. // procRegSetKeyValue = modadvapi32.NewProc("RegSetKeyValueW")
  20. procRegSetValueEx = modadvapi32.NewProc("RegSetValueExW")
  21. procOpenEventLog = modadvapi32.NewProc("OpenEventLogW")
  22. procReadEventLog = modadvapi32.NewProc("ReadEventLogW")
  23. procCloseEventLog = modadvapi32.NewProc("CloseEventLog")
  24. procOpenSCManager = modadvapi32.NewProc("OpenSCManagerW")
  25. procCloseServiceHandle = modadvapi32.NewProc("CloseServiceHandle")
  26. procOpenService = modadvapi32.NewProc("OpenServiceW")
  27. procStartService = modadvapi32.NewProc("StartServiceW")
  28. procControlService = modadvapi32.NewProc("ControlService")
  29. )
  30. func RegCreateKey(hKey HKEY, subKey string) HKEY {
  31. var result HKEY
  32. ret, _, _ := procRegCreateKeyEx.Call(
  33. uintptr(hKey),
  34. uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))),
  35. uintptr(0),
  36. uintptr(0),
  37. uintptr(0),
  38. uintptr(KEY_ALL_ACCESS),
  39. uintptr(0),
  40. uintptr(unsafe.Pointer(&result)),
  41. uintptr(0))
  42. _ = ret
  43. return result
  44. }
  45. func RegOpenKeyEx(hKey HKEY, subKey string, samDesired uint32) HKEY {
  46. var result HKEY
  47. ret, _, _ := procRegOpenKeyEx.Call(
  48. uintptr(hKey),
  49. uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))),
  50. uintptr(0),
  51. uintptr(samDesired),
  52. uintptr(unsafe.Pointer(&result)))
  53. if ret != ERROR_SUCCESS {
  54. panic(fmt.Sprintf("RegOpenKeyEx(%d, %s, %d) failed", hKey, subKey, samDesired))
  55. }
  56. return result
  57. }
  58. func RegCloseKey(hKey HKEY) error {
  59. var err error
  60. ret, _, _ := procRegCloseKey.Call(
  61. uintptr(hKey))
  62. if ret != ERROR_SUCCESS {
  63. err = errors.New("RegCloseKey failed")
  64. }
  65. return err
  66. }
  67. func RegGetRaw(hKey HKEY, subKey string, value string) []byte {
  68. var bufLen uint32
  69. var valptr unsafe.Pointer
  70. if len(value) > 0 {
  71. valptr = unsafe.Pointer(syscall.StringToUTF16Ptr(value))
  72. }
  73. procRegGetValue.Call(
  74. uintptr(hKey),
  75. uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))),
  76. uintptr(valptr),
  77. uintptr(RRF_RT_ANY),
  78. 0,
  79. 0,
  80. uintptr(unsafe.Pointer(&bufLen)))
  81. if bufLen == 0 {
  82. return nil
  83. }
  84. buf := make([]byte, bufLen)
  85. ret, _, _ := procRegGetValue.Call(
  86. uintptr(hKey),
  87. uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))),
  88. uintptr(valptr),
  89. uintptr(RRF_RT_ANY),
  90. 0,
  91. uintptr(unsafe.Pointer(&buf[0])),
  92. uintptr(unsafe.Pointer(&bufLen)))
  93. if ret != ERROR_SUCCESS {
  94. return nil
  95. }
  96. return buf
  97. }
  98. func RegSetBinary(hKey HKEY, subKey string, value []byte) (errno int) {
  99. var lptr, vptr unsafe.Pointer
  100. if len(subKey) > 0 {
  101. lptr = unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))
  102. }
  103. if len(value) > 0 {
  104. vptr = unsafe.Pointer(&value[0])
  105. }
  106. ret, _, _ := procRegSetValueEx.Call(
  107. uintptr(hKey),
  108. uintptr(lptr),
  109. uintptr(0),
  110. uintptr(REG_BINARY),
  111. uintptr(vptr),
  112. uintptr(len(value)))
  113. return int(ret)
  114. }
  115. func RegGetString(hKey HKEY, subKey string, value string) string {
  116. var bufLen uint32
  117. procRegGetValue.Call(
  118. uintptr(hKey),
  119. uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))),
  120. uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(value))),
  121. uintptr(RRF_RT_REG_SZ),
  122. 0,
  123. 0,
  124. uintptr(unsafe.Pointer(&bufLen)))
  125. if bufLen == 0 {
  126. return ""
  127. }
  128. buf := make([]uint16, bufLen)
  129. ret, _, _ := procRegGetValue.Call(
  130. uintptr(hKey),
  131. uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))),
  132. uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(value))),
  133. uintptr(RRF_RT_REG_SZ),
  134. 0,
  135. uintptr(unsafe.Pointer(&buf[0])),
  136. uintptr(unsafe.Pointer(&bufLen)))
  137. if ret != ERROR_SUCCESS {
  138. return ""
  139. }
  140. return syscall.UTF16ToString(buf)
  141. }
  142. /*
  143. func RegSetKeyValue(hKey HKEY, subKey string, valueName string, dwType uint32, data uintptr, cbData uint16) (errno int) {
  144. ret, _, _ := procRegSetKeyValue.Call(
  145. uintptr(hKey),
  146. uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))),
  147. uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(valueName))),
  148. uintptr(dwType),
  149. data,
  150. uintptr(cbData))
  151. return int(ret)
  152. }
  153. */
  154. func RegEnumKeyEx(hKey HKEY, index uint32) string {
  155. var bufLen uint32 = 255
  156. buf := make([]uint16, bufLen)
  157. procRegEnumKeyEx.Call(
  158. uintptr(hKey),
  159. uintptr(index),
  160. uintptr(unsafe.Pointer(&buf[0])),
  161. uintptr(unsafe.Pointer(&bufLen)),
  162. 0,
  163. 0,
  164. 0,
  165. 0)
  166. return syscall.UTF16ToString(buf)
  167. }
  168. func OpenEventLog(servername string, sourcename string) HANDLE {
  169. ret, _, _ := procOpenEventLog.Call(
  170. uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(servername))),
  171. uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(sourcename))))
  172. return HANDLE(ret)
  173. }
  174. func ReadEventLog(eventlog HANDLE, readflags, recordoffset uint32, buffer []byte, numberofbytestoread uint32, bytesread, minnumberofbytesneeded *uint32) bool {
  175. ret, _, _ := procReadEventLog.Call(
  176. uintptr(eventlog),
  177. uintptr(readflags),
  178. uintptr(recordoffset),
  179. uintptr(unsafe.Pointer(&buffer[0])),
  180. uintptr(numberofbytestoread),
  181. uintptr(unsafe.Pointer(bytesread)),
  182. uintptr(unsafe.Pointer(minnumberofbytesneeded)))
  183. return ret != 0
  184. }
  185. func CloseEventLog(eventlog HANDLE) bool {
  186. ret, _, _ := procCloseEventLog.Call(
  187. uintptr(eventlog))
  188. return ret != 0
  189. }
  190. func OpenSCManager(lpMachineName, lpDatabaseName string, dwDesiredAccess uint32) (HANDLE, error) {
  191. var p1, p2 uintptr
  192. if len(lpMachineName) > 0 {
  193. p1 = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpMachineName)))
  194. }
  195. if len(lpDatabaseName) > 0 {
  196. p2 = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpDatabaseName)))
  197. }
  198. ret, _, _ := procOpenSCManager.Call(
  199. p1,
  200. p2,
  201. uintptr(dwDesiredAccess))
  202. if ret == 0 {
  203. return 0, syscall.GetLastError()
  204. }
  205. return HANDLE(ret), nil
  206. }
  207. func CloseServiceHandle(hSCObject HANDLE) error {
  208. ret, _, _ := procCloseServiceHandle.Call(uintptr(hSCObject))
  209. if ret == 0 {
  210. return syscall.GetLastError()
  211. }
  212. return nil
  213. }
  214. func OpenService(hSCManager HANDLE, lpServiceName string, dwDesiredAccess uint32) (HANDLE, error) {
  215. ret, _, _ := procOpenService.Call(
  216. uintptr(hSCManager),
  217. uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpServiceName))),
  218. uintptr(dwDesiredAccess))
  219. if ret == 0 {
  220. return 0, syscall.GetLastError()
  221. }
  222. return HANDLE(ret), nil
  223. }
  224. func StartService(hService HANDLE, lpServiceArgVectors []string) error {
  225. l := len(lpServiceArgVectors)
  226. var ret uintptr
  227. if l == 0 {
  228. ret, _, _ = procStartService.Call(
  229. uintptr(hService),
  230. 0,
  231. 0)
  232. } else {
  233. lpArgs := make([]uintptr, l)
  234. for i := 0; i < l; i++ {
  235. lpArgs[i] = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpServiceArgVectors[i])))
  236. }
  237. ret, _, _ = procStartService.Call(
  238. uintptr(hService),
  239. uintptr(l),
  240. uintptr(unsafe.Pointer(&lpArgs[0])))
  241. }
  242. if ret == 0 {
  243. return syscall.GetLastError()
  244. }
  245. return nil
  246. }
  247. func ControlService(hService HANDLE, dwControl uint32, lpServiceStatus *SERVICE_STATUS) bool {
  248. if lpServiceStatus == nil {
  249. panic("ControlService:lpServiceStatus cannot be nil")
  250. }
  251. ret, _, _ := procControlService.Call(
  252. uintptr(hService),
  253. uintptr(dwControl),
  254. uintptr(unsafe.Pointer(lpServiceStatus)))
  255. return ret != 0
  256. }