mirror of
https://github.com/make-42/hayai.git
synced 2025-01-18 18:47:10 +01:00
389 lines
9.9 KiB
Go
389 lines
9.9 KiB
Go
// Copyright 2010-2012 The W32 Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package w32
|
|
|
|
import (
|
|
"syscall"
|
|
"unsafe"
|
|
)
|
|
|
|
var (
|
|
modkernel32 = syscall.NewLazyDLL("kernel32.dll")
|
|
|
|
procGetModuleHandle = modkernel32.NewProc("GetModuleHandleW")
|
|
procMulDiv = modkernel32.NewProc("MulDiv")
|
|
procGetConsoleWindow = modkernel32.NewProc("GetConsoleWindow")
|
|
procGetCurrentThread = modkernel32.NewProc("GetCurrentThread")
|
|
procGetLogicalDrives = modkernel32.NewProc("GetLogicalDrives")
|
|
procGetUserDefaultLCID = modkernel32.NewProc("GetUserDefaultLCID")
|
|
procLstrlen = modkernel32.NewProc("lstrlenW")
|
|
procLstrcpy = modkernel32.NewProc("lstrcpyW")
|
|
procGlobalAlloc = modkernel32.NewProc("GlobalAlloc")
|
|
procGlobalFree = modkernel32.NewProc("GlobalFree")
|
|
procGlobalLock = modkernel32.NewProc("GlobalLock")
|
|
procGlobalUnlock = modkernel32.NewProc("GlobalUnlock")
|
|
procMoveMemory = modkernel32.NewProc("RtlMoveMemory")
|
|
procFindResource = modkernel32.NewProc("FindResourceW")
|
|
procSizeofResource = modkernel32.NewProc("SizeofResource")
|
|
procLockResource = modkernel32.NewProc("LockResource")
|
|
procLoadResource = modkernel32.NewProc("LoadResource")
|
|
procGetLastError = modkernel32.NewProc("GetLastError")
|
|
// procOpenProcess = modkernel32.NewProc("OpenProcess")
|
|
// procTerminateProcess = modkernel32.NewProc("TerminateProcess")
|
|
procCloseHandle = modkernel32.NewProc("CloseHandle")
|
|
procCreateToolhelp32Snapshot = modkernel32.NewProc("CreateToolhelp32Snapshot")
|
|
procModule32First = modkernel32.NewProc("Module32FirstW")
|
|
procModule32Next = modkernel32.NewProc("Module32NextW")
|
|
procGetSystemTimes = modkernel32.NewProc("GetSystemTimes")
|
|
procGetConsoleScreenBufferInfo = modkernel32.NewProc("GetConsoleScreenBufferInfo")
|
|
procSetConsoleTextAttribute = modkernel32.NewProc("SetConsoleTextAttribute")
|
|
procGetDiskFreeSpaceEx = modkernel32.NewProc("GetDiskFreeSpaceExW")
|
|
procGetProcessTimes = modkernel32.NewProc("GetProcessTimes")
|
|
procSetSystemTime = modkernel32.NewProc("SetSystemTime")
|
|
procGetSystemTime = modkernel32.NewProc("GetSystemTime")
|
|
procVirtualAllocEx = modkernel32.NewProc("VirtualAllocEx")
|
|
procVirtualFreeEx = modkernel32.NewProc("VirtualFreeEx")
|
|
procWriteProcessMemory = modkernel32.NewProc("WriteProcessMemory")
|
|
procReadProcessMemory = modkernel32.NewProc("ReadProcessMemory")
|
|
procQueryPerformanceCounter = modkernel32.NewProc("QueryPerformanceCounter")
|
|
procQueryPerformanceFrequency = modkernel32.NewProc("QueryPerformanceFrequency")
|
|
)
|
|
|
|
func GetModuleHandle(modulename string) HINSTANCE {
|
|
var mn uintptr
|
|
if modulename == "" {
|
|
mn = 0
|
|
} else {
|
|
mn = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(modulename)))
|
|
}
|
|
ret, _, _ := procGetModuleHandle.Call(mn)
|
|
return HINSTANCE(ret)
|
|
}
|
|
|
|
func MulDiv(number, numerator, denominator int) int {
|
|
ret, _, _ := procMulDiv.Call(
|
|
uintptr(number),
|
|
uintptr(numerator),
|
|
uintptr(denominator))
|
|
|
|
return int(ret)
|
|
}
|
|
|
|
func GetConsoleWindow() HWND {
|
|
ret, _, _ := procGetConsoleWindow.Call()
|
|
|
|
return HWND(ret)
|
|
}
|
|
|
|
func GetCurrentThread() HANDLE {
|
|
ret, _, _ := procGetCurrentThread.Call()
|
|
|
|
return HANDLE(ret)
|
|
}
|
|
|
|
func GetLogicalDrives() uint32 {
|
|
ret, _, _ := procGetLogicalDrives.Call()
|
|
|
|
return uint32(ret)
|
|
}
|
|
|
|
func GetUserDefaultLCID() uint32 {
|
|
ret, _, _ := procGetUserDefaultLCID.Call()
|
|
|
|
return uint32(ret)
|
|
}
|
|
|
|
func Lstrlen(lpString *uint16) int {
|
|
ret, _, _ := procLstrlen.Call(uintptr(unsafe.Pointer(lpString)))
|
|
|
|
return int(ret)
|
|
}
|
|
|
|
func Lstrcpy(buf []uint16, lpString *uint16) {
|
|
procLstrcpy.Call(
|
|
uintptr(unsafe.Pointer(&buf[0])),
|
|
uintptr(unsafe.Pointer(lpString)))
|
|
}
|
|
|
|
func GlobalAlloc(uFlags uint, dwBytes uint32) HGLOBAL {
|
|
ret, _, _ := procGlobalAlloc.Call(
|
|
uintptr(uFlags),
|
|
uintptr(dwBytes))
|
|
|
|
if ret == 0 {
|
|
panic("GlobalAlloc failed")
|
|
}
|
|
|
|
return HGLOBAL(ret)
|
|
}
|
|
|
|
func GlobalFree(hMem HGLOBAL) {
|
|
ret, _, _ := procGlobalFree.Call(uintptr(hMem))
|
|
|
|
if ret != 0 {
|
|
panic("GlobalFree failed")
|
|
}
|
|
}
|
|
|
|
func GlobalLock(hMem HGLOBAL) unsafe.Pointer {
|
|
ret, _, _ := procGlobalLock.Call(uintptr(hMem))
|
|
|
|
if ret == 0 {
|
|
panic("GlobalLock failed")
|
|
}
|
|
|
|
return unsafe.Pointer(ret)
|
|
}
|
|
|
|
func GlobalUnlock(hMem HGLOBAL) bool {
|
|
ret, _, _ := procGlobalUnlock.Call(uintptr(hMem))
|
|
|
|
return ret != 0
|
|
}
|
|
|
|
func MoveMemory(destination, source unsafe.Pointer, length uint32) {
|
|
procMoveMemory.Call(
|
|
uintptr(unsafe.Pointer(destination)),
|
|
uintptr(source),
|
|
uintptr(length))
|
|
}
|
|
|
|
func FindResource(hModule HMODULE, lpName, lpType *uint16) (HRSRC, error) {
|
|
ret, _, _ := procFindResource.Call(
|
|
uintptr(hModule),
|
|
uintptr(unsafe.Pointer(lpName)),
|
|
uintptr(unsafe.Pointer(lpType)))
|
|
|
|
if ret == 0 {
|
|
return 0, syscall.GetLastError()
|
|
}
|
|
|
|
return HRSRC(ret), nil
|
|
}
|
|
|
|
func SizeofResource(hModule HMODULE, hResInfo HRSRC) uint32 {
|
|
ret, _, _ := procSizeofResource.Call(
|
|
uintptr(hModule),
|
|
uintptr(hResInfo))
|
|
|
|
if ret == 0 {
|
|
panic("SizeofResource failed")
|
|
}
|
|
|
|
return uint32(ret)
|
|
}
|
|
|
|
func LockResource(hResData HGLOBAL) unsafe.Pointer {
|
|
ret, _, _ := procLockResource.Call(uintptr(hResData))
|
|
|
|
if ret == 0 {
|
|
panic("LockResource failed")
|
|
}
|
|
|
|
return unsafe.Pointer(ret)
|
|
}
|
|
|
|
func LoadResource(hModule HMODULE, hResInfo HRSRC) HGLOBAL {
|
|
ret, _, _ := procLoadResource.Call(
|
|
uintptr(hModule),
|
|
uintptr(hResInfo))
|
|
|
|
if ret == 0 {
|
|
panic("LoadResource failed")
|
|
}
|
|
|
|
return HGLOBAL(ret)
|
|
}
|
|
|
|
func GetLastError() uint32 {
|
|
ret, _, _ := procGetLastError.Call()
|
|
return uint32(ret)
|
|
}
|
|
|
|
// func OpenProcess(desiredAccess uint32, inheritHandle bool, processId uint32) HANDLE {
|
|
// inherit := 0
|
|
// if inheritHandle {
|
|
// inherit = 1
|
|
// }
|
|
|
|
// ret, _, _ := procOpenProcess.Call(
|
|
// uintptr(desiredAccess),
|
|
// uintptr(inherit),
|
|
// uintptr(processId))
|
|
// return HANDLE(ret)
|
|
// }
|
|
|
|
// func TerminateProcess(hProcess HANDLE, uExitCode uint) bool {
|
|
// ret, _, _ := procTerminateProcess.Call(
|
|
// uintptr(hProcess),
|
|
// uintptr(uExitCode))
|
|
// return ret != 0
|
|
// }
|
|
|
|
func CloseHandle(object HANDLE) bool {
|
|
ret, _, _ := procCloseHandle.Call(
|
|
uintptr(object))
|
|
return ret != 0
|
|
}
|
|
|
|
func CreateToolhelp32Snapshot(flags, processId uint32) HANDLE {
|
|
ret, _, _ := procCreateToolhelp32Snapshot.Call(
|
|
uintptr(flags),
|
|
uintptr(processId))
|
|
|
|
if ret <= 0 {
|
|
return HANDLE(0)
|
|
}
|
|
|
|
return HANDLE(ret)
|
|
}
|
|
|
|
func Module32First(snapshot HANDLE, me *MODULEENTRY32) bool {
|
|
ret, _, _ := procModule32First.Call(
|
|
uintptr(snapshot),
|
|
uintptr(unsafe.Pointer(me)))
|
|
|
|
return ret != 0
|
|
}
|
|
|
|
func Module32Next(snapshot HANDLE, me *MODULEENTRY32) bool {
|
|
ret, _, _ := procModule32Next.Call(
|
|
uintptr(snapshot),
|
|
uintptr(unsafe.Pointer(me)))
|
|
|
|
return ret != 0
|
|
}
|
|
|
|
func GetSystemTimes(lpIdleTime, lpKernelTime, lpUserTime *FILETIME) bool {
|
|
ret, _, _ := procGetSystemTimes.Call(
|
|
uintptr(unsafe.Pointer(lpIdleTime)),
|
|
uintptr(unsafe.Pointer(lpKernelTime)),
|
|
uintptr(unsafe.Pointer(lpUserTime)))
|
|
|
|
return ret != 0
|
|
}
|
|
|
|
func GetProcessTimes(hProcess HANDLE, lpCreationTime, lpExitTime, lpKernelTime, lpUserTime *FILETIME) bool {
|
|
ret, _, _ := procGetProcessTimes.Call(
|
|
uintptr(hProcess),
|
|
uintptr(unsafe.Pointer(lpCreationTime)),
|
|
uintptr(unsafe.Pointer(lpExitTime)),
|
|
uintptr(unsafe.Pointer(lpKernelTime)),
|
|
uintptr(unsafe.Pointer(lpUserTime)))
|
|
|
|
return ret != 0
|
|
}
|
|
|
|
func GetConsoleScreenBufferInfo(hConsoleOutput HANDLE) *CONSOLE_SCREEN_BUFFER_INFO {
|
|
var csbi CONSOLE_SCREEN_BUFFER_INFO
|
|
ret, _, _ := procGetConsoleScreenBufferInfo.Call(
|
|
uintptr(hConsoleOutput),
|
|
uintptr(unsafe.Pointer(&csbi)))
|
|
if ret == 0 {
|
|
return nil
|
|
}
|
|
return &csbi
|
|
}
|
|
|
|
func SetConsoleTextAttribute(hConsoleOutput HANDLE, wAttributes uint16) bool {
|
|
ret, _, _ := procSetConsoleTextAttribute.Call(
|
|
uintptr(hConsoleOutput),
|
|
uintptr(wAttributes))
|
|
return ret != 0
|
|
}
|
|
|
|
func GetDiskFreeSpaceEx(dirName string) (r bool,
|
|
freeBytesAvailable, totalNumberOfBytes, totalNumberOfFreeBytes uint64) {
|
|
ret, _, _ := procGetDiskFreeSpaceEx.Call(
|
|
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(dirName))),
|
|
uintptr(unsafe.Pointer(&freeBytesAvailable)),
|
|
uintptr(unsafe.Pointer(&totalNumberOfBytes)),
|
|
uintptr(unsafe.Pointer(&totalNumberOfFreeBytes)))
|
|
return ret != 0,
|
|
freeBytesAvailable, totalNumberOfBytes, totalNumberOfFreeBytes
|
|
}
|
|
|
|
func GetSystemTime() *SYSTEMTIME {
|
|
var time SYSTEMTIME
|
|
procGetSystemTime.Call(
|
|
uintptr(unsafe.Pointer(&time)))
|
|
return &time
|
|
}
|
|
|
|
func SetSystemTime(time *SYSTEMTIME) bool {
|
|
ret, _, _ := procSetSystemTime.Call(
|
|
uintptr(unsafe.Pointer(time)))
|
|
return ret != 0
|
|
}
|
|
|
|
func VirtualAllocEx(hProcess HANDLE, lpAddress, dwSize uintptr, flAllocationType, flProtect uint32) uintptr {
|
|
ret, _, _ := procVirtualAllocEx.Call(
|
|
uintptr(hProcess),
|
|
lpAddress,
|
|
dwSize,
|
|
uintptr(flAllocationType),
|
|
uintptr(flProtect),
|
|
)
|
|
|
|
return ret
|
|
}
|
|
|
|
func VirtualFreeEx(hProcess HANDLE, lpAddress, dwSize uintptr, dwFreeType uint32) bool {
|
|
ret, _, _ := procVirtualFreeEx.Call(
|
|
uintptr(hProcess),
|
|
lpAddress,
|
|
dwSize,
|
|
uintptr(dwFreeType),
|
|
)
|
|
|
|
return ret != 0
|
|
}
|
|
|
|
func WriteProcessMemory(hProcess HANDLE, lpBaseAddress, lpBuffer, nSize uintptr) (int, bool) {
|
|
var nBytesWritten int
|
|
ret, _, _ := procWriteProcessMemory.Call(
|
|
uintptr(hProcess),
|
|
lpBaseAddress,
|
|
lpBuffer,
|
|
nSize,
|
|
uintptr(unsafe.Pointer(&nBytesWritten)),
|
|
)
|
|
|
|
return nBytesWritten, ret != 0
|
|
}
|
|
|
|
func ReadProcessMemory(hProcess HANDLE, lpBaseAddress, nSize uintptr) (lpBuffer []uint16, lpNumberOfBytesRead int, ok bool) {
|
|
|
|
var nBytesRead int
|
|
buf := make([]uint16, nSize)
|
|
ret, _, _ := procReadProcessMemory.Call(
|
|
uintptr(hProcess),
|
|
lpBaseAddress,
|
|
uintptr(unsafe.Pointer(&buf[0])),
|
|
nSize,
|
|
uintptr(unsafe.Pointer(&nBytesRead)),
|
|
)
|
|
|
|
return buf, nBytesRead, ret != 0
|
|
}
|
|
|
|
func QueryPerformanceCounter() uint64 {
|
|
result := uint64(0)
|
|
procQueryPerformanceCounter.Call(
|
|
uintptr(unsafe.Pointer(&result)),
|
|
)
|
|
|
|
return result
|
|
}
|
|
|
|
func QueryPerformanceFrequency() uint64 {
|
|
result := uint64(0)
|
|
procQueryPerformanceFrequency.Call(
|
|
uintptr(unsafe.Pointer(&result)),
|
|
)
|
|
|
|
return result
|
|
}
|