kernel32.go 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  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. "syscall"
  8. "unsafe"
  9. )
  10. var (
  11. modkernel32 = syscall.NewLazyDLL("kernel32.dll")
  12. procGetModuleHandle = modkernel32.NewProc("GetModuleHandleW")
  13. procMulDiv = modkernel32.NewProc("MulDiv")
  14. procGetConsoleWindow = modkernel32.NewProc("GetConsoleWindow")
  15. procGetCurrentThread = modkernel32.NewProc("GetCurrentThread")
  16. procGetLogicalDrives = modkernel32.NewProc("GetLogicalDrives")
  17. procGetUserDefaultLCID = modkernel32.NewProc("GetUserDefaultLCID")
  18. procLstrlen = modkernel32.NewProc("lstrlenW")
  19. procLstrcpy = modkernel32.NewProc("lstrcpyW")
  20. procGlobalAlloc = modkernel32.NewProc("GlobalAlloc")
  21. procGlobalFree = modkernel32.NewProc("GlobalFree")
  22. procGlobalLock = modkernel32.NewProc("GlobalLock")
  23. procGlobalUnlock = modkernel32.NewProc("GlobalUnlock")
  24. procMoveMemory = modkernel32.NewProc("RtlMoveMemory")
  25. procFindResource = modkernel32.NewProc("FindResourceW")
  26. procSizeofResource = modkernel32.NewProc("SizeofResource")
  27. procLockResource = modkernel32.NewProc("LockResource")
  28. procLoadResource = modkernel32.NewProc("LoadResource")
  29. procGetLastError = modkernel32.NewProc("GetLastError")
  30. procOpenProcess = modkernel32.NewProc("OpenProcess")
  31. procTerminateProcess = modkernel32.NewProc("TerminateProcess")
  32. procCloseHandle = modkernel32.NewProc("CloseHandle")
  33. procCreateToolhelp32Snapshot = modkernel32.NewProc("CreateToolhelp32Snapshot")
  34. procModule32First = modkernel32.NewProc("Module32FirstW")
  35. procModule32Next = modkernel32.NewProc("Module32NextW")
  36. procProcess32First = modkernel32.NewProc("Process32FirstW")
  37. procProcess32Next = modkernel32.NewProc("Process32NextW")
  38. procGetSystemTimes = modkernel32.NewProc("GetSystemTimes")
  39. procGetConsoleScreenBufferInfo = modkernel32.NewProc("GetConsoleScreenBufferInfo")
  40. procSetConsoleTextAttribute = modkernel32.NewProc("SetConsoleTextAttribute")
  41. procGetDiskFreeSpaceEx = modkernel32.NewProc("GetDiskFreeSpaceExW")
  42. procGetProcessTimes = modkernel32.NewProc("GetProcessTimes")
  43. )
  44. func GetModuleHandle(modulename string) HINSTANCE {
  45. var mn uintptr
  46. if modulename == "" {
  47. mn = 0
  48. } else {
  49. mn = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(modulename)))
  50. }
  51. ret, _, _ := procGetModuleHandle.Call(mn)
  52. return HINSTANCE(ret)
  53. }
  54. func MulDiv(number, numerator, denominator int) int {
  55. ret, _, _ := procMulDiv.Call(
  56. uintptr(number),
  57. uintptr(numerator),
  58. uintptr(denominator))
  59. return int(ret)
  60. }
  61. func GetConsoleWindow() HWND {
  62. ret, _, _ := procGetConsoleWindow.Call()
  63. return HWND(ret)
  64. }
  65. func GetCurrentThread() HANDLE {
  66. ret, _, _ := procGetCurrentThread.Call()
  67. return HANDLE(ret)
  68. }
  69. func GetLogicalDrives() uint32 {
  70. ret, _, _ := procGetLogicalDrives.Call()
  71. return uint32(ret)
  72. }
  73. func GetUserDefaultLCID() uint32 {
  74. ret, _, _ := procGetUserDefaultLCID.Call()
  75. return uint32(ret)
  76. }
  77. func Lstrlen(lpString *uint16) int {
  78. ret, _, _ := procLstrlen.Call(uintptr(unsafe.Pointer(lpString)))
  79. return int(ret)
  80. }
  81. func Lstrcpy(buf []uint16, lpString *uint16) {
  82. procLstrcpy.Call(
  83. uintptr(unsafe.Pointer(&buf[0])),
  84. uintptr(unsafe.Pointer(lpString)))
  85. }
  86. func GlobalAlloc(uFlags uint, dwBytes uint32) HGLOBAL {
  87. ret, _, _ := procGlobalAlloc.Call(
  88. uintptr(uFlags),
  89. uintptr(dwBytes))
  90. if ret == 0 {
  91. panic("GlobalAlloc failed")
  92. }
  93. return HGLOBAL(ret)
  94. }
  95. func GlobalFree(hMem HGLOBAL) {
  96. ret, _, _ := procGlobalFree.Call(uintptr(hMem))
  97. if ret != 0 {
  98. panic("GlobalFree failed")
  99. }
  100. }
  101. func GlobalLock(hMem HGLOBAL) unsafe.Pointer {
  102. ret, _, _ := procGlobalLock.Call(uintptr(hMem))
  103. if ret == 0 {
  104. panic("GlobalLock failed")
  105. }
  106. return unsafe.Pointer(ret)
  107. }
  108. func GlobalUnlock(hMem HGLOBAL) bool {
  109. ret, _, _ := procGlobalUnlock.Call(uintptr(hMem))
  110. return ret != 0
  111. }
  112. func MoveMemory(destination, source unsafe.Pointer, length uint32) {
  113. procMoveMemory.Call(
  114. uintptr(unsafe.Pointer(destination)),
  115. uintptr(source),
  116. uintptr(length))
  117. }
  118. func FindResource(hModule HMODULE, lpName, lpType *uint16) (HRSRC, error) {
  119. ret, _, _ := procFindResource.Call(
  120. uintptr(hModule),
  121. uintptr(unsafe.Pointer(lpName)),
  122. uintptr(unsafe.Pointer(lpType)))
  123. if ret == 0 {
  124. return 0, syscall.GetLastError()
  125. }
  126. return HRSRC(ret), nil
  127. }
  128. func SizeofResource(hModule HMODULE, hResInfo HRSRC) uint32 {
  129. ret, _, _ := procSizeofResource.Call(
  130. uintptr(hModule),
  131. uintptr(hResInfo))
  132. if ret == 0 {
  133. panic("SizeofResource failed")
  134. }
  135. return uint32(ret)
  136. }
  137. func LockResource(hResData HGLOBAL) unsafe.Pointer {
  138. ret, _, _ := procLockResource.Call(uintptr(hResData))
  139. if ret == 0 {
  140. panic("LockResource failed")
  141. }
  142. return unsafe.Pointer(ret)
  143. }
  144. func LoadResource(hModule HMODULE, hResInfo HRSRC) HGLOBAL {
  145. ret, _, _ := procLoadResource.Call(
  146. uintptr(hModule),
  147. uintptr(hResInfo))
  148. if ret == 0 {
  149. panic("LoadResource failed")
  150. }
  151. return HGLOBAL(ret)
  152. }
  153. func GetLastError() uint32 {
  154. ret, _, _ := procGetLastError.Call()
  155. return uint32(ret)
  156. }
  157. func OpenProcess(desiredAccess uint32, inheritHandle bool, processId uint32) HANDLE {
  158. inherit := 0
  159. if inheritHandle {
  160. inherit = 1
  161. }
  162. ret, _, _ := procOpenProcess.Call(
  163. uintptr(desiredAccess),
  164. uintptr(inherit),
  165. uintptr(processId))
  166. return HANDLE(ret)
  167. }
  168. func TerminateProcess(hProcess HANDLE, uExitCode uint) bool {
  169. ret, _, _ := procTerminateProcess.Call(
  170. uintptr(hProcess),
  171. uintptr(uExitCode))
  172. return ret != 0
  173. }
  174. func CloseHandle(object HANDLE) bool {
  175. ret, _, _ := procCloseHandle.Call(
  176. uintptr(object))
  177. return ret != 0
  178. }
  179. func CreateToolhelp32Snapshot(flags, processId uint32) HANDLE {
  180. ret, _, _ := procCreateToolhelp32Snapshot.Call(
  181. uintptr(flags),
  182. uintptr(processId))
  183. if ret <= 0 {
  184. return HANDLE(0)
  185. }
  186. return HANDLE(ret)
  187. }
  188. func Module32First(snapshot HANDLE, me *MODULEENTRY32) bool {
  189. ret, _, _ := procModule32First.Call(
  190. uintptr(snapshot),
  191. uintptr(unsafe.Pointer(me)))
  192. return ret != 0
  193. }
  194. func Module32Next(snapshot HANDLE, me *MODULEENTRY32) bool {
  195. ret, _, _ := procModule32Next.Call(
  196. uintptr(snapshot),
  197. uintptr(unsafe.Pointer(me)))
  198. return ret != 0
  199. }
  200. func Process32First(snapshot HANDLE, pe *PROCESSENTRY32) bool {
  201. ret, _, _ := procProcess32First.Call(
  202. uintptr(snapshot),
  203. uintptr(unsafe.Pointer(pe)))
  204. return ret != 0
  205. }
  206. func Process32Next(snapshot HANDLE, pe *PROCESSENTRY32) bool {
  207. ret, _, _ := procProcess32Next.Call(
  208. uintptr(snapshot),
  209. uintptr(unsafe.Pointer(pe)))
  210. return ret != 0
  211. }
  212. func GetSystemTimes(lpIdleTime, lpKernelTime, lpUserTime *FILETIME) bool {
  213. ret, _, _ := procGetSystemTimes.Call(
  214. uintptr(unsafe.Pointer(lpIdleTime)),
  215. uintptr(unsafe.Pointer(lpKernelTime)),
  216. uintptr(unsafe.Pointer(lpUserTime)))
  217. return ret != 0
  218. }
  219. func GetProcessTimes(hProcess HANDLE, lpCreationTime, lpExitTime, lpKernelTime, lpUserTime *FILETIME) bool {
  220. ret, _, _ := procGetProcessTimes.Call(
  221. uintptr(hProcess),
  222. uintptr(unsafe.Pointer(lpCreationTime)),
  223. uintptr(unsafe.Pointer(lpExitTime)),
  224. uintptr(unsafe.Pointer(lpKernelTime)),
  225. uintptr(unsafe.Pointer(lpUserTime)))
  226. return ret != 0
  227. }
  228. func GetConsoleScreenBufferInfo(hConsoleOutput HANDLE) *CONSOLE_SCREEN_BUFFER_INFO {
  229. var csbi CONSOLE_SCREEN_BUFFER_INFO
  230. ret, _, _ := procGetConsoleScreenBufferInfo.Call(
  231. uintptr(hConsoleOutput),
  232. uintptr(unsafe.Pointer(&csbi)))
  233. if ret == 0 {
  234. return nil
  235. }
  236. return &csbi
  237. }
  238. func SetConsoleTextAttribute(hConsoleOutput HANDLE, wAttributes uint16) bool {
  239. ret, _, _ := procSetConsoleTextAttribute.Call(
  240. uintptr(hConsoleOutput),
  241. uintptr(wAttributes))
  242. return ret != 0
  243. }
  244. func GetDiskFreeSpaceEx(dirName string) (r bool,
  245. freeBytesAvailable, totalNumberOfBytes, totalNumberOfFreeBytes uint64) {
  246. ret, _, _ := procGetDiskFreeSpaceEx.Call(
  247. uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(dirName))),
  248. uintptr(unsafe.Pointer(&freeBytesAvailable)),
  249. uintptr(unsafe.Pointer(&totalNumberOfBytes)),
  250. uintptr(unsafe.Pointer(&totalNumberOfFreeBytes)))
  251. return ret != 0,
  252. freeBytesAvailable, totalNumberOfBytes, totalNumberOfFreeBytes
  253. }