mirror of
https://github.com/stashapp/stash.git
synced 2025-12-06 16:34:02 +01:00
Improve Windows stash behaviour (#2543)
* Rename manager.instance to Manager * Show dialog message on fatal error on Windows * Hide console windows explicitly on icon launch Gets rid of the windowsgui flag, which causes all sorts of issues. Instead, checks if stash was launched from the icon, and if so hides the console. * Remove fixconsole * Add changelog entries
This commit is contained in:
parent
36aa51a187
commit
a6f15273d9
55 changed files with 262 additions and 9187 deletions
6
Makefile
6
Makefile
|
|
@ -50,12 +50,6 @@ ifndef OFFICIAL_BUILD
|
||||||
$(eval OFFICIAL_BUILD := false)
|
$(eval OFFICIAL_BUILD := false)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef IS_WIN_OS
|
|
||||||
ifndef SUPPRESS_WINDOWSGUI
|
|
||||||
PLATFORM_SPECIFIC_LDFLAGS := -H windowsgui
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
build: pre-build
|
build: pre-build
|
||||||
build:
|
build:
|
||||||
$(eval LDFLAGS := $(LDFLAGS) -X 'github.com/stashapp/stash/internal/api.version=$(STASH_VERSION)' -X 'github.com/stashapp/stash/internal/api.buildstamp=$(BUILD_DATE)' -X 'github.com/stashapp/stash/internal/api.githash=$(GITHASH)')
|
$(eval LDFLAGS := $(LDFLAGS) -X 'github.com/stashapp/stash/internal/api.version=$(STASH_VERSION)' -X 'github.com/stashapp/stash/internal/api.buildstamp=$(BUILD_DATE)' -X 'github.com/stashapp/stash/internal/api.githash=$(GITHASH)')
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,6 @@ import (
|
||||||
"os/signal"
|
"os/signal"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
"github.com/apenwarr/fixconsole"
|
|
||||||
"github.com/stashapp/stash/internal/api"
|
"github.com/stashapp/stash/internal/api"
|
||||||
"github.com/stashapp/stash/internal/desktop"
|
"github.com/stashapp/stash/internal/desktop"
|
||||||
"github.com/stashapp/stash/internal/manager"
|
"github.com/stashapp/stash/internal/manager"
|
||||||
|
|
@ -17,17 +16,22 @@ import (
|
||||||
_ "github.com/golang-migrate/migrate/v4/source/file"
|
_ "github.com/golang-migrate/migrate/v4/source/file"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
|
||||||
// On Windows, attach to parent shell
|
|
||||||
err := fixconsole.FixConsoleIfNeeded()
|
|
||||||
if err != nil {
|
|
||||||
fmt.Printf("FixConsoleOutput: %v\n", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
manager.Initialize()
|
defer recoverPanic()
|
||||||
api.Start()
|
|
||||||
|
_, err := manager.Initialize()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
defer recoverPanic()
|
||||||
|
if err := api.Start(); err != nil {
|
||||||
|
handleError(err)
|
||||||
|
} else {
|
||||||
|
manager.GetInstance().Shutdown(0)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
go handleSignals()
|
go handleSignals()
|
||||||
desktop.Start(manager.GetInstance(), &manager.FaviconProvider{UIBox: ui.UIBox})
|
desktop.Start(manager.GetInstance(), &manager.FaviconProvider{UIBox: ui.UIBox})
|
||||||
|
|
@ -35,6 +39,22 @@ func main() {
|
||||||
blockForever()
|
blockForever()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func recoverPanic() {
|
||||||
|
if p := recover(); p != nil {
|
||||||
|
handleError(fmt.Errorf("Panic: %v", p))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func handleError(err error) {
|
||||||
|
desktop.FatalError(err)
|
||||||
|
|
||||||
|
if desktop.IsDesktop() {
|
||||||
|
manager.GetInstance().Shutdown(0)
|
||||||
|
} else {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func handleSignals() {
|
func handleSignals() {
|
||||||
// handle signals
|
// handle signals
|
||||||
signals := make(chan os.Signal, 1)
|
signals := make(chan os.Signal, 1)
|
||||||
|
|
|
||||||
2
go.mod
2
go.mod
|
|
@ -46,7 +46,6 @@ require (
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/apenwarr/fixconsole v0.0.0-20191012055117-5a9f6489cc29
|
|
||||||
github.com/go-chi/httplog v0.2.1
|
github.com/go-chi/httplog v0.2.1
|
||||||
github.com/go-toast/toast v0.0.0-20190211030409-01e6764cf0a4
|
github.com/go-toast/toast v0.0.0-20190211030409-01e6764cf0a4
|
||||||
github.com/hashicorp/golang-lru v0.5.4
|
github.com/hashicorp/golang-lru v0.5.4
|
||||||
|
|
@ -60,7 +59,6 @@ require (
|
||||||
require (
|
require (
|
||||||
github.com/agnivade/levenshtein v1.1.1 // indirect
|
github.com/agnivade/levenshtein v1.1.1 // indirect
|
||||||
github.com/antchfx/xpath v1.2.0 // indirect
|
github.com/antchfx/xpath v1.2.0 // indirect
|
||||||
github.com/apenwarr/w32 v0.0.0-20190407065021-aa00fece76ab // indirect
|
|
||||||
github.com/chromedp/sysutil v1.0.0 // indirect
|
github.com/chromedp/sysutil v1.0.0 // indirect
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.1 // indirect
|
github.com/cpuguy83/go-md2man/v2 v2.0.1 // indirect
|
||||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
|
|
|
||||||
5
go.sum
5
go.sum
|
|
@ -97,10 +97,6 @@ github.com/antchfx/xpath v1.2.0/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwq
|
||||||
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
|
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
|
||||||
github.com/apache/arrow/go/arrow v0.0.0-20200601151325-b2287a20f230/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0=
|
github.com/apache/arrow/go/arrow v0.0.0-20200601151325-b2287a20f230/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0=
|
||||||
github.com/apache/arrow/go/arrow v0.0.0-20210521153258-78c88a9f517b/go.mod h1:R4hW3Ug0s+n4CUsWHKOj00Pu01ZqU4x/hSF5kXUcXKQ=
|
github.com/apache/arrow/go/arrow v0.0.0-20210521153258-78c88a9f517b/go.mod h1:R4hW3Ug0s+n4CUsWHKOj00Pu01ZqU4x/hSF5kXUcXKQ=
|
||||||
github.com/apenwarr/fixconsole v0.0.0-20191012055117-5a9f6489cc29 h1:muXWUcay7DDy1/hEQWrYlBy+g0EuwT70sBHg65SeUc4=
|
|
||||||
github.com/apenwarr/fixconsole v0.0.0-20191012055117-5a9f6489cc29/go.mod h1:JYWahgHer+Z2xbsgHPtaDYVWzeHDminu+YIBWkxpCAY=
|
|
||||||
github.com/apenwarr/w32 v0.0.0-20190407065021-aa00fece76ab h1:CMGzRRCjnD50RjUFSArBLuCxiDvdp7b8YPAcikBEQ+k=
|
|
||||||
github.com/apenwarr/w32 v0.0.0-20190407065021-aa00fece76ab/go.mod h1:nfFtvHn2Hgs9G1u0/J6LHQv//EksNC+7G8vXmd1VTJ8=
|
|
||||||
github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q=
|
github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q=
|
||||||
github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE=
|
github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE=
|
||||||
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
|
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
|
||||||
|
|
@ -955,7 +951,6 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h
|
||||||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190415145633-3fd5a3612ccd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190415145633-3fd5a3612ccd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@ var githash string
|
||||||
var uiBox = ui.UIBox
|
var uiBox = ui.UIBox
|
||||||
var loginUIBox = ui.LoginUIBox
|
var loginUIBox = ui.LoginUIBox
|
||||||
|
|
||||||
func Start() {
|
func Start() error {
|
||||||
initialiseImages()
|
initialiseImages()
|
||||||
|
|
||||||
r := chi.NewRouter()
|
r := chi.NewRouter()
|
||||||
|
|
@ -263,16 +263,18 @@ func Start() {
|
||||||
displayAddress = "http://" + displayAddress + "/"
|
displayAddress = "http://" + displayAddress + "/"
|
||||||
}
|
}
|
||||||
|
|
||||||
go func() {
|
logger.Infof("stash is running at " + displayAddress)
|
||||||
if tlsConfig != nil {
|
if tlsConfig != nil {
|
||||||
logger.Infof("stash is running at " + displayAddress)
|
err = server.ListenAndServeTLS("", "")
|
||||||
logger.Error(server.ListenAndServeTLS("", ""))
|
|
||||||
} else {
|
} else {
|
||||||
logger.Infof("stash is running at " + displayAddress)
|
err = server.ListenAndServe()
|
||||||
logger.Error(server.ListenAndServe())
|
|
||||||
}
|
}
|
||||||
manager.GetInstance().Shutdown(0)
|
|
||||||
}()
|
if !errors.Is(err, http.ErrServerClosed) {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func printVersion() {
|
func printVersion() {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
package desktop
|
package desktop
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
|
|
@ -29,6 +30,8 @@ type FaviconProvider interface {
|
||||||
// MUST be run on the main goroutine or will have no effect on macOS
|
// MUST be run on the main goroutine or will have no effect on macOS
|
||||||
func Start(shutdownHandler ShutdownHandler, faviconProvider FaviconProvider) {
|
func Start(shutdownHandler ShutdownHandler, faviconProvider FaviconProvider) {
|
||||||
if IsDesktop() {
|
if IsDesktop() {
|
||||||
|
hideConsole()
|
||||||
|
|
||||||
c := config.GetInstance()
|
c := config.GetInstance()
|
||||||
if !c.GetNoBrowser() {
|
if !c.GetNoBrowser() {
|
||||||
openURLInBrowser("")
|
openURLInBrowser("")
|
||||||
|
|
@ -60,6 +63,11 @@ func SendNotification(title string, text string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func IsDesktop() bool {
|
func IsDesktop() bool {
|
||||||
|
if isDoubleClickLaunched() {
|
||||||
|
fmt.Println("double click launched")
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
// Check if running under root
|
// Check if running under root
|
||||||
if os.Getuid() == 0 {
|
if os.Getuid() == 0 {
|
||||||
return false
|
return false
|
||||||
|
|
|
||||||
|
|
@ -34,3 +34,11 @@ func sendNotification(notificationTitle string, notificationText string) {
|
||||||
func revealInFileManager(path string) {
|
func revealInFileManager(path string) {
|
||||||
exec.Command(`open`, `-R`, path)
|
exec.Command(`open`, `-R`, path)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func isDoubleClickLaunched() bool {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func hideConsole() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -37,3 +37,11 @@ func sendNotification(notificationTitle string, notificationText string) {
|
||||||
func revealInFileManager(path string) {
|
func revealInFileManager(path string) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func isDoubleClickLaunched() bool {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func hideConsole() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,12 +5,19 @@ package desktop
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"os/exec"
|
"os/exec"
|
||||||
|
"syscall"
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
"github.com/go-toast/toast"
|
"github.com/go-toast/toast"
|
||||||
"github.com/stashapp/stash/pkg/logger"
|
"github.com/stashapp/stash/pkg/logger"
|
||||||
"golang.org/x/sys/windows/svc"
|
"golang.org/x/sys/windows/svc"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
kernel32 = syscall.NewLazyDLL("kernel32.dll")
|
||||||
|
user32 = syscall.NewLazyDLL("user32.dll")
|
||||||
|
)
|
||||||
|
|
||||||
func isService() bool {
|
func isService() bool {
|
||||||
result, err := svc.IsWindowsService()
|
result, err := svc.IsWindowsService()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -20,6 +27,40 @@ func isService() bool {
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Detect if windows golang executable file is running via double click or from cmd/shell terminator
|
||||||
|
// https://stackoverflow.com/questions/8610489/distinguish-if-program-runs-by-clicking-on-the-icon-typing-its-name-in-the-cons?rq=1
|
||||||
|
// https://github.com/shirou/w32/blob/master/kernel32.go
|
||||||
|
// https://github.com/kbinani/win/blob/master/kernel32.go#L3268
|
||||||
|
// win.GetConsoleProcessList(new(uint32), win.DWORD(2))
|
||||||
|
// from https://gist.github.com/yougg/213250cc04a52e2b853590b06f49d865
|
||||||
|
func isDoubleClickLaunched() bool {
|
||||||
|
lp := kernel32.NewProc("GetConsoleProcessList")
|
||||||
|
if lp != nil {
|
||||||
|
var pids [2]uint32
|
||||||
|
var maxCount uint32 = 2
|
||||||
|
ret, _, _ := lp.Call(uintptr(unsafe.Pointer(&pids)), uintptr(maxCount))
|
||||||
|
if ret > 1 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func hideConsole() {
|
||||||
|
const SW_HIDE = 0
|
||||||
|
h := getConsoleWindow()
|
||||||
|
lp := user32.NewProc("ShowWindow")
|
||||||
|
|
||||||
|
// don't want to check for errors and can't prevent dogsled
|
||||||
|
_, _, _ = lp.Call(h, SW_HIDE) //nolint:dogsled
|
||||||
|
}
|
||||||
|
|
||||||
|
func getConsoleWindow() uintptr {
|
||||||
|
lp := kernel32.NewProc("GetConsoleWindow")
|
||||||
|
ret, _, _ := lp.Call()
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
func isServerDockerized() bool {
|
func isServerDockerized() bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
|
||||||
9
internal/desktop/dialog_nonwindows.go
Normal file
9
internal/desktop/dialog_nonwindows.go
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
//go:build !windows
|
||||||
|
// +build !windows
|
||||||
|
|
||||||
|
package desktop
|
||||||
|
|
||||||
|
func FatalError(err error) int {
|
||||||
|
// nothing to do
|
||||||
|
return 0
|
||||||
|
}
|
||||||
33
internal/desktop/dialog_windows.go
Normal file
33
internal/desktop/dialog_windows.go
Normal file
|
|
@ -0,0 +1,33 @@
|
||||||
|
//go:build windows
|
||||||
|
// +build windows
|
||||||
|
|
||||||
|
package desktop
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"syscall"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
func FatalError(err error) int {
|
||||||
|
const (
|
||||||
|
NULL = 0
|
||||||
|
MB_OK = 0
|
||||||
|
MB_ICONERROR = 0x10
|
||||||
|
)
|
||||||
|
|
||||||
|
return messageBox(NULL, fmt.Sprintf("Error: %v", err), "Stash - Fatal Error", MB_OK|MB_ICONERROR)
|
||||||
|
}
|
||||||
|
|
||||||
|
func messageBox(hwnd uintptr, caption, title string, flags uint) int {
|
||||||
|
lpText, _ := syscall.UTF16PtrFromString(caption)
|
||||||
|
lpCaption, _ := syscall.UTF16PtrFromString(title)
|
||||||
|
|
||||||
|
ret, _, _ := syscall.NewLazyDLL("user32.dll").NewProc("MessageBoxW").Call(
|
||||||
|
uintptr(hwnd),
|
||||||
|
uintptr(unsafe.Pointer(lpText)),
|
||||||
|
uintptr(unsafe.Pointer(lpCaption)),
|
||||||
|
uintptr(flags))
|
||||||
|
|
||||||
|
return int(ret)
|
||||||
|
}
|
||||||
|
|
@ -31,7 +31,7 @@ import (
|
||||||
"github.com/stashapp/stash/ui"
|
"github.com/stashapp/stash/ui"
|
||||||
)
|
)
|
||||||
|
|
||||||
type singleton struct {
|
type Manager struct {
|
||||||
Config *config.Instance
|
Config *config.Instance
|
||||||
Logger *log.Logger
|
Logger *log.Logger
|
||||||
|
|
||||||
|
|
@ -58,27 +58,37 @@ type singleton struct {
|
||||||
scanSubs *subscriptionManager
|
scanSubs *subscriptionManager
|
||||||
}
|
}
|
||||||
|
|
||||||
var instance *singleton
|
var instance *Manager
|
||||||
var once sync.Once
|
var once sync.Once
|
||||||
|
|
||||||
func GetInstance() *singleton {
|
func GetInstance() *Manager {
|
||||||
Initialize()
|
if _, err := Initialize(); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
return instance
|
return instance
|
||||||
}
|
}
|
||||||
|
|
||||||
func Initialize() *singleton {
|
func Initialize() (*Manager, error) {
|
||||||
|
var err error
|
||||||
once.Do(func() {
|
once.Do(func() {
|
||||||
|
err = initialize()
|
||||||
|
})
|
||||||
|
|
||||||
|
return instance, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func initialize() error {
|
||||||
ctx := context.TODO()
|
ctx := context.TODO()
|
||||||
cfg, err := config.Initialize()
|
cfg, err := config.Initialize()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(fmt.Sprintf("error initializing configuration: %s", err.Error()))
|
return fmt.Errorf("initializing configuration: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
l := initLog()
|
l := initLog()
|
||||||
initProfiling(cfg.GetCPUProfilePath())
|
initProfiling(cfg.GetCPUProfilePath())
|
||||||
|
|
||||||
instance = &singleton{
|
instance = &Manager{
|
||||||
Config: cfg,
|
Config: cfg,
|
||||||
Logger: l,
|
Logger: l,
|
||||||
ReadLockManager: fsutil.NewReadLockManager(),
|
ReadLockManager: fsutil.NewReadLockManager(),
|
||||||
|
|
@ -105,9 +115,9 @@ func Initialize() *singleton {
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(fmt.Sprintf("error initializing configuration: %s", err.Error()))
|
return fmt.Errorf("error initializing configuration: %w", err)
|
||||||
} else if err := instance.PostInit(ctx); err != nil {
|
} else if err := instance.PostInit(ctx); err != nil {
|
||||||
panic(err)
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
initSecurity(cfg)
|
initSecurity(cfg)
|
||||||
|
|
@ -134,9 +144,8 @@ func Initialize() *singleton {
|
||||||
logger.Warnf("could not start DLNA service: %v", err)
|
logger.Warnf("could not start DLNA service: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
|
||||||
|
|
||||||
return instance
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func initJobManager() *job.Manager {
|
func initJobManager() *job.Manager {
|
||||||
|
|
@ -245,7 +254,7 @@ func initLog() *log.Logger {
|
||||||
// PostInit initialises the paths, caches and txnManager after the initial
|
// PostInit initialises the paths, caches and txnManager after the initial
|
||||||
// configuration has been set. Should only be called if the configuration
|
// configuration has been set. Should only be called if the configuration
|
||||||
// is valid.
|
// is valid.
|
||||||
func (s *singleton) PostInit(ctx context.Context) error {
|
func (s *Manager) PostInit(ctx context.Context) error {
|
||||||
if err := s.Config.SetInitialConfig(); err != nil {
|
if err := s.Config.SetInitialConfig(); err != nil {
|
||||||
logger.Warnf("could not set initial configuration: %v", err)
|
logger.Warnf("could not set initial configuration: %v", err)
|
||||||
}
|
}
|
||||||
|
|
@ -305,7 +314,7 @@ func writeStashIcon() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// initScraperCache initializes a new scraper cache and returns it.
|
// initScraperCache initializes a new scraper cache and returns it.
|
||||||
func (s *singleton) initScraperCache() *scraper.Cache {
|
func (s *Manager) initScraperCache() *scraper.Cache {
|
||||||
ret, err := scraper.NewCache(config.GetInstance(), s.TxnManager)
|
ret, err := scraper.NewCache(config.GetInstance(), s.TxnManager)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -315,7 +324,7 @@ func (s *singleton) initScraperCache() *scraper.Cache {
|
||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *singleton) RefreshConfig() {
|
func (s *Manager) RefreshConfig() {
|
||||||
s.Paths = paths.NewPaths(s.Config.GetGeneratedPath())
|
s.Paths = paths.NewPaths(s.Config.GetGeneratedPath())
|
||||||
config := s.Config
|
config := s.Config
|
||||||
if config.Validate() == nil {
|
if config.Validate() == nil {
|
||||||
|
|
@ -342,7 +351,7 @@ func (s *singleton) RefreshConfig() {
|
||||||
|
|
||||||
// RefreshScraperCache refreshes the scraper cache. Call this when scraper
|
// RefreshScraperCache refreshes the scraper cache. Call this when scraper
|
||||||
// configuration changes.
|
// configuration changes.
|
||||||
func (s *singleton) RefreshScraperCache() {
|
func (s *Manager) RefreshScraperCache() {
|
||||||
s.ScraperCache = s.initScraperCache()
|
s.ScraperCache = s.initScraperCache()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -361,7 +370,7 @@ func setSetupDefaults(input *models.SetupInput) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *singleton) Setup(ctx context.Context, input models.SetupInput) error {
|
func (s *Manager) Setup(ctx context.Context, input models.SetupInput) error {
|
||||||
setSetupDefaults(&input)
|
setSetupDefaults(&input)
|
||||||
c := s.Config
|
c := s.Config
|
||||||
|
|
||||||
|
|
@ -417,7 +426,7 @@ func (s *singleton) Setup(ctx context.Context, input models.SetupInput) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *singleton) validateFFMPEG() error {
|
func (s *Manager) validateFFMPEG() error {
|
||||||
if s.FFMPEG == "" || s.FFProbe == "" {
|
if s.FFMPEG == "" || s.FFProbe == "" {
|
||||||
return errors.New("missing ffmpeg and/or ffprobe")
|
return errors.New("missing ffmpeg and/or ffprobe")
|
||||||
}
|
}
|
||||||
|
|
@ -425,7 +434,7 @@ func (s *singleton) validateFFMPEG() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *singleton) Migrate(ctx context.Context, input models.MigrateInput) error {
|
func (s *Manager) Migrate(ctx context.Context, input models.MigrateInput) error {
|
||||||
// always backup so that we can roll back to the previous version if
|
// always backup so that we can roll back to the previous version if
|
||||||
// migration fails
|
// migration fails
|
||||||
backupPath := input.BackupPath
|
backupPath := input.BackupPath
|
||||||
|
|
@ -465,7 +474,7 @@ func (s *singleton) Migrate(ctx context.Context, input models.MigrateInput) erro
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *singleton) GetSystemStatus() *models.SystemStatus {
|
func (s *Manager) GetSystemStatus() *models.SystemStatus {
|
||||||
status := models.SystemStatusEnumOk
|
status := models.SystemStatusEnumOk
|
||||||
dbSchema := int(database.Version())
|
dbSchema := int(database.Version())
|
||||||
dbPath := database.DatabasePath()
|
dbPath := database.DatabasePath()
|
||||||
|
|
@ -488,7 +497,7 @@ func (s *singleton) GetSystemStatus() *models.SystemStatus {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Shutdown gracefully stops the manager
|
// Shutdown gracefully stops the manager
|
||||||
func (s *singleton) Shutdown(code int) {
|
func (s *Manager) Shutdown(code int) {
|
||||||
// stop any profiling at exit
|
// stop any profiling at exit
|
||||||
pprof.StopCPUProfile()
|
pprof.StopCPUProfile()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -53,11 +53,11 @@ func getScanPaths(inputPaths []string) []*models.StashConfig {
|
||||||
|
|
||||||
// ScanSubscribe subscribes to a notification that is triggered when a
|
// ScanSubscribe subscribes to a notification that is triggered when a
|
||||||
// scan or clean is complete.
|
// scan or clean is complete.
|
||||||
func (s *singleton) ScanSubscribe(ctx context.Context) <-chan bool {
|
func (s *Manager) ScanSubscribe(ctx context.Context) <-chan bool {
|
||||||
return s.scanSubs.subscribe(ctx)
|
return s.scanSubs.subscribe(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *singleton) Scan(ctx context.Context, input models.ScanMetadataInput) (int, error) {
|
func (s *Manager) Scan(ctx context.Context, input models.ScanMetadataInput) (int, error) {
|
||||||
if err := s.validateFFMPEG(); err != nil {
|
if err := s.validateFFMPEG(); err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
@ -71,7 +71,7 @@ func (s *singleton) Scan(ctx context.Context, input models.ScanMetadataInput) (i
|
||||||
return s.JobManager.Add(ctx, "Scanning...", &scanJob), nil
|
return s.JobManager.Add(ctx, "Scanning...", &scanJob), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *singleton) Import(ctx context.Context) (int, error) {
|
func (s *Manager) Import(ctx context.Context) (int, error) {
|
||||||
config := config.GetInstance()
|
config := config.GetInstance()
|
||||||
metadataPath := config.GetMetadataPath()
|
metadataPath := config.GetMetadataPath()
|
||||||
if metadataPath == "" {
|
if metadataPath == "" {
|
||||||
|
|
@ -93,7 +93,7 @@ func (s *singleton) Import(ctx context.Context) (int, error) {
|
||||||
return s.JobManager.Add(ctx, "Importing...", j), nil
|
return s.JobManager.Add(ctx, "Importing...", j), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *singleton) Export(ctx context.Context) (int, error) {
|
func (s *Manager) Export(ctx context.Context) (int, error) {
|
||||||
config := config.GetInstance()
|
config := config.GetInstance()
|
||||||
metadataPath := config.GetMetadataPath()
|
metadataPath := config.GetMetadataPath()
|
||||||
if metadataPath == "" {
|
if metadataPath == "" {
|
||||||
|
|
@ -114,7 +114,7 @@ func (s *singleton) Export(ctx context.Context) (int, error) {
|
||||||
return s.JobManager.Add(ctx, "Exporting...", j), nil
|
return s.JobManager.Add(ctx, "Exporting...", j), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *singleton) RunSingleTask(ctx context.Context, t Task) int {
|
func (s *Manager) RunSingleTask(ctx context.Context, t Task) int {
|
||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
wg.Add(1)
|
wg.Add(1)
|
||||||
|
|
||||||
|
|
@ -126,7 +126,7 @@ func (s *singleton) RunSingleTask(ctx context.Context, t Task) int {
|
||||||
return s.JobManager.Add(ctx, t.GetDescription(), j)
|
return s.JobManager.Add(ctx, t.GetDescription(), j)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *singleton) Generate(ctx context.Context, input models.GenerateMetadataInput) (int, error) {
|
func (s *Manager) Generate(ctx context.Context, input models.GenerateMetadataInput) (int, error) {
|
||||||
if err := s.validateFFMPEG(); err != nil {
|
if err := s.validateFFMPEG(); err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
@ -142,16 +142,16 @@ func (s *singleton) Generate(ctx context.Context, input models.GenerateMetadataI
|
||||||
return s.JobManager.Add(ctx, "Generating...", j), nil
|
return s.JobManager.Add(ctx, "Generating...", j), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *singleton) GenerateDefaultScreenshot(ctx context.Context, sceneId string) int {
|
func (s *Manager) GenerateDefaultScreenshot(ctx context.Context, sceneId string) int {
|
||||||
return s.generateScreenshot(ctx, sceneId, nil)
|
return s.generateScreenshot(ctx, sceneId, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *singleton) GenerateScreenshot(ctx context.Context, sceneId string, at float64) int {
|
func (s *Manager) GenerateScreenshot(ctx context.Context, sceneId string, at float64) int {
|
||||||
return s.generateScreenshot(ctx, sceneId, &at)
|
return s.generateScreenshot(ctx, sceneId, &at)
|
||||||
}
|
}
|
||||||
|
|
||||||
// generate default screenshot if at is nil
|
// generate default screenshot if at is nil
|
||||||
func (s *singleton) generateScreenshot(ctx context.Context, sceneId string, at *float64) int {
|
func (s *Manager) generateScreenshot(ctx context.Context, sceneId string, at *float64) int {
|
||||||
if err := instance.Paths.Generated.EnsureTmpDir(); err != nil {
|
if err := instance.Paths.Generated.EnsureTmpDir(); err != nil {
|
||||||
logger.Warnf("failure generating screenshot: %v", err)
|
logger.Warnf("failure generating screenshot: %v", err)
|
||||||
}
|
}
|
||||||
|
|
@ -188,7 +188,7 @@ func (s *singleton) generateScreenshot(ctx context.Context, sceneId string, at *
|
||||||
return s.JobManager.Add(ctx, fmt.Sprintf("Generating screenshot for scene id %s", sceneId), j)
|
return s.JobManager.Add(ctx, fmt.Sprintf("Generating screenshot for scene id %s", sceneId), j)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *singleton) AutoTag(ctx context.Context, input models.AutoTagMetadataInput) int {
|
func (s *Manager) AutoTag(ctx context.Context, input models.AutoTagMetadataInput) int {
|
||||||
j := autoTagJob{
|
j := autoTagJob{
|
||||||
txnManager: s.TxnManager,
|
txnManager: s.TxnManager,
|
||||||
input: input,
|
input: input,
|
||||||
|
|
@ -197,7 +197,7 @@ func (s *singleton) AutoTag(ctx context.Context, input models.AutoTagMetadataInp
|
||||||
return s.JobManager.Add(ctx, "Auto-tagging...", &j)
|
return s.JobManager.Add(ctx, "Auto-tagging...", &j)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *singleton) Clean(ctx context.Context, input models.CleanMetadataInput) int {
|
func (s *Manager) Clean(ctx context.Context, input models.CleanMetadataInput) int {
|
||||||
j := cleanJob{
|
j := cleanJob{
|
||||||
txnManager: s.TxnManager,
|
txnManager: s.TxnManager,
|
||||||
input: input,
|
input: input,
|
||||||
|
|
@ -207,7 +207,7 @@ func (s *singleton) Clean(ctx context.Context, input models.CleanMetadataInput)
|
||||||
return s.JobManager.Add(ctx, "Cleaning...", &j)
|
return s.JobManager.Add(ctx, "Cleaning...", &j)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *singleton) MigrateHash(ctx context.Context) int {
|
func (s *Manager) MigrateHash(ctx context.Context) int {
|
||||||
j := job.MakeJobExec(func(ctx context.Context, progress *job.Progress) {
|
j := job.MakeJobExec(func(ctx context.Context, progress *job.Progress) {
|
||||||
fileNamingAlgo := config.GetInstance().GetVideoFileNamingAlgorithm()
|
fileNamingAlgo := config.GetInstance().GetVideoFileNamingAlgorithm()
|
||||||
logger.Infof("Migrating generated files for %s naming hash", fileNamingAlgo.String())
|
logger.Infof("Migrating generated files for %s naming hash", fileNamingAlgo.String())
|
||||||
|
|
@ -255,7 +255,7 @@ func (s *singleton) MigrateHash(ctx context.Context) int {
|
||||||
return s.JobManager.Add(ctx, "Migrating scene hashes...", j)
|
return s.JobManager.Add(ctx, "Migrating scene hashes...", j)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *singleton) StashBoxBatchPerformerTag(ctx context.Context, input models.StashBoxBatchPerformerTagInput) int {
|
func (s *Manager) StashBoxBatchPerformerTag(ctx context.Context, input models.StashBoxBatchPerformerTagInput) int {
|
||||||
j := job.MakeJobExec(func(ctx context.Context, progress *job.Progress) {
|
j := job.MakeJobExec(func(ctx context.Context, progress *job.Progress) {
|
||||||
logger.Infof("Initiating stash-box batch performer tag")
|
logger.Infof("Initiating stash-box batch performer tag")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,6 @@ package manager
|
||||||
import "context"
|
import "context"
|
||||||
|
|
||||||
// PostMigrate is executed after migrations have been executed.
|
// PostMigrate is executed after migrations have been executed.
|
||||||
func (s *singleton) PostMigrate(ctx context.Context) {
|
func (s *Manager) PostMigrate(ctx context.Context) {
|
||||||
setInitialMD5Config(ctx, s.TxnManager)
|
setInitialMD5Config(ctx, s.TxnManager)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ import (
|
||||||
"github.com/stashapp/stash/pkg/models"
|
"github.com/stashapp/stash/pkg/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (s *singleton) RunPluginTask(ctx context.Context, pluginID string, taskName string, args []*models.PluginArgInput) int {
|
func (s *Manager) RunPluginTask(ctx context.Context, pluginID string, taskName string, args []*models.PluginArgInput) int {
|
||||||
j := job.MakeJobExec(func(jobCtx context.Context, progress *job.Progress) {
|
j := job.MakeJobExec(func(jobCtx context.Context, progress *job.Progress) {
|
||||||
pluginProgress := make(chan float64)
|
pluginProgress := make(chan float64)
|
||||||
task, err := s.PluginCache.CreateTask(ctx, pluginID, taskName, args, pluginProgress)
|
task, err := s.PluginCache.CreateTask(ctx, pluginID, taskName, args, pluginProgress)
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,10 @@
|
||||||
|
### 🎨 Improvements
|
||||||
|
* Display error message on fatal error when running stash with double-click in Windows. ([#2543](https://github.com/stashapp/stash/pull/2543))
|
||||||
|
|
||||||
### 🐛 Bug fixes
|
### 🐛 Bug fixes
|
||||||
|
* Update vtt files when scene hash changes. ([#2554](https://github.com/stashapp/stash/pulls?q=is%3Apr+is%3Aclosed))
|
||||||
|
* Don't break up preview video into segments for shorter scenes. ([#2553](https://github.com/stashapp/stash/pull/2553))
|
||||||
|
* Fix parsing query URLs when query string contains special characters. ([#2552](https://github.com/stashapp/stash/pull/2552))
|
||||||
* Fix crash when cancelling pending tasks. ([#2527](https://github.com/stashapp/stash/pull/2527))
|
* Fix crash when cancelling pending tasks. ([#2527](https://github.com/stashapp/stash/pull/2527))
|
||||||
* Fix markers not refreshing after creating new marker. ([#2502](https://github.com/stashapp/stash/pull/2502))
|
* Fix markers not refreshing after creating new marker. ([#2502](https://github.com/stashapp/stash/pull/2502))
|
||||||
* Fix error when submitting scene draft to stash-box without performers. ([#2515](https://github.com/stashapp/stash/pull/2515))
|
* Fix error when submitting scene draft to stash-box without performers. ([#2515](https://github.com/stashapp/stash/pull/2515))
|
||||||
|
|
|
||||||
1
vendor/github.com/apenwarr/fixconsole/.gitignore
generated
vendored
1
vendor/github.com/apenwarr/fixconsole/.gitignore
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
*~
|
|
||||||
202
vendor/github.com/apenwarr/fixconsole/LICENSE
generated
vendored
202
vendor/github.com/apenwarr/fixconsole/LICENSE
generated
vendored
|
|
@ -1,202 +0,0 @@
|
||||||
|
|
||||||
Apache License
|
|
||||||
Version 2.0, January 2004
|
|
||||||
http://www.apache.org/licenses/
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
||||||
|
|
||||||
1. Definitions.
|
|
||||||
|
|
||||||
"License" shall mean the terms and conditions for use, reproduction,
|
|
||||||
and distribution as defined by Sections 1 through 9 of this document.
|
|
||||||
|
|
||||||
"Licensor" shall mean the copyright owner or entity authorized by
|
|
||||||
the copyright owner that is granting the License.
|
|
||||||
|
|
||||||
"Legal Entity" shall mean the union of the acting entity and all
|
|
||||||
other entities that control, are controlled by, or are under common
|
|
||||||
control with that entity. For the purposes of this definition,
|
|
||||||
"control" means (i) the power, direct or indirect, to cause the
|
|
||||||
direction or management of such entity, whether by contract or
|
|
||||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
||||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
||||||
|
|
||||||
"You" (or "Your") shall mean an individual or Legal Entity
|
|
||||||
exercising permissions granted by this License.
|
|
||||||
|
|
||||||
"Source" form shall mean the preferred form for making modifications,
|
|
||||||
including but not limited to software source code, documentation
|
|
||||||
source, and configuration files.
|
|
||||||
|
|
||||||
"Object" form shall mean any form resulting from mechanical
|
|
||||||
transformation or translation of a Source form, including but
|
|
||||||
not limited to compiled object code, generated documentation,
|
|
||||||
and conversions to other media types.
|
|
||||||
|
|
||||||
"Work" shall mean the work of authorship, whether in Source or
|
|
||||||
Object form, made available under the License, as indicated by a
|
|
||||||
copyright notice that is included in or attached to the work
|
|
||||||
(an example is provided in the Appendix below).
|
|
||||||
|
|
||||||
"Derivative Works" shall mean any work, whether in Source or Object
|
|
||||||
form, that is based on (or derived from) the Work and for which the
|
|
||||||
editorial revisions, annotations, elaborations, or other modifications
|
|
||||||
represent, as a whole, an original work of authorship. For the purposes
|
|
||||||
of this License, Derivative Works shall not include works that remain
|
|
||||||
separable from, or merely link (or bind by name) to the interfaces of,
|
|
||||||
the Work and Derivative Works thereof.
|
|
||||||
|
|
||||||
"Contribution" shall mean any work of authorship, including
|
|
||||||
the original version of the Work and any modifications or additions
|
|
||||||
to that Work or Derivative Works thereof, that is intentionally
|
|
||||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
||||||
or by an individual or Legal Entity authorized to submit on behalf of
|
|
||||||
the copyright owner. For the purposes of this definition, "submitted"
|
|
||||||
means any form of electronic, verbal, or written communication sent
|
|
||||||
to the Licensor or its representatives, including but not limited to
|
|
||||||
communication on electronic mailing lists, source code control systems,
|
|
||||||
and issue tracking systems that are managed by, or on behalf of, the
|
|
||||||
Licensor for the purpose of discussing and improving the Work, but
|
|
||||||
excluding communication that is conspicuously marked or otherwise
|
|
||||||
designated in writing by the copyright owner as "Not a Contribution."
|
|
||||||
|
|
||||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
||||||
on behalf of whom a Contribution has been received by Licensor and
|
|
||||||
subsequently incorporated within the Work.
|
|
||||||
|
|
||||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
copyright license to reproduce, prepare Derivative Works of,
|
|
||||||
publicly display, publicly perform, sublicense, and distribute the
|
|
||||||
Work and such Derivative Works in Source or Object form.
|
|
||||||
|
|
||||||
3. Grant of Patent License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
(except as stated in this section) patent license to make, have made,
|
|
||||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
||||||
where such license applies only to those patent claims licensable
|
|
||||||
by such Contributor that are necessarily infringed by their
|
|
||||||
Contribution(s) alone or by combination of their Contribution(s)
|
|
||||||
with the Work to which such Contribution(s) was submitted. If You
|
|
||||||
institute patent litigation against any entity (including a
|
|
||||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
||||||
or a Contribution incorporated within the Work constitutes direct
|
|
||||||
or contributory patent infringement, then any patent licenses
|
|
||||||
granted to You under this License for that Work shall terminate
|
|
||||||
as of the date such litigation is filed.
|
|
||||||
|
|
||||||
4. Redistribution. You may reproduce and distribute copies of the
|
|
||||||
Work or Derivative Works thereof in any medium, with or without
|
|
||||||
modifications, and in Source or Object form, provided that You
|
|
||||||
meet the following conditions:
|
|
||||||
|
|
||||||
(a) You must give any other recipients of the Work or
|
|
||||||
Derivative Works a copy of this License; and
|
|
||||||
|
|
||||||
(b) You must cause any modified files to carry prominent notices
|
|
||||||
stating that You changed the files; and
|
|
||||||
|
|
||||||
(c) You must retain, in the Source form of any Derivative Works
|
|
||||||
that You distribute, all copyright, patent, trademark, and
|
|
||||||
attribution notices from the Source form of the Work,
|
|
||||||
excluding those notices that do not pertain to any part of
|
|
||||||
the Derivative Works; and
|
|
||||||
|
|
||||||
(d) If the Work includes a "NOTICE" text file as part of its
|
|
||||||
distribution, then any Derivative Works that You distribute must
|
|
||||||
include a readable copy of the attribution notices contained
|
|
||||||
within such NOTICE file, excluding those notices that do not
|
|
||||||
pertain to any part of the Derivative Works, in at least one
|
|
||||||
of the following places: within a NOTICE text file distributed
|
|
||||||
as part of the Derivative Works; within the Source form or
|
|
||||||
documentation, if provided along with the Derivative Works; or,
|
|
||||||
within a display generated by the Derivative Works, if and
|
|
||||||
wherever such third-party notices normally appear. The contents
|
|
||||||
of the NOTICE file are for informational purposes only and
|
|
||||||
do not modify the License. You may add Your own attribution
|
|
||||||
notices within Derivative Works that You distribute, alongside
|
|
||||||
or as an addendum to the NOTICE text from the Work, provided
|
|
||||||
that such additional attribution notices cannot be construed
|
|
||||||
as modifying the License.
|
|
||||||
|
|
||||||
You may add Your own copyright statement to Your modifications and
|
|
||||||
may provide additional or different license terms and conditions
|
|
||||||
for use, reproduction, or distribution of Your modifications, or
|
|
||||||
for any such Derivative Works as a whole, provided Your use,
|
|
||||||
reproduction, and distribution of the Work otherwise complies with
|
|
||||||
the conditions stated in this License.
|
|
||||||
|
|
||||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
||||||
any Contribution intentionally submitted for inclusion in the Work
|
|
||||||
by You to the Licensor shall be under the terms and conditions of
|
|
||||||
this License, without any additional terms or conditions.
|
|
||||||
Notwithstanding the above, nothing herein shall supersede or modify
|
|
||||||
the terms of any separate license agreement you may have executed
|
|
||||||
with Licensor regarding such Contributions.
|
|
||||||
|
|
||||||
6. Trademarks. This License does not grant permission to use the trade
|
|
||||||
names, trademarks, service marks, or product names of the Licensor,
|
|
||||||
except as required for reasonable and customary use in describing the
|
|
||||||
origin of the Work and reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
||||||
agreed to in writing, Licensor provides the Work (and each
|
|
||||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
implied, including, without limitation, any warranties or conditions
|
|
||||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
||||||
appropriateness of using or redistributing the Work and assume any
|
|
||||||
risks associated with Your exercise of permissions under this License.
|
|
||||||
|
|
||||||
8. Limitation of Liability. In no event and under no legal theory,
|
|
||||||
whether in tort (including negligence), contract, or otherwise,
|
|
||||||
unless required by applicable law (such as deliberate and grossly
|
|
||||||
negligent acts) or agreed to in writing, shall any Contributor be
|
|
||||||
liable to You for damages, including any direct, indirect, special,
|
|
||||||
incidental, or consequential damages of any character arising as a
|
|
||||||
result of this License or out of the use or inability to use the
|
|
||||||
Work (including but not limited to damages for loss of goodwill,
|
|
||||||
work stoppage, computer failure or malfunction, or any and all
|
|
||||||
other commercial damages or losses), even if such Contributor
|
|
||||||
has been advised of the possibility of such damages.
|
|
||||||
|
|
||||||
9. Accepting Warranty or Additional Liability. While redistributing
|
|
||||||
the Work or Derivative Works thereof, You may choose to offer,
|
|
||||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
||||||
or other liability obligations and/or rights consistent with this
|
|
||||||
License. However, in accepting such obligations, You may act only
|
|
||||||
on Your own behalf and on Your sole responsibility, not on behalf
|
|
||||||
of any other Contributor, and only if You agree to indemnify,
|
|
||||||
defend, and hold each Contributor harmless for any liability
|
|
||||||
incurred by, or claims asserted against, such Contributor by reason
|
|
||||||
of your accepting any such warranty or additional liability.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
APPENDIX: How to apply the Apache License to your work.
|
|
||||||
|
|
||||||
To apply the Apache License to your work, attach the following
|
|
||||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
||||||
replaced with your own identifying information. (Don't include
|
|
||||||
the brackets!) The text should be enclosed in the appropriate
|
|
||||||
comment syntax for the file format. We also recommend that a
|
|
||||||
file or class name and description of purpose be included on the
|
|
||||||
same "printed page" as the copyright notice for easier
|
|
||||||
identification within third-party archives.
|
|
||||||
|
|
||||||
Copyright [yyyy] [name of copyright owner]
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
14
vendor/github.com/apenwarr/fixconsole/fixconsole_default.go
generated
vendored
14
vendor/github.com/apenwarr/fixconsole/fixconsole_default.go
generated
vendored
|
|
@ -1,14 +0,0 @@
|
||||||
// +build !windows
|
|
||||||
|
|
||||||
package fixconsole
|
|
||||||
|
|
||||||
// On non-windows platforms, we don't need to do anything. The console
|
|
||||||
// starts off attached already, if it exists.
|
|
||||||
|
|
||||||
func AttachConsole() error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func FixConsoleIfNeeded() error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
132
vendor/github.com/apenwarr/fixconsole/fixconsole_windows.go
generated
vendored
132
vendor/github.com/apenwarr/fixconsole/fixconsole_windows.go
generated
vendored
|
|
@ -1,132 +0,0 @@
|
||||||
package fixconsole
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"github.com/apenwarr/w32"
|
|
||||||
"golang.org/x/sys/windows"
|
|
||||||
"os"
|
|
||||||
"syscall"
|
|
||||||
)
|
|
||||||
|
|
||||||
func AttachConsole() error {
|
|
||||||
const ATTACH_PARENT_PROCESS = ^uintptr(0)
|
|
||||||
proc := syscall.MustLoadDLL("kernel32.dll").MustFindProc("AttachConsole")
|
|
||||||
r1, _, err := proc.Call(ATTACH_PARENT_PROCESS)
|
|
||||||
if r1 == 0 {
|
|
||||||
errno, ok := err.(syscall.Errno)
|
|
||||||
if ok && errno == w32.ERROR_INVALID_HANDLE {
|
|
||||||
// console handle doesn't exist; not a real
|
|
||||||
// error, but the console handle will be
|
|
||||||
// invalid.
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
} else {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var oldStdin, oldStdout, oldStderr *os.File
|
|
||||||
|
|
||||||
// Windows console output is a mess.
|
|
||||||
//
|
|
||||||
// If you compile as "-H windows", then if you launch your program without
|
|
||||||
// a console, Windows forcibly creates one to use as your stdin/stdout, which
|
|
||||||
// is silly for a GUI app, so we can't do that.
|
|
||||||
//
|
|
||||||
// If you compile as "-H windowsgui", then it doesn't create a console for
|
|
||||||
// your app... but also doesn't provide a working stdin/stdout/stderr even if
|
|
||||||
// you *did* launch from the console. However, you can use AttachConsole()
|
|
||||||
// to get a handle to your parent process's console, if any, and then
|
|
||||||
// os.NewFile() to turn that handle into a fd usable as stdout/stderr.
|
|
||||||
//
|
|
||||||
// However, then you have the problem that if you redirect stdout or stderr
|
|
||||||
// from the shell, you end up ignoring the redirection by forcing it to the
|
|
||||||
// console.
|
|
||||||
//
|
|
||||||
// To fix *that*, we have to detect whether there was a pre-existing stdout
|
|
||||||
// or not. We can check GetStdHandle(), which returns 0 for "should be
|
|
||||||
// console" and nonzero for "already pointing at a file."
|
|
||||||
//
|
|
||||||
// Be careful though! As soon as you run AttachConsole(), it resets *all*
|
|
||||||
// the GetStdHandle() handles to point them at the console instead, thus
|
|
||||||
// throwing away the original file redirects. So we have to GetStdHandle()
|
|
||||||
// *before* AttachConsole().
|
|
||||||
//
|
|
||||||
// For some reason, powershell redirections provide a valid file handle, but
|
|
||||||
// writing to that handle doesn't write to the file. I haven't found a way
|
|
||||||
// to work around that. (Windows 10.0.17763.379)
|
|
||||||
//
|
|
||||||
// Net result is as follows.
|
|
||||||
// Before:
|
|
||||||
// SHELL NON-REDIRECTED REDIRECTED
|
|
||||||
// explorer.exe no console n/a
|
|
||||||
// cmd.exe broken works
|
|
||||||
// powershell broken broken
|
|
||||||
// WSL bash broken works
|
|
||||||
// After
|
|
||||||
// SHELL NON-REDIRECTED REDIRECTED
|
|
||||||
// explorer.exe no console n/a
|
|
||||||
// cmd.exe works works
|
|
||||||
// powershell works broken
|
|
||||||
// WSL bash works works
|
|
||||||
//
|
|
||||||
// We don't seem to make anything worse, at least.
|
|
||||||
func FixConsoleIfNeeded() error {
|
|
||||||
// Retain the original console objects, to prevent Go from automatically
|
|
||||||
// closing their file descriptors when they get garbage collected.
|
|
||||||
// You never want to close file descriptors 0, 1, and 2.
|
|
||||||
oldStdin, oldStdout, oldStderr = os.Stdin, os.Stdout, os.Stderr
|
|
||||||
|
|
||||||
stdin, _ := syscall.GetStdHandle(syscall.STD_INPUT_HANDLE)
|
|
||||||
stdout, _ := syscall.GetStdHandle(syscall.STD_OUTPUT_HANDLE)
|
|
||||||
stderr, _ := syscall.GetStdHandle(syscall.STD_ERROR_HANDLE)
|
|
||||||
|
|
||||||
var invalid syscall.Handle
|
|
||||||
con := invalid
|
|
||||||
|
|
||||||
if stdin == invalid || stdout == invalid || stderr == invalid {
|
|
||||||
err := AttachConsole()
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("attachconsole: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if stdin == invalid {
|
|
||||||
stdin, _ = syscall.GetStdHandle(syscall.STD_INPUT_HANDLE)
|
|
||||||
}
|
|
||||||
if stdout == invalid {
|
|
||||||
stdout, _ = syscall.GetStdHandle(syscall.STD_OUTPUT_HANDLE)
|
|
||||||
con = stdout
|
|
||||||
}
|
|
||||||
if stderr == invalid {
|
|
||||||
stderr, _ = syscall.GetStdHandle(syscall.STD_ERROR_HANDLE)
|
|
||||||
con = stderr
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if con != invalid {
|
|
||||||
// Make sure the console is configured to convert
|
|
||||||
// \n to \r\n, like Go programs expect.
|
|
||||||
h := windows.Handle(con)
|
|
||||||
var st uint32
|
|
||||||
err := windows.GetConsoleMode(h, &st)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("GetConsoleMode: %v", err)
|
|
||||||
}
|
|
||||||
err = windows.SetConsoleMode(h, st&^windows.DISABLE_NEWLINE_AUTO_RETURN)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("SetConsoleMode: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if stdin != invalid {
|
|
||||||
os.Stdin = os.NewFile(uintptr(stdin), "stdin")
|
|
||||||
}
|
|
||||||
if stdout != invalid {
|
|
||||||
os.Stdout = os.NewFile(uintptr(stdout), "stdout")
|
|
||||||
}
|
|
||||||
if stderr != invalid {
|
|
||||||
os.Stderr = os.NewFile(uintptr(stderr), "stderr")
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
19
vendor/github.com/apenwarr/w32/AUTHORS
generated
vendored
19
vendor/github.com/apenwarr/w32/AUTHORS
generated
vendored
|
|
@ -1,19 +0,0 @@
|
||||||
# This is the official list of 'w32' authors for copyright purposes.
|
|
||||||
|
|
||||||
# Names should be added to this file as
|
|
||||||
# Name or Organization <email address>
|
|
||||||
# The email address is not required for organizations.
|
|
||||||
|
|
||||||
# Please keep the list sorted.
|
|
||||||
|
|
||||||
# Contributors
|
|
||||||
# ============
|
|
||||||
|
|
||||||
Allen Dang <allengnr@gmail.com>
|
|
||||||
Benny Siegert <bsiegert@gmail.com>
|
|
||||||
Bruno Bigras <bigras.bruno@gmail.com>
|
|
||||||
Daniel Joos
|
|
||||||
Gerald Rosenberg <gerald.rosenberg@gmail.com>
|
|
||||||
Liam Bowen <liambowen@gmail.com>
|
|
||||||
Michael Henke
|
|
||||||
Paul Maddox <paul.maddox@gmail.com>
|
|
||||||
23
vendor/github.com/apenwarr/w32/LICENSE
generated
vendored
23
vendor/github.com/apenwarr/w32/LICENSE
generated
vendored
|
|
@ -1,23 +0,0 @@
|
||||||
Copyright (c) 2010-2012 The w32 Authors. All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions
|
|
||||||
are met:
|
|
||||||
1. Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in the
|
|
||||||
documentation and/or other materials provided with the distribution.
|
|
||||||
3. The names of the authors may not be used to endorse or promote products
|
|
||||||
derived from this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
||||||
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
33
vendor/github.com/apenwarr/w32/README.md
generated
vendored
33
vendor/github.com/apenwarr/w32/README.md
generated
vendored
|
|
@ -1,33 +0,0 @@
|
||||||
About w32
|
|
||||||
==========
|
|
||||||
|
|
||||||
w32 is a wrapper of windows apis for the Go Programming Language.
|
|
||||||
|
|
||||||
It wraps win32 apis to "Go style" to make them easier to use.
|
|
||||||
|
|
||||||
Setup
|
|
||||||
=====
|
|
||||||
|
|
||||||
1. Make sure you have a working Go installation and build environment,
|
|
||||||
see this go-nuts post for details:
|
|
||||||
http://groups.google.com/group/golang-nuts/msg/5c87630a84f4fd0c
|
|
||||||
|
|
||||||
Updated versions of the Windows Go build are available here:
|
|
||||||
http://code.google.com/p/gomingw/downloads/list
|
|
||||||
|
|
||||||
2. Create a "gopath" directory if you do not have one yet and set the
|
|
||||||
GOPATH variable accordingly. For example:
|
|
||||||
mkdir -p go-externals/src
|
|
||||||
export GOPATH=${PWD}/go-externals
|
|
||||||
|
|
||||||
3. go get github.com/AllenDang/w32
|
|
||||||
|
|
||||||
4. go install github.com/AllenDang/w32...
|
|
||||||
|
|
||||||
Contribute
|
|
||||||
==========
|
|
||||||
|
|
||||||
Contributions in form of design, code, documentation, bug reporting or other
|
|
||||||
ways you see fit are very welcome.
|
|
||||||
|
|
||||||
Thank You!
|
|
||||||
389
vendor/github.com/apenwarr/w32/advapi32.go
generated
vendored
389
vendor/github.com/apenwarr/w32/advapi32.go
generated
vendored
|
|
@ -1,389 +0,0 @@
|
||||||
// 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 (
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
modadvapi32 = syscall.NewLazyDLL("advapi32.dll")
|
|
||||||
|
|
||||||
// procRegSetKeyValue = modadvapi32.NewProc("RegSetKeyValueW")
|
|
||||||
procCloseEventLog = modadvapi32.NewProc("CloseEventLog")
|
|
||||||
procCloseServiceHandle = modadvapi32.NewProc("CloseServiceHandle")
|
|
||||||
procControlService = modadvapi32.NewProc("ControlService")
|
|
||||||
procControlTrace = modadvapi32.NewProc("ControlTraceW")
|
|
||||||
procInitializeSecurityDescriptor = modadvapi32.NewProc("InitializeSecurityDescriptor")
|
|
||||||
procOpenEventLog = modadvapi32.NewProc("OpenEventLogW")
|
|
||||||
procOpenSCManager = modadvapi32.NewProc("OpenSCManagerW")
|
|
||||||
procOpenService = modadvapi32.NewProc("OpenServiceW")
|
|
||||||
procReadEventLog = modadvapi32.NewProc("ReadEventLogW")
|
|
||||||
procRegCloseKey = modadvapi32.NewProc("RegCloseKey")
|
|
||||||
procRegCreateKeyEx = modadvapi32.NewProc("RegCreateKeyExW")
|
|
||||||
procRegEnumKeyEx = modadvapi32.NewProc("RegEnumKeyExW")
|
|
||||||
procRegGetValue = modadvapi32.NewProc("RegGetValueW")
|
|
||||||
procRegOpenKeyEx = modadvapi32.NewProc("RegOpenKeyExW")
|
|
||||||
procRegSetValueEx = modadvapi32.NewProc("RegSetValueExW")
|
|
||||||
procSetSecurityDescriptorDacl = modadvapi32.NewProc("SetSecurityDescriptorDacl")
|
|
||||||
procStartService = modadvapi32.NewProc("StartServiceW")
|
|
||||||
procStartTrace = modadvapi32.NewProc("StartTraceW")
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
SystemTraceControlGuid = GUID{
|
|
||||||
0x9e814aad,
|
|
||||||
0x3204,
|
|
||||||
0x11d2,
|
|
||||||
[8]byte{0x9a, 0x82, 0x00, 0x60, 0x08, 0xa8, 0x69, 0x39},
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
func RegCreateKey(hKey HKEY, subKey string) HKEY {
|
|
||||||
var result HKEY
|
|
||||||
ret, _, _ := procRegCreateKeyEx.Call(
|
|
||||||
uintptr(hKey),
|
|
||||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))),
|
|
||||||
uintptr(0),
|
|
||||||
uintptr(0),
|
|
||||||
uintptr(0),
|
|
||||||
uintptr(KEY_ALL_ACCESS),
|
|
||||||
uintptr(0),
|
|
||||||
uintptr(unsafe.Pointer(&result)),
|
|
||||||
uintptr(0))
|
|
||||||
_ = ret
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
func RegOpenKeyEx(hKey HKEY, subKey string, samDesired uint32) HKEY {
|
|
||||||
var result HKEY
|
|
||||||
ret, _, _ := procRegOpenKeyEx.Call(
|
|
||||||
uintptr(hKey),
|
|
||||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))),
|
|
||||||
uintptr(0),
|
|
||||||
uintptr(samDesired),
|
|
||||||
uintptr(unsafe.Pointer(&result)))
|
|
||||||
|
|
||||||
if ret != ERROR_SUCCESS {
|
|
||||||
panic(fmt.Sprintf("RegOpenKeyEx(%d, %s, %d) failed", hKey, subKey, samDesired))
|
|
||||||
}
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
func RegCloseKey(hKey HKEY) error {
|
|
||||||
var err error
|
|
||||||
ret, _, _ := procRegCloseKey.Call(
|
|
||||||
uintptr(hKey))
|
|
||||||
|
|
||||||
if ret != ERROR_SUCCESS {
|
|
||||||
err = errors.New("RegCloseKey failed")
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func RegGetRaw(hKey HKEY, subKey string, value string) []byte {
|
|
||||||
var bufLen uint32
|
|
||||||
var valptr unsafe.Pointer
|
|
||||||
if len(value) > 0 {
|
|
||||||
valptr = unsafe.Pointer(syscall.StringToUTF16Ptr(value))
|
|
||||||
}
|
|
||||||
procRegGetValue.Call(
|
|
||||||
uintptr(hKey),
|
|
||||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))),
|
|
||||||
uintptr(valptr),
|
|
||||||
uintptr(RRF_RT_ANY),
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
uintptr(unsafe.Pointer(&bufLen)))
|
|
||||||
|
|
||||||
if bufLen == 0 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
buf := make([]byte, bufLen)
|
|
||||||
ret, _, _ := procRegGetValue.Call(
|
|
||||||
uintptr(hKey),
|
|
||||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))),
|
|
||||||
uintptr(valptr),
|
|
||||||
uintptr(RRF_RT_ANY),
|
|
||||||
0,
|
|
||||||
uintptr(unsafe.Pointer(&buf[0])),
|
|
||||||
uintptr(unsafe.Pointer(&bufLen)))
|
|
||||||
|
|
||||||
if ret != ERROR_SUCCESS {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return buf
|
|
||||||
}
|
|
||||||
|
|
||||||
func RegSetBinary(hKey HKEY, subKey string, value []byte) (errno int) {
|
|
||||||
var lptr, vptr unsafe.Pointer
|
|
||||||
if len(subKey) > 0 {
|
|
||||||
lptr = unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))
|
|
||||||
}
|
|
||||||
if len(value) > 0 {
|
|
||||||
vptr = unsafe.Pointer(&value[0])
|
|
||||||
}
|
|
||||||
ret, _, _ := procRegSetValueEx.Call(
|
|
||||||
uintptr(hKey),
|
|
||||||
uintptr(lptr),
|
|
||||||
uintptr(0),
|
|
||||||
uintptr(REG_BINARY),
|
|
||||||
uintptr(vptr),
|
|
||||||
uintptr(len(value)))
|
|
||||||
|
|
||||||
return int(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func RegGetString(hKey HKEY, subKey string, value string) string {
|
|
||||||
var bufLen uint32
|
|
||||||
procRegGetValue.Call(
|
|
||||||
uintptr(hKey),
|
|
||||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))),
|
|
||||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(value))),
|
|
||||||
uintptr(RRF_RT_REG_SZ),
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
uintptr(unsafe.Pointer(&bufLen)))
|
|
||||||
|
|
||||||
if bufLen == 0 {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
buf := make([]uint16, bufLen)
|
|
||||||
ret, _, _ := procRegGetValue.Call(
|
|
||||||
uintptr(hKey),
|
|
||||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))),
|
|
||||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(value))),
|
|
||||||
uintptr(RRF_RT_REG_SZ),
|
|
||||||
0,
|
|
||||||
uintptr(unsafe.Pointer(&buf[0])),
|
|
||||||
uintptr(unsafe.Pointer(&bufLen)))
|
|
||||||
|
|
||||||
if ret != ERROR_SUCCESS {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
return syscall.UTF16ToString(buf)
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
func RegSetKeyValue(hKey HKEY, subKey string, valueName string, dwType uint32, data uintptr, cbData uint16) (errno int) {
|
|
||||||
ret, _, _ := procRegSetKeyValue.Call(
|
|
||||||
uintptr(hKey),
|
|
||||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))),
|
|
||||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(valueName))),
|
|
||||||
uintptr(dwType),
|
|
||||||
data,
|
|
||||||
uintptr(cbData))
|
|
||||||
|
|
||||||
return int(ret)
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
func RegEnumKeyEx(hKey HKEY, index uint32) string {
|
|
||||||
var bufLen uint32 = 255
|
|
||||||
buf := make([]uint16, bufLen)
|
|
||||||
procRegEnumKeyEx.Call(
|
|
||||||
uintptr(hKey),
|
|
||||||
uintptr(index),
|
|
||||||
uintptr(unsafe.Pointer(&buf[0])),
|
|
||||||
uintptr(unsafe.Pointer(&bufLen)),
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0)
|
|
||||||
return syscall.UTF16ToString(buf)
|
|
||||||
}
|
|
||||||
|
|
||||||
func OpenEventLog(servername string, sourcename string) HANDLE {
|
|
||||||
ret, _, _ := procOpenEventLog.Call(
|
|
||||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(servername))),
|
|
||||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(sourcename))))
|
|
||||||
|
|
||||||
return HANDLE(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func ReadEventLog(eventlog HANDLE, readflags, recordoffset uint32, buffer []byte, numberofbytestoread uint32, bytesread, minnumberofbytesneeded *uint32) bool {
|
|
||||||
ret, _, _ := procReadEventLog.Call(
|
|
||||||
uintptr(eventlog),
|
|
||||||
uintptr(readflags),
|
|
||||||
uintptr(recordoffset),
|
|
||||||
uintptr(unsafe.Pointer(&buffer[0])),
|
|
||||||
uintptr(numberofbytestoread),
|
|
||||||
uintptr(unsafe.Pointer(bytesread)),
|
|
||||||
uintptr(unsafe.Pointer(minnumberofbytesneeded)))
|
|
||||||
|
|
||||||
return ret != 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func CloseEventLog(eventlog HANDLE) bool {
|
|
||||||
ret, _, _ := procCloseEventLog.Call(
|
|
||||||
uintptr(eventlog))
|
|
||||||
|
|
||||||
return ret != 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func OpenSCManager(lpMachineName, lpDatabaseName string, dwDesiredAccess uint32) (HANDLE, error) {
|
|
||||||
var p1, p2 uintptr
|
|
||||||
if len(lpMachineName) > 0 {
|
|
||||||
p1 = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpMachineName)))
|
|
||||||
}
|
|
||||||
if len(lpDatabaseName) > 0 {
|
|
||||||
p2 = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpDatabaseName)))
|
|
||||||
}
|
|
||||||
ret, _, _ := procOpenSCManager.Call(
|
|
||||||
p1,
|
|
||||||
p2,
|
|
||||||
uintptr(dwDesiredAccess))
|
|
||||||
|
|
||||||
if ret == 0 {
|
|
||||||
return 0, syscall.GetLastError()
|
|
||||||
}
|
|
||||||
|
|
||||||
return HANDLE(ret), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func CloseServiceHandle(hSCObject HANDLE) error {
|
|
||||||
ret, _, _ := procCloseServiceHandle.Call(uintptr(hSCObject))
|
|
||||||
if ret == 0 {
|
|
||||||
return syscall.GetLastError()
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func OpenService(hSCManager HANDLE, lpServiceName string, dwDesiredAccess uint32) (HANDLE, error) {
|
|
||||||
ret, _, _ := procOpenService.Call(
|
|
||||||
uintptr(hSCManager),
|
|
||||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpServiceName))),
|
|
||||||
uintptr(dwDesiredAccess))
|
|
||||||
|
|
||||||
if ret == 0 {
|
|
||||||
return 0, syscall.GetLastError()
|
|
||||||
}
|
|
||||||
|
|
||||||
return HANDLE(ret), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func StartService(hService HANDLE, lpServiceArgVectors []string) error {
|
|
||||||
l := len(lpServiceArgVectors)
|
|
||||||
var ret uintptr
|
|
||||||
if l == 0 {
|
|
||||||
ret, _, _ = procStartService.Call(
|
|
||||||
uintptr(hService),
|
|
||||||
0,
|
|
||||||
0)
|
|
||||||
} else {
|
|
||||||
lpArgs := make([]uintptr, l)
|
|
||||||
for i := 0; i < l; i++ {
|
|
||||||
lpArgs[i] = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpServiceArgVectors[i])))
|
|
||||||
}
|
|
||||||
|
|
||||||
ret, _, _ = procStartService.Call(
|
|
||||||
uintptr(hService),
|
|
||||||
uintptr(l),
|
|
||||||
uintptr(unsafe.Pointer(&lpArgs[0])))
|
|
||||||
}
|
|
||||||
|
|
||||||
if ret == 0 {
|
|
||||||
return syscall.GetLastError()
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func ControlService(hService HANDLE, dwControl uint32, lpServiceStatus *SERVICE_STATUS) bool {
|
|
||||||
if lpServiceStatus == nil {
|
|
||||||
panic("ControlService:lpServiceStatus cannot be nil")
|
|
||||||
}
|
|
||||||
|
|
||||||
ret, _, _ := procControlService.Call(
|
|
||||||
uintptr(hService),
|
|
||||||
uintptr(dwControl),
|
|
||||||
uintptr(unsafe.Pointer(lpServiceStatus)))
|
|
||||||
|
|
||||||
return ret != 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func ControlTrace(hTrace TRACEHANDLE, lpSessionName string, props *EVENT_TRACE_PROPERTIES, dwControl uint32) (success bool, e error) {
|
|
||||||
|
|
||||||
ret, _, _ := procControlTrace.Call(
|
|
||||||
uintptr(unsafe.Pointer(hTrace)),
|
|
||||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpSessionName))),
|
|
||||||
uintptr(unsafe.Pointer(props)),
|
|
||||||
uintptr(dwControl))
|
|
||||||
|
|
||||||
if ret == ERROR_SUCCESS {
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
e = errors.New(fmt.Sprintf("error: 0x%x", ret))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func StartTrace(lpSessionName string, props *EVENT_TRACE_PROPERTIES) (hTrace TRACEHANDLE, e error) {
|
|
||||||
|
|
||||||
ret, _, _ := procStartTrace.Call(
|
|
||||||
uintptr(unsafe.Pointer(&hTrace)),
|
|
||||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpSessionName))),
|
|
||||||
uintptr(unsafe.Pointer(props)))
|
|
||||||
|
|
||||||
if ret == ERROR_SUCCESS {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
e = errors.New(fmt.Sprintf("error: 0x%x", ret))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa378863(v=vs.85).aspx
|
|
||||||
func InitializeSecurityDescriptor(rev uint16) (pSecurityDescriptor *SECURITY_DESCRIPTOR, e error) {
|
|
||||||
|
|
||||||
pSecurityDescriptor = &SECURITY_DESCRIPTOR{}
|
|
||||||
|
|
||||||
ret, _, _ := procInitializeSecurityDescriptor.Call(
|
|
||||||
uintptr(unsafe.Pointer(pSecurityDescriptor)),
|
|
||||||
uintptr(rev),
|
|
||||||
)
|
|
||||||
|
|
||||||
if ret != 0 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
e = syscall.GetLastError()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa379583(v=vs.85).aspx
|
|
||||||
func SetSecurityDescriptorDacl(pSecurityDescriptor *SECURITY_DESCRIPTOR, pDacl *ACL) (e error) {
|
|
||||||
|
|
||||||
if pSecurityDescriptor == nil {
|
|
||||||
return errors.New("null descriptor")
|
|
||||||
}
|
|
||||||
|
|
||||||
var ret uintptr
|
|
||||||
if pDacl == nil {
|
|
||||||
ret, _, _ = procSetSecurityDescriptorDacl.Call(
|
|
||||||
uintptr(unsafe.Pointer(pSecurityDescriptor)),
|
|
||||||
uintptr(1), // DaclPresent
|
|
||||||
uintptr(0), // pDacl
|
|
||||||
uintptr(0), // DaclDefaulted
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
ret, _, _ = procSetSecurityDescriptorDacl.Call(
|
|
||||||
uintptr(unsafe.Pointer(pSecurityDescriptor)),
|
|
||||||
uintptr(1), // DaclPresent
|
|
||||||
uintptr(unsafe.Pointer(pDacl)),
|
|
||||||
uintptr(0), //DaclDefaulted
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
if ret != 0 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
e = syscall.GetLastError()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
300
vendor/github.com/apenwarr/w32/advapi32_constants.go
generated
vendored
300
vendor/github.com/apenwarr/w32/advapi32_constants.go
generated
vendored
|
|
@ -1,300 +0,0 @@
|
||||||
package w32
|
|
||||||
|
|
||||||
// Registry predefined keys
|
|
||||||
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
|
|
||||||
)
|
|
||||||
|
|
||||||
// Registry Key Security and Access Rights
|
|
||||||
const (
|
|
||||||
KEY_ALL_ACCESS = 0xF003F
|
|
||||||
KEY_CREATE_SUB_KEY = 0x0004
|
|
||||||
KEY_ENUMERATE_SUB_KEYS = 0x0008
|
|
||||||
KEY_NOTIFY = 0x0010
|
|
||||||
KEY_QUERY_VALUE = 0x0001
|
|
||||||
KEY_SET_VALUE = 0x0002
|
|
||||||
KEY_READ = 0x20019
|
|
||||||
KEY_WRITE = 0x20006
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
NFR_ANSI = 1
|
|
||||||
NFR_UNICODE = 2
|
|
||||||
NF_QUERY = 3
|
|
||||||
NF_REQUERY = 4
|
|
||||||
)
|
|
||||||
|
|
||||||
// Registry value types
|
|
||||||
const (
|
|
||||||
RRF_RT_REG_NONE = 0x00000001
|
|
||||||
RRF_RT_REG_SZ = 0x00000002
|
|
||||||
RRF_RT_REG_EXPAND_SZ = 0x00000004
|
|
||||||
RRF_RT_REG_BINARY = 0x00000008
|
|
||||||
RRF_RT_REG_DWORD = 0x00000010
|
|
||||||
RRF_RT_REG_MULTI_SZ = 0x00000020
|
|
||||||
RRF_RT_REG_QWORD = 0x00000040
|
|
||||||
RRF_RT_DWORD = (RRF_RT_REG_BINARY | RRF_RT_REG_DWORD)
|
|
||||||
RRF_RT_QWORD = (RRF_RT_REG_BINARY | RRF_RT_REG_QWORD)
|
|
||||||
RRF_RT_ANY = 0x0000ffff
|
|
||||||
RRF_NOEXPAND = 0x10000000
|
|
||||||
RRF_ZEROONFAILURE = 0x20000000
|
|
||||||
REG_PROCESS_APPKEY = 0x00000001
|
|
||||||
REG_MUI_STRING_TRUNCATE = 0x00000001
|
|
||||||
)
|
|
||||||
|
|
||||||
// Service Control Manager object specific access types
|
|
||||||
const (
|
|
||||||
SC_MANAGER_CONNECT = 0x0001
|
|
||||||
SC_MANAGER_CREATE_SERVICE = 0x0002
|
|
||||||
SC_MANAGER_ENUMERATE_SERVICE = 0x0004
|
|
||||||
SC_MANAGER_LOCK = 0x0008
|
|
||||||
SC_MANAGER_QUERY_LOCK_STATUS = 0x0010
|
|
||||||
SC_MANAGER_MODIFY_BOOT_CONFIG = 0x0020
|
|
||||||
SC_MANAGER_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SC_MANAGER_CONNECT | SC_MANAGER_CREATE_SERVICE | SC_MANAGER_ENUMERATE_SERVICE | SC_MANAGER_LOCK | SC_MANAGER_QUERY_LOCK_STATUS | SC_MANAGER_MODIFY_BOOT_CONFIG
|
|
||||||
)
|
|
||||||
|
|
||||||
// Service Types (Bit Mask)
|
|
||||||
const (
|
|
||||||
SERVICE_KERNEL_DRIVER = 0x00000001
|
|
||||||
SERVICE_FILE_SYSTEM_DRIVER = 0x00000002
|
|
||||||
SERVICE_ADAPTER = 0x00000004
|
|
||||||
SERVICE_RECOGNIZER_DRIVER = 0x00000008
|
|
||||||
SERVICE_DRIVER = SERVICE_KERNEL_DRIVER | SERVICE_FILE_SYSTEM_DRIVER | SERVICE_RECOGNIZER_DRIVER
|
|
||||||
SERVICE_WIN32_OWN_PROCESS = 0x00000010
|
|
||||||
SERVICE_WIN32_SHARE_PROCESS = 0x00000020
|
|
||||||
SERVICE_WIN32 = SERVICE_WIN32_OWN_PROCESS | SERVICE_WIN32_SHARE_PROCESS
|
|
||||||
SERVICE_INTERACTIVE_PROCESS = 0x00000100
|
|
||||||
SERVICE_TYPE_ALL = SERVICE_WIN32 | SERVICE_ADAPTER | SERVICE_DRIVER | SERVICE_INTERACTIVE_PROCESS
|
|
||||||
)
|
|
||||||
|
|
||||||
// Service State -- for CurrentState
|
|
||||||
const (
|
|
||||||
SERVICE_STOPPED = 0x00000001
|
|
||||||
SERVICE_START_PENDING = 0x00000002
|
|
||||||
SERVICE_STOP_PENDING = 0x00000003
|
|
||||||
SERVICE_RUNNING = 0x00000004
|
|
||||||
SERVICE_CONTINUE_PENDING = 0x00000005
|
|
||||||
SERVICE_PAUSE_PENDING = 0x00000006
|
|
||||||
SERVICE_PAUSED = 0x00000007
|
|
||||||
)
|
|
||||||
|
|
||||||
// Controls Accepted (Bit Mask)
|
|
||||||
const (
|
|
||||||
SERVICE_ACCEPT_STOP = 0x00000001
|
|
||||||
SERVICE_ACCEPT_PAUSE_CONTINUE = 0x00000002
|
|
||||||
SERVICE_ACCEPT_SHUTDOWN = 0x00000004
|
|
||||||
SERVICE_ACCEPT_PARAMCHANGE = 0x00000008
|
|
||||||
SERVICE_ACCEPT_NETBINDCHANGE = 0x00000010
|
|
||||||
SERVICE_ACCEPT_HARDWAREPROFILECHANGE = 0x00000020
|
|
||||||
SERVICE_ACCEPT_POWEREVENT = 0x00000040
|
|
||||||
SERVICE_ACCEPT_SESSIONCHANGE = 0x00000080
|
|
||||||
SERVICE_ACCEPT_PRESHUTDOWN = 0x00000100
|
|
||||||
SERVICE_ACCEPT_TIMECHANGE = 0x00000200
|
|
||||||
SERVICE_ACCEPT_TRIGGEREVENT = 0x00000400
|
|
||||||
)
|
|
||||||
|
|
||||||
// Service object specific access type
|
|
||||||
const (
|
|
||||||
SERVICE_QUERY_CONFIG = 0x0001
|
|
||||||
SERVICE_CHANGE_CONFIG = 0x0002
|
|
||||||
SERVICE_QUERY_STATUS = 0x0004
|
|
||||||
SERVICE_ENUMERATE_DEPENDENTS = 0x0008
|
|
||||||
SERVICE_START = 0x0010
|
|
||||||
SERVICE_STOP = 0x0020
|
|
||||||
SERVICE_PAUSE_CONTINUE = 0x0040
|
|
||||||
SERVICE_INTERROGATE = 0x0080
|
|
||||||
SERVICE_USER_DEFINED_CONTROL = 0x0100
|
|
||||||
|
|
||||||
SERVICE_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED |
|
|
||||||
SERVICE_QUERY_CONFIG |
|
|
||||||
SERVICE_CHANGE_CONFIG |
|
|
||||||
SERVICE_QUERY_STATUS |
|
|
||||||
SERVICE_ENUMERATE_DEPENDENTS |
|
|
||||||
SERVICE_START |
|
|
||||||
SERVICE_STOP |
|
|
||||||
SERVICE_PAUSE_CONTINUE |
|
|
||||||
SERVICE_INTERROGATE |
|
|
||||||
SERVICE_USER_DEFINED_CONTROL
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
KERNEL_LOGGER_NAME = "NT Kernel Logger"
|
|
||||||
)
|
|
||||||
|
|
||||||
// WNODE flags, for ETW (Event Tracing for Windows) / WMI
|
|
||||||
const (
|
|
||||||
WNODE_FLAG_ALL_DATA = 0x00000001
|
|
||||||
WNODE_FLAG_SINGLE_INSTANCE = 0x00000002
|
|
||||||
WNODE_FLAG_SINGLE_ITEM = 0x00000004
|
|
||||||
WNODE_FLAG_EVENT_ITEM = 0x00000008
|
|
||||||
WNODE_FLAG_FIXED_INSTANCE_SIZE = 0x00000010
|
|
||||||
WNODE_FLAG_TOO_SMALL = 0x00000020
|
|
||||||
WNODE_FLAG_INSTANCES_SAME = 0x00000040
|
|
||||||
WNODE_FLAG_STATIC_INSTANCE_NAMES = 0x00000080
|
|
||||||
WNODE_FLAG_INTERNAL = 0x00000100
|
|
||||||
WNODE_FLAG_USE_TIMESTAMP = 0x00000200
|
|
||||||
WNODE_FLAG_PERSIST_EVENT = 0x00000400
|
|
||||||
WNODE_FLAG_EVENT_REFERENCE = 0x00002000
|
|
||||||
WNODE_FLAG_ANSI_INSTANCENAMES = 0x00004000
|
|
||||||
WNODE_FLAG_METHOD_ITEM = 0x00008000
|
|
||||||
WNODE_FLAG_PDO_INSTANCE_NAMES = 0x00010000
|
|
||||||
WNODE_FLAG_TRACED_GUID = 0x00020000
|
|
||||||
WNODE_FLAG_LOG_WNODE = 0x00040000
|
|
||||||
WNODE_FLAG_USE_GUID_PTR = 0x00080000
|
|
||||||
WNODE_FLAG_USE_MOF_PTR = 0x00100000
|
|
||||||
WNODE_FLAG_NO_HEADER = 0x00200000
|
|
||||||
WNODE_FLAG_SEVERITY_MASK = 0xff000000
|
|
||||||
)
|
|
||||||
|
|
||||||
// ETW flags and types etc
|
|
||||||
const (
|
|
||||||
EVENT_TRACE_TYPE_INFO = 0x00
|
|
||||||
EVENT_TRACE_TYPE_START = 0x01
|
|
||||||
EVENT_TRACE_TYPE_END = 0x02
|
|
||||||
EVENT_TRACE_TYPE_STOP = 0x02
|
|
||||||
EVENT_TRACE_TYPE_DC_START = 0x03
|
|
||||||
EVENT_TRACE_TYPE_DC_END = 0x04
|
|
||||||
EVENT_TRACE_TYPE_EXTENSION = 0x05
|
|
||||||
EVENT_TRACE_TYPE_REPLY = 0x06
|
|
||||||
EVENT_TRACE_TYPE_DEQUEUE = 0x07
|
|
||||||
EVENT_TRACE_TYPE_RESUME = 0x07
|
|
||||||
EVENT_TRACE_TYPE_CHECKPOINT = 0x08
|
|
||||||
EVENT_TRACE_TYPE_SUSPEND = 0x08
|
|
||||||
EVENT_TRACE_TYPE_WINEVT_SEND = 0x09
|
|
||||||
EVENT_TRACE_TYPE_WINEVT_RECEIVE = 0XF0
|
|
||||||
TRACE_LEVEL_NONE = 0
|
|
||||||
TRACE_LEVEL_CRITICAL = 1
|
|
||||||
TRACE_LEVEL_FATAL = 1
|
|
||||||
TRACE_LEVEL_ERROR = 2
|
|
||||||
TRACE_LEVEL_WARNING = 3
|
|
||||||
TRACE_LEVEL_INFORMATION = 4
|
|
||||||
TRACE_LEVEL_VERBOSE = 5
|
|
||||||
TRACE_LEVEL_RESERVED6 = 6
|
|
||||||
TRACE_LEVEL_RESERVED7 = 7
|
|
||||||
TRACE_LEVEL_RESERVED8 = 8
|
|
||||||
TRACE_LEVEL_RESERVED9 = 9
|
|
||||||
EVENT_TRACE_TYPE_LOAD = 0x0A
|
|
||||||
EVENT_TRACE_TYPE_IO_READ = 0x0A
|
|
||||||
EVENT_TRACE_TYPE_IO_WRITE = 0x0B
|
|
||||||
EVENT_TRACE_TYPE_IO_READ_INIT = 0x0C
|
|
||||||
EVENT_TRACE_TYPE_IO_WRITE_INIT = 0x0D
|
|
||||||
EVENT_TRACE_TYPE_IO_FLUSH = 0x0E
|
|
||||||
EVENT_TRACE_TYPE_IO_FLUSH_INIT = 0x0F
|
|
||||||
EVENT_TRACE_TYPE_MM_TF = 0x0A
|
|
||||||
EVENT_TRACE_TYPE_MM_DZF = 0x0B
|
|
||||||
EVENT_TRACE_TYPE_MM_COW = 0x0C
|
|
||||||
EVENT_TRACE_TYPE_MM_GPF = 0x0D
|
|
||||||
EVENT_TRACE_TYPE_MM_HPF = 0x0E
|
|
||||||
EVENT_TRACE_TYPE_MM_AV = 0x0F
|
|
||||||
EVENT_TRACE_TYPE_SEND = 0x0A
|
|
||||||
EVENT_TRACE_TYPE_RECEIVE = 0x0B
|
|
||||||
EVENT_TRACE_TYPE_CONNECT = 0x0C
|
|
||||||
EVENT_TRACE_TYPE_DISCONNECT = 0x0D
|
|
||||||
EVENT_TRACE_TYPE_RETRANSMIT = 0x0E
|
|
||||||
EVENT_TRACE_TYPE_ACCEPT = 0x0F
|
|
||||||
EVENT_TRACE_TYPE_RECONNECT = 0x10
|
|
||||||
EVENT_TRACE_TYPE_CONNFAIL = 0x11
|
|
||||||
EVENT_TRACE_TYPE_COPY_TCP = 0x12
|
|
||||||
EVENT_TRACE_TYPE_COPY_ARP = 0x13
|
|
||||||
EVENT_TRACE_TYPE_ACKFULL = 0x14
|
|
||||||
EVENT_TRACE_TYPE_ACKPART = 0x15
|
|
||||||
EVENT_TRACE_TYPE_ACKDUP = 0x16
|
|
||||||
EVENT_TRACE_TYPE_GUIDMAP = 0x0A
|
|
||||||
EVENT_TRACE_TYPE_CONFIG = 0x0B
|
|
||||||
EVENT_TRACE_TYPE_SIDINFO = 0x0C
|
|
||||||
EVENT_TRACE_TYPE_SECURITY = 0x0D
|
|
||||||
EVENT_TRACE_TYPE_REGCREATE = 0x0A
|
|
||||||
EVENT_TRACE_TYPE_REGOPEN = 0x0B
|
|
||||||
EVENT_TRACE_TYPE_REGDELETE = 0x0C
|
|
||||||
EVENT_TRACE_TYPE_REGQUERY = 0x0D
|
|
||||||
EVENT_TRACE_TYPE_REGSETVALUE = 0x0E
|
|
||||||
EVENT_TRACE_TYPE_REGDELETEVALUE = 0x0F
|
|
||||||
EVENT_TRACE_TYPE_REGQUERYVALUE = 0x10
|
|
||||||
EVENT_TRACE_TYPE_REGENUMERATEKEY = 0x11
|
|
||||||
EVENT_TRACE_TYPE_REGENUMERATEVALUEKEY = 0x12
|
|
||||||
EVENT_TRACE_TYPE_REGQUERYMULTIPLEVALUE = 0x13
|
|
||||||
EVENT_TRACE_TYPE_REGSETINFORMATION = 0x14
|
|
||||||
EVENT_TRACE_TYPE_REGFLUSH = 0x15
|
|
||||||
EVENT_TRACE_TYPE_REGKCBCREATE = 0x16
|
|
||||||
EVENT_TRACE_TYPE_REGKCBDELETE = 0x17
|
|
||||||
EVENT_TRACE_TYPE_REGKCBRUNDOWNBEGIN = 0x18
|
|
||||||
EVENT_TRACE_TYPE_REGKCBRUNDOWNEND = 0x19
|
|
||||||
EVENT_TRACE_TYPE_REGVIRTUALIZE = 0x1A
|
|
||||||
EVENT_TRACE_TYPE_REGCLOSE = 0x1B
|
|
||||||
EVENT_TRACE_TYPE_REGSETSECURITY = 0x1C
|
|
||||||
EVENT_TRACE_TYPE_REGQUERYSECURITY = 0x1D
|
|
||||||
EVENT_TRACE_TYPE_REGCOMMIT = 0x1E
|
|
||||||
EVENT_TRACE_TYPE_REGPREPARE = 0x1F
|
|
||||||
EVENT_TRACE_TYPE_REGROLLBACK = 0x20
|
|
||||||
EVENT_TRACE_TYPE_REGMOUNTHIVE = 0x21
|
|
||||||
EVENT_TRACE_TYPE_CONFIG_CPU = 0x0A
|
|
||||||
EVENT_TRACE_TYPE_CONFIG_PHYSICALDISK = 0x0B
|
|
||||||
EVENT_TRACE_TYPE_CONFIG_LOGICALDISK = 0x0C
|
|
||||||
EVENT_TRACE_TYPE_CONFIG_NIC = 0x0D
|
|
||||||
EVENT_TRACE_TYPE_CONFIG_VIDEO = 0x0E
|
|
||||||
EVENT_TRACE_TYPE_CONFIG_SERVICES = 0x0F
|
|
||||||
EVENT_TRACE_TYPE_CONFIG_POWER = 0x10
|
|
||||||
EVENT_TRACE_TYPE_CONFIG_NETINFO = 0x11
|
|
||||||
EVENT_TRACE_TYPE_CONFIG_IRQ = 0x15
|
|
||||||
EVENT_TRACE_TYPE_CONFIG_PNP = 0x16
|
|
||||||
EVENT_TRACE_TYPE_CONFIG_IDECHANNEL = 0x17
|
|
||||||
EVENT_TRACE_TYPE_CONFIG_PLATFORM = 0x19
|
|
||||||
EVENT_TRACE_FLAG_PROCESS = 0x00000001
|
|
||||||
EVENT_TRACE_FLAG_THREAD = 0x00000002
|
|
||||||
EVENT_TRACE_FLAG_IMAGE_LOAD = 0x00000004
|
|
||||||
EVENT_TRACE_FLAG_DISK_IO = 0x00000100
|
|
||||||
EVENT_TRACE_FLAG_DISK_FILE_IO = 0x00000200
|
|
||||||
EVENT_TRACE_FLAG_MEMORY_PAGE_FAULTS = 0x00001000
|
|
||||||
EVENT_TRACE_FLAG_MEMORY_HARD_FAULTS = 0x00002000
|
|
||||||
EVENT_TRACE_FLAG_NETWORK_TCPIP = 0x00010000
|
|
||||||
EVENT_TRACE_FLAG_REGISTRY = 0x00020000
|
|
||||||
EVENT_TRACE_FLAG_DBGPRINT = 0x00040000
|
|
||||||
EVENT_TRACE_FLAG_PROCESS_COUNTERS = 0x00000008
|
|
||||||
EVENT_TRACE_FLAG_CSWITCH = 0x00000010
|
|
||||||
EVENT_TRACE_FLAG_DPC = 0x00000020
|
|
||||||
EVENT_TRACE_FLAG_INTERRUPT = 0x00000040
|
|
||||||
EVENT_TRACE_FLAG_SYSTEMCALL = 0x00000080
|
|
||||||
EVENT_TRACE_FLAG_DISK_IO_INIT = 0x00000400
|
|
||||||
EVENT_TRACE_FLAG_ALPC = 0x00100000
|
|
||||||
EVENT_TRACE_FLAG_SPLIT_IO = 0x00200000
|
|
||||||
EVENT_TRACE_FLAG_DRIVER = 0x00800000
|
|
||||||
EVENT_TRACE_FLAG_PROFILE = 0x01000000
|
|
||||||
EVENT_TRACE_FLAG_FILE_IO = 0x02000000
|
|
||||||
EVENT_TRACE_FLAG_FILE_IO_INIT = 0x04000000
|
|
||||||
EVENT_TRACE_FLAG_DISPATCHER = 0x00000800
|
|
||||||
EVENT_TRACE_FLAG_VIRTUAL_ALLOC = 0x00004000
|
|
||||||
EVENT_TRACE_FLAG_EXTENSION = 0x80000000
|
|
||||||
EVENT_TRACE_FLAG_FORWARD_WMI = 0x40000000
|
|
||||||
EVENT_TRACE_FLAG_ENABLE_RESERVE = 0x20000000
|
|
||||||
EVENT_TRACE_FILE_MODE_NONE = 0x00000000
|
|
||||||
EVENT_TRACE_FILE_MODE_SEQUENTIAL = 0x00000001
|
|
||||||
EVENT_TRACE_FILE_MODE_CIRCULAR = 0x00000002
|
|
||||||
EVENT_TRACE_FILE_MODE_APPEND = 0x00000004
|
|
||||||
EVENT_TRACE_REAL_TIME_MODE = 0x00000100
|
|
||||||
EVENT_TRACE_DELAY_OPEN_FILE_MODE = 0x00000200
|
|
||||||
EVENT_TRACE_BUFFERING_MODE = 0x00000400
|
|
||||||
EVENT_TRACE_PRIVATE_LOGGER_MODE = 0x00000800
|
|
||||||
EVENT_TRACE_ADD_HEADER_MODE = 0x00001000
|
|
||||||
EVENT_TRACE_USE_GLOBAL_SEQUENCE = 0x00004000
|
|
||||||
EVENT_TRACE_USE_LOCAL_SEQUENCE = 0x00008000
|
|
||||||
EVENT_TRACE_RELOG_MODE = 0x00010000
|
|
||||||
EVENT_TRACE_USE_PAGED_MEMORY = 0x01000000
|
|
||||||
EVENT_TRACE_FILE_MODE_NEWFILE = 0x00000008
|
|
||||||
EVENT_TRACE_FILE_MODE_PREALLOCATE = 0x00000020
|
|
||||||
EVENT_TRACE_NONSTOPPABLE_MODE = 0x00000040
|
|
||||||
EVENT_TRACE_SECURE_MODE = 0x00000080
|
|
||||||
EVENT_TRACE_USE_KBYTES_FOR_SIZE = 0x00002000
|
|
||||||
EVENT_TRACE_PRIVATE_IN_PROC = 0x00020000
|
|
||||||
EVENT_TRACE_MODE_RESERVED = 0x00100000
|
|
||||||
EVENT_TRACE_NO_PER_PROCESSOR_BUFFERING = 0x10000000
|
|
||||||
EVENT_TRACE_CONTROL_QUERY = 0
|
|
||||||
EVENT_TRACE_CONTROL_STOP = 1
|
|
||||||
EVENT_TRACE_CONTROL_UPDATE = 2
|
|
||||||
EVENT_TRACE_CONTROL_FLUSH = 3
|
|
||||||
)
|
|
||||||
122
vendor/github.com/apenwarr/w32/advapi32_typedef.go
generated
vendored
122
vendor/github.com/apenwarr/w32/advapi32_typedef.go
generated
vendored
|
|
@ -1,122 +0,0 @@
|
||||||
package w32
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa374931(v=vs.85).aspx
|
|
||||||
type ACL struct {
|
|
||||||
AclRevision byte
|
|
||||||
Sbz1 byte
|
|
||||||
AclSize uint16
|
|
||||||
AceCount uint16
|
|
||||||
Sbz2 uint16
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa379561(v=vs.85).aspx
|
|
||||||
|
|
||||||
type SECURITY_DESCRIPTOR_CONTROL uint16
|
|
||||||
|
|
||||||
type SECURITY_DESCRIPTOR struct {
|
|
||||||
Revision byte
|
|
||||||
Sbz1 byte
|
|
||||||
Control SECURITY_DESCRIPTOR_CONTROL
|
|
||||||
Owner uintptr
|
|
||||||
Group uintptr
|
|
||||||
Sacl *ACL
|
|
||||||
Dacl *ACL
|
|
||||||
}
|
|
||||||
|
|
||||||
type SID_IDENTIFIER_AUTHORITY struct {
|
|
||||||
Value [6]byte
|
|
||||||
}
|
|
||||||
|
|
||||||
// typedef struct _SID // 4 elements, 0xC bytes (sizeof)
|
|
||||||
// {
|
|
||||||
// /*0x000*/ UINT8 Revision;
|
|
||||||
// /*0x001*/ UINT8 SubAuthorityCount;
|
|
||||||
// /*0x002*/ struct _SID_IDENTIFIER_AUTHORITY IdentifierAuthority; // 1 elements, 0x6 bytes (sizeof)
|
|
||||||
// /*0x008*/ ULONG32 SubAuthority[1];
|
|
||||||
// }SID, *PSID;
|
|
||||||
type SID struct {
|
|
||||||
Revision byte
|
|
||||||
SubAuthorityCount byte
|
|
||||||
IdentifierAuthority SID_IDENTIFIER_AUTHORITY
|
|
||||||
SubAuthority uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa363646.aspx
|
|
||||||
type EVENTLOGRECORD struct {
|
|
||||||
Length uint32
|
|
||||||
Reserved uint32
|
|
||||||
RecordNumber uint32
|
|
||||||
TimeGenerated uint32
|
|
||||||
TimeWritten uint32
|
|
||||||
EventID uint32
|
|
||||||
EventType uint16
|
|
||||||
NumStrings uint16
|
|
||||||
EventCategory uint16
|
|
||||||
ReservedFlags uint16
|
|
||||||
ClosingRecordNumber uint32
|
|
||||||
StringOffset uint32
|
|
||||||
UserSidLength uint32
|
|
||||||
UserSidOffset uint32
|
|
||||||
DataLength uint32
|
|
||||||
DataOffset uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms685996.aspx
|
|
||||||
type SERVICE_STATUS struct {
|
|
||||||
DwServiceType uint32
|
|
||||||
DwCurrentState uint32
|
|
||||||
DwControlsAccepted uint32
|
|
||||||
DwWin32ExitCode uint32
|
|
||||||
DwServiceSpecificExitCode uint32
|
|
||||||
DwCheckPoint uint32
|
|
||||||
DwWaitHint uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa364160(v=vs.85).aspx
|
|
||||||
type WNODE_HEADER struct {
|
|
||||||
BufferSize uint32
|
|
||||||
ProviderId uint32
|
|
||||||
HistoricalContext uint64
|
|
||||||
KernelHandle HANDLE
|
|
||||||
Guid GUID
|
|
||||||
ClientContext uint32
|
|
||||||
Flags uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
// These partially compensate for the anonymous unions we removed, but there
|
|
||||||
// are no setters.
|
|
||||||
func (w WNODE_HEADER) TimeStamp() uint64 {
|
|
||||||
// TODO: Cast to the stupid LARGE_INTEGER struct which is, itself, nasty
|
|
||||||
// and union-y
|
|
||||||
return uint64(w.KernelHandle)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w WNODE_HEADER) Version() uint32 {
|
|
||||||
return uint32(w.HistoricalContext >> 32)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w WNODE_HEADER) Linkage() uint32 {
|
|
||||||
return uint32(w.HistoricalContext)
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa363784(v=vs.85).aspx
|
|
||||||
type EVENT_TRACE_PROPERTIES struct {
|
|
||||||
Wnode WNODE_HEADER
|
|
||||||
BufferSize uint32
|
|
||||||
MinimumBuffers uint32
|
|
||||||
MaximumBuffers uint32
|
|
||||||
MaximumFileSize uint32
|
|
||||||
LogFileMode uint32
|
|
||||||
FlushTimer uint32
|
|
||||||
EnableFlags uint32
|
|
||||||
AgeLimit int32
|
|
||||||
NumberOfBuffers uint32
|
|
||||||
FreeBuffers uint32
|
|
||||||
EventsLost uint32
|
|
||||||
BuffersWritten uint32
|
|
||||||
LogBuffersLost uint32
|
|
||||||
RealTimeBuffersLost uint32
|
|
||||||
LoggerThreadId HANDLE
|
|
||||||
LogFileNameOffset uint32
|
|
||||||
LoggerNameOffset uint32
|
|
||||||
}
|
|
||||||
304
vendor/github.com/apenwarr/w32/alpc.go
generated
vendored
304
vendor/github.com/apenwarr/w32/alpc.go
generated
vendored
|
|
@ -1,304 +0,0 @@
|
||||||
// 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 (
|
|
||||||
"fmt"
|
|
||||||
// "github.com/davecgh/go-spew/spew"
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
modntdll = syscall.NewLazyDLL("ntdll.dll")
|
|
||||||
|
|
||||||
procAlpcGetMessageAttribute = modntdll.NewProc("AlpcGetMessageAttribute")
|
|
||||||
procNtAlpcAcceptConnectPort = modntdll.NewProc("NtAlpcAcceptConnectPort")
|
|
||||||
procNtAlpcCancelMessage = modntdll.NewProc("NtAlpcCancelMessage")
|
|
||||||
procNtAlpcConnectPort = modntdll.NewProc("NtAlpcConnectPort")
|
|
||||||
procNtAlpcCreatePort = modntdll.NewProc("NtAlpcCreatePort")
|
|
||||||
procNtAlpcDisconnectPort = modntdll.NewProc("NtAlpcDisconnectPort")
|
|
||||||
procNtAlpcSendWaitReceivePort = modntdll.NewProc("NtAlpcSendWaitReceivePort")
|
|
||||||
procRtlCreateUnicodeStringFromAsciiz = modntdll.NewProc("RtlCreateUnicodeStringFromAsciiz")
|
|
||||||
)
|
|
||||||
|
|
||||||
//func RtlCreateUnicodeStringFromAsciiz(s string) (us UNICODE_STRING, e error) {
|
|
||||||
//
|
|
||||||
// cs := C.CString(s)
|
|
||||||
// defer C.free(unsafe.Pointer(cs))
|
|
||||||
//
|
|
||||||
// ret, _, lastErr := procRtlCreateUnicodeStringFromAsciiz.Call(
|
|
||||||
// uintptr(unsafe.Pointer(&us)),
|
|
||||||
// uintptr(unsafe.Pointer(cs)),
|
|
||||||
// )
|
|
||||||
//
|
|
||||||
// if ret != 1 { // ret is a BOOL ( I think )
|
|
||||||
// e = lastErr
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// return
|
|
||||||
//}
|
|
||||||
|
|
||||||
//func newUnicodeString(s string) (us UNICODE_STRING, e error) {
|
|
||||||
// // TODO probably not the most efficient way to do this, but I couldn't
|
|
||||||
// // work out how to manually initialize the UNICODE_STRING struct in a way
|
|
||||||
// // that the ALPC subsystem liked.
|
|
||||||
// us, e = RtlCreateUnicodeStringFromAsciiz(s)
|
|
||||||
// return
|
|
||||||
//}
|
|
||||||
|
|
||||||
// (this is a macro)
|
|
||||||
// VOID InitializeObjectAttributes(
|
|
||||||
// [out] POBJECT_ATTRIBUTES InitializedAttributes,
|
|
||||||
// [in] PUNICODE_STRING ObjectName,
|
|
||||||
// [in] ULONG Attributes,
|
|
||||||
// [in] HANDLE RootDirectory,
|
|
||||||
// [in, optional] PSECURITY_DESCRIPTOR SecurityDescriptor
|
|
||||||
// )
|
|
||||||
//func InitializeObjectAttributes(
|
|
||||||
// name string,
|
|
||||||
// attributes uint32,
|
|
||||||
// rootDir HANDLE,
|
|
||||||
// pSecurityDescriptor *SECURITY_DESCRIPTOR,
|
|
||||||
//) (oa OBJECT_ATTRIBUTES, e error) {
|
|
||||||
//
|
|
||||||
// oa = OBJECT_ATTRIBUTES{
|
|
||||||
// RootDirectory: rootDir,
|
|
||||||
// Attributes: attributes,
|
|
||||||
// SecurityDescriptor: pSecurityDescriptor,
|
|
||||||
// }
|
|
||||||
// oa.Length = uint32(unsafe.Sizeof(oa))
|
|
||||||
//
|
|
||||||
// if len(name) > 0 {
|
|
||||||
// us, err := newUnicodeString(name)
|
|
||||||
// if err != nil {
|
|
||||||
// e = err
|
|
||||||
// return
|
|
||||||
// }
|
|
||||||
// oa.ObjectName = &us
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// return
|
|
||||||
//}
|
|
||||||
|
|
||||||
// NTSTATUS
|
|
||||||
// NtAlpcCreatePort(
|
|
||||||
// __out PHANDLE PortHandle,
|
|
||||||
// __in POBJECT_ATTRIBUTES ObjectAttributes,
|
|
||||||
// __in_opt PALPC_PORT_ATTRIBUTES PortAttributes
|
|
||||||
// );
|
|
||||||
func NtAlpcCreatePort(pObjectAttributes *OBJECT_ATTRIBUTES, pPortAttributes *ALPC_PORT_ATTRIBUTES) (hPort HANDLE, e error) {
|
|
||||||
|
|
||||||
ret, _, _ := procNtAlpcCreatePort.Call(
|
|
||||||
uintptr(unsafe.Pointer(&hPort)),
|
|
||||||
uintptr(unsafe.Pointer(pObjectAttributes)),
|
|
||||||
uintptr(unsafe.Pointer(pPortAttributes)),
|
|
||||||
)
|
|
||||||
|
|
||||||
if ret != ERROR_SUCCESS {
|
|
||||||
return hPort, fmt.Errorf("0x%x", ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// NTSTATUS
|
|
||||||
// NtAlpcConnectPort(
|
|
||||||
// __out PHANDLE PortHandle,
|
|
||||||
// __in PUNICODE_STRING PortName,
|
|
||||||
// __in POBJECT_ATTRIBUTES ObjectAttributes,
|
|
||||||
// __in_opt PALPC_PORT_ATTRIBUTES PortAttributes,
|
|
||||||
// __in ULONG Flags,
|
|
||||||
// __in_opt PSID RequiredServerSid,
|
|
||||||
// __inout PPORT_MESSAGE ConnectionMessage,
|
|
||||||
// __inout_opt PULONG BufferLength,
|
|
||||||
// __inout_opt PALPC_MESSAGE_ATTRIBUTES OutMessageAttributes,
|
|
||||||
// __inout_opt PALPC_MESSAGE_ATTRIBUTES InMessageAttributes,
|
|
||||||
// __in_opt PLARGE_INTEGER Timeout
|
|
||||||
// );
|
|
||||||
//func NtAlpcConnectPort(
|
|
||||||
// destPort string,
|
|
||||||
// pClientObjAttrs *OBJECT_ATTRIBUTES,
|
|
||||||
// pClientAlpcPortAttrs *ALPC_PORT_ATTRIBUTES,
|
|
||||||
// flags uint32,
|
|
||||||
// pRequiredServerSid *SID,
|
|
||||||
// pConnMsg *AlpcShortMessage,
|
|
||||||
// pBufLen *uint32,
|
|
||||||
// pOutMsgAttrs *ALPC_MESSAGE_ATTRIBUTES,
|
|
||||||
// pInMsgAttrs *ALPC_MESSAGE_ATTRIBUTES,
|
|
||||||
// timeout *int64,
|
|
||||||
//) (hPort HANDLE, e error) {
|
|
||||||
//
|
|
||||||
// destPortU, e := newUnicodeString(destPort)
|
|
||||||
// if e != nil {
|
|
||||||
// return
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// ret, _, _ := procNtAlpcConnectPort.Call(
|
|
||||||
// uintptr(unsafe.Pointer(&hPort)),
|
|
||||||
// uintptr(unsafe.Pointer(&destPortU)),
|
|
||||||
// uintptr(unsafe.Pointer(pClientObjAttrs)),
|
|
||||||
// uintptr(unsafe.Pointer(pClientAlpcPortAttrs)),
|
|
||||||
// uintptr(flags),
|
|
||||||
// uintptr(unsafe.Pointer(pRequiredServerSid)),
|
|
||||||
// uintptr(unsafe.Pointer(pConnMsg)),
|
|
||||||
// uintptr(unsafe.Pointer(pBufLen)),
|
|
||||||
// uintptr(unsafe.Pointer(pOutMsgAttrs)),
|
|
||||||
// uintptr(unsafe.Pointer(pInMsgAttrs)),
|
|
||||||
// uintptr(unsafe.Pointer(timeout)),
|
|
||||||
// )
|
|
||||||
//
|
|
||||||
// if ret != ERROR_SUCCESS {
|
|
||||||
// e = fmt.Errorf("0x%x", ret)
|
|
||||||
// }
|
|
||||||
// return
|
|
||||||
//}
|
|
||||||
|
|
||||||
// NTSTATUS
|
|
||||||
// NtAlpcAcceptConnectPort(
|
|
||||||
// __out PHANDLE PortHandle,
|
|
||||||
// __in HANDLE ConnectionPortHandle,
|
|
||||||
// __in ULONG Flags,
|
|
||||||
// __in POBJECT_ATTRIBUTES ObjectAttributes,
|
|
||||||
// __in PALPC_PORT_ATTRIBUTES PortAttributes,
|
|
||||||
// __in_opt PVOID PortContext,
|
|
||||||
// __in PPORT_MESSAGE ConnectionRequest,
|
|
||||||
// __inout_opt PALPC_MESSAGE_ATTRIBUTES ConnectionMessageAttributes,
|
|
||||||
// __in BOOLEAN AcceptConnection
|
|
||||||
// );
|
|
||||||
func NtAlpcAcceptConnectPort(
|
|
||||||
hSrvConnPort HANDLE,
|
|
||||||
flags uint32,
|
|
||||||
pObjAttr *OBJECT_ATTRIBUTES,
|
|
||||||
pPortAttr *ALPC_PORT_ATTRIBUTES,
|
|
||||||
pContext *AlpcPortContext,
|
|
||||||
pConnReq *AlpcShortMessage,
|
|
||||||
pConnMsgAttrs *ALPC_MESSAGE_ATTRIBUTES,
|
|
||||||
accept uintptr,
|
|
||||||
) (hPort HANDLE, e error) {
|
|
||||||
|
|
||||||
ret, _, _ := procNtAlpcAcceptConnectPort.Call(
|
|
||||||
uintptr(unsafe.Pointer(&hPort)),
|
|
||||||
uintptr(hSrvConnPort),
|
|
||||||
uintptr(flags),
|
|
||||||
uintptr(unsafe.Pointer(pObjAttr)),
|
|
||||||
uintptr(unsafe.Pointer(pPortAttr)),
|
|
||||||
uintptr(unsafe.Pointer(pContext)),
|
|
||||||
uintptr(unsafe.Pointer(pConnReq)),
|
|
||||||
uintptr(unsafe.Pointer(pConnMsgAttrs)),
|
|
||||||
accept,
|
|
||||||
)
|
|
||||||
|
|
||||||
if ret != ERROR_SUCCESS {
|
|
||||||
e = fmt.Errorf("0x%x", ret)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// NTSTATUS
|
|
||||||
// NtAlpcSendWaitReceivePort(
|
|
||||||
// __in HANDLE PortHandle,
|
|
||||||
// __in ULONG Flags,
|
|
||||||
// __in_opt PPORT_MESSAGE SendMessage,
|
|
||||||
// __in_opt PALPC_MESSAGE_ATTRIBUTES SendMessageAttributes,
|
|
||||||
// __inout_opt PPORT_MESSAGE ReceiveMessage,
|
|
||||||
// __inout_opt PULONG BufferLength,
|
|
||||||
// __inout_opt PALPC_MESSAGE_ATTRIBUTES ReceiveMessageAttributes,
|
|
||||||
// __in_opt PLARGE_INTEGER Timeout
|
|
||||||
// );
|
|
||||||
func NtAlpcSendWaitReceivePort(
|
|
||||||
hPort HANDLE,
|
|
||||||
flags uint32,
|
|
||||||
sendMsg *AlpcShortMessage, // Should actually point to PORT_MESSAGE + payload
|
|
||||||
sendMsgAttrs *ALPC_MESSAGE_ATTRIBUTES,
|
|
||||||
recvMsg *AlpcShortMessage,
|
|
||||||
recvBufLen *uint32,
|
|
||||||
recvMsgAttrs *ALPC_MESSAGE_ATTRIBUTES,
|
|
||||||
timeout *int64, // use native int64
|
|
||||||
) (e error) {
|
|
||||||
|
|
||||||
ret, _, _ := procNtAlpcSendWaitReceivePort.Call(
|
|
||||||
uintptr(hPort),
|
|
||||||
uintptr(flags),
|
|
||||||
uintptr(unsafe.Pointer(sendMsg)),
|
|
||||||
uintptr(unsafe.Pointer(sendMsgAttrs)),
|
|
||||||
uintptr(unsafe.Pointer(recvMsg)),
|
|
||||||
uintptr(unsafe.Pointer(recvBufLen)),
|
|
||||||
uintptr(unsafe.Pointer(recvMsgAttrs)),
|
|
||||||
uintptr(unsafe.Pointer(timeout)),
|
|
||||||
)
|
|
||||||
|
|
||||||
if ret != ERROR_SUCCESS {
|
|
||||||
e = fmt.Errorf("0x%x", ret)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// NTSYSAPI
|
|
||||||
// PVOID
|
|
||||||
// NTAPI
|
|
||||||
// AlpcGetMessageAttribute(
|
|
||||||
// __in PALPC_MESSAGE_ATTRIBUTES Buffer,
|
|
||||||
// __in ULONG AttributeFlag
|
|
||||||
// );
|
|
||||||
|
|
||||||
// This basically returns a pointer to the correct struct for whichever
|
|
||||||
// message attribute you asked for. In Go terms, it returns unsafe.Pointer
|
|
||||||
// which you should then cast. Example:
|
|
||||||
|
|
||||||
// ptr := AlpcGetMessageAttribute(&recvMsgAttrs, ALPC_MESSAGE_CONTEXT_ATTRIBUTE)
|
|
||||||
// if ptr != nil {
|
|
||||||
// context := (*ALPC_CONTEXT_ATTR)(ptr)
|
|
||||||
// }
|
|
||||||
func AlpcGetMessageAttribute(buf *ALPC_MESSAGE_ATTRIBUTES, attr uint32) unsafe.Pointer {
|
|
||||||
|
|
||||||
ret, _, _ := procAlpcGetMessageAttribute.Call(
|
|
||||||
uintptr(unsafe.Pointer(buf)),
|
|
||||||
uintptr(attr),
|
|
||||||
)
|
|
||||||
return unsafe.Pointer(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NTSYSCALLAPI
|
|
||||||
// NTSTATUS
|
|
||||||
// NTAPI
|
|
||||||
// NtAlpcCancelMessage(
|
|
||||||
// __in HANDLE PortHandle,
|
|
||||||
// __in ULONG Flags,
|
|
||||||
// __in PALPC_CONTEXT_ATTR MessageContext
|
|
||||||
// );
|
|
||||||
func NtAlpcCancelMessage(hPort HANDLE, flags uint32, pMsgContext *ALPC_CONTEXT_ATTR) (e error) {
|
|
||||||
|
|
||||||
ret, _, _ := procNtAlpcCancelMessage.Call(
|
|
||||||
uintptr(hPort),
|
|
||||||
uintptr(flags),
|
|
||||||
uintptr(unsafe.Pointer(pMsgContext)),
|
|
||||||
)
|
|
||||||
|
|
||||||
if ret != ERROR_SUCCESS {
|
|
||||||
e = fmt.Errorf("0x%x", ret)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// NTSYSCALLAPI
|
|
||||||
// NTSTATUS
|
|
||||||
// NTAPI
|
|
||||||
// NtAlpcDisconnectPort(
|
|
||||||
// __in HANDLE PortHandle,
|
|
||||||
// __in ULONG Flags
|
|
||||||
// );
|
|
||||||
func NtAlpcDisconnectPort(hPort HANDLE, flags uint32) (e error) {
|
|
||||||
|
|
||||||
ret, _, _ := procNtAlpcDisconnectPort.Call(
|
|
||||||
uintptr(hPort),
|
|
||||||
uintptr(flags),
|
|
||||||
)
|
|
||||||
|
|
||||||
if ret != ERROR_SUCCESS {
|
|
||||||
e = fmt.Errorf("0x%x", ret)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
64
vendor/github.com/apenwarr/w32/alpc_constants.go
generated
vendored
64
vendor/github.com/apenwarr/w32/alpc_constants.go
generated
vendored
|
|
@ -1,64 +0,0 @@
|
||||||
package w32
|
|
||||||
|
|
||||||
const (
|
|
||||||
ALPC_PORFLG_ALLOW_LPC_REQUESTS = 0x20000
|
|
||||||
ALPC_PORFLG_SYSTEM_PROCESS = 0x100000
|
|
||||||
ALPC_PORFLG_WAITABLE_PORT = 0x40000
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
ALPC_MSGFLG_REPLY_MESSAGE = 0x1
|
|
||||||
ALPC_MSGFLG_LPC_MODE = 0x2 // ?
|
|
||||||
ALPC_MSGFLG_RELEASE_MESSAGE = 0x10000 // dbg
|
|
||||||
ALPC_MSGFLG_SYNC_REQUEST = 0x20000 // dbg
|
|
||||||
ALPC_MSGFLG_WAIT_USER_MODE = 0x100000
|
|
||||||
ALPC_MSGFLG_WAIT_ALERTABLE = 0x200000
|
|
||||||
ALPC_MSGFLG_WOW64_CALL = 0x80000000 // dbg
|
|
||||||
)
|
|
||||||
const (
|
|
||||||
ALPC_MESSAGE_SECURITY_ATTRIBUTE = 0x80000000
|
|
||||||
ALPC_MESSAGE_VIEW_ATTRIBUTE = 0x40000000
|
|
||||||
ALPC_MESSAGE_CONTEXT_ATTRIBUTE = 0x20000000
|
|
||||||
ALPC_MESSAGE_HANDLE_ATTRIBUTE = 0x10000000
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
OBJ_INHERIT = 0x00000002
|
|
||||||
OBJ_PERMANENT = 0x00000010
|
|
||||||
OBJ_EXCLUSIVE = 0x00000020
|
|
||||||
OBJ_CASE_INSENSITIVE = 0x00000040
|
|
||||||
OBJ_OPENIF = 0x00000080
|
|
||||||
OBJ_OPENLINK = 0x00000100
|
|
||||||
OBJ_KERNEL_HANDLE = 0x00000200
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
LPC_REQUEST = 1
|
|
||||||
LPC_REPLY = 2
|
|
||||||
LPC_DATAGRAM = 3
|
|
||||||
LPC_LOST_REPLY = 4
|
|
||||||
LPC_PORT_CLOSED = 5
|
|
||||||
LPC_CLIENT_DIED = 6
|
|
||||||
LPC_EXCEPTION = 7
|
|
||||||
LPC_DEBUG_EVENT = 8
|
|
||||||
LPC_ERROR_EVENT = 9
|
|
||||||
LPC_CONNECTION_REQUEST = 10
|
|
||||||
LPC_CONTINUATION_REQUIRED = 0x2000
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
SecurityAnonymous uint32 = 1
|
|
||||||
SecurityIdentification uint32 = 2
|
|
||||||
SecurityImpersonation uint32 = 3
|
|
||||||
SecurityDelegation uint32 = 4
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
SECURITY_DYNAMIC_TRACKING byte = 1
|
|
||||||
SECURITY_STATIC_TRACKING byte = 0
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
ALPC_SYNC_OBJECT_TYPE uint32 = 2
|
|
||||||
ALPC_THREAD_OBJECT_TYPE uint32 = 4
|
|
||||||
)
|
|
||||||
181
vendor/github.com/apenwarr/w32/alpc_typedef.go
generated
vendored
181
vendor/github.com/apenwarr/w32/alpc_typedef.go
generated
vendored
|
|
@ -1,181 +0,0 @@
|
||||||
package w32
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
)
|
|
||||||
|
|
||||||
// nt!_ALPC_MESSAGE_ATTRIBUTES
|
|
||||||
// +0x000 AllocatedAttributes : Uint4B
|
|
||||||
// +0x004 ValidAttributes : Uint4B
|
|
||||||
type ALPC_MESSAGE_ATTRIBUTES struct {
|
|
||||||
AllocatedAttributes uint32
|
|
||||||
ValidAttributes uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
type ALPC_CONTEXT_ATTR struct {
|
|
||||||
PortContext *AlpcPortContext
|
|
||||||
MessageContext uintptr
|
|
||||||
Sequence uint32
|
|
||||||
MessageId uint32
|
|
||||||
CallbackId uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
type ALPC_HANDLE_ATTR struct {
|
|
||||||
Flags uint32
|
|
||||||
Handle HANDLE
|
|
||||||
ObjectType uint32
|
|
||||||
DesiredAccess uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
// nt!_CLIENT_ID
|
|
||||||
// +0x000 UniqueProcess : Ptr64 Void
|
|
||||||
// +0x008 UniqueThread : Ptr64 Void
|
|
||||||
type CLIENT_ID struct {
|
|
||||||
UniqueProcess uintptr
|
|
||||||
UniqueThread uintptr
|
|
||||||
}
|
|
||||||
|
|
||||||
// nt!_UNICODE_STRING
|
|
||||||
// +0x000 Length : Uint2B
|
|
||||||
// +0x002 MaximumLength : Uint2B
|
|
||||||
// +0x008 Buffer : Ptr64 Uint2B
|
|
||||||
type UNICODE_STRING struct {
|
|
||||||
Length uint16
|
|
||||||
MaximumLength uint16
|
|
||||||
_ [4]byte // align to 0x08
|
|
||||||
Buffer *uint16
|
|
||||||
}
|
|
||||||
|
|
||||||
// nt!_OBJECT_ATTRIBUTES
|
|
||||||
// +0x000 Length : Uint4B
|
|
||||||
// +0x008 RootDirectory : Ptr64 Void
|
|
||||||
// +0x010 ObjectName : Ptr64 _UNICODE_STRING
|
|
||||||
// +0x018 Attributes : Uint4B
|
|
||||||
// +0x020 SecurityDescriptor : Ptr64 Void
|
|
||||||
// +0x028 SecurityQualityOfService : Ptr64 Void
|
|
||||||
type OBJECT_ATTRIBUTES struct {
|
|
||||||
Length uint32
|
|
||||||
_ [4]byte // align to 0x08
|
|
||||||
RootDirectory HANDLE
|
|
||||||
ObjectName *UNICODE_STRING
|
|
||||||
Attributes uint32
|
|
||||||
_ [4]byte // align to 0x20
|
|
||||||
SecurityDescriptor *SECURITY_DESCRIPTOR
|
|
||||||
SecurityQualityOfService *SECURITY_QUALITY_OF_SERVICE
|
|
||||||
}
|
|
||||||
|
|
||||||
// cf: http://j00ru.vexillium.org/?p=502 for legacy RPC
|
|
||||||
// nt!_PORT_MESSAGE
|
|
||||||
// +0x000 u1 : <unnamed-tag>
|
|
||||||
// +0x004 u2 : <unnamed-tag>
|
|
||||||
// +0x008 ClientId : _CLIENT_ID
|
|
||||||
// +0x008 DoNotUseThisField : Float
|
|
||||||
// +0x018 MessageId : Uint4B
|
|
||||||
// +0x020 ClientViewSize : Uint8B
|
|
||||||
// +0x020 CallbackId : Uint4B
|
|
||||||
type PORT_MESSAGE struct {
|
|
||||||
DataLength uint16 // These are the two unnamed unions
|
|
||||||
TotalLength uint16 // without Length and ZeroInit
|
|
||||||
Type uint16
|
|
||||||
DataInfoOffset uint16
|
|
||||||
ClientId CLIENT_ID
|
|
||||||
MessageId uint32
|
|
||||||
_ [4]byte // align up to 0x20
|
|
||||||
ClientViewSize uint64
|
|
||||||
}
|
|
||||||
|
|
||||||
func (pm PORT_MESSAGE) CallbackId() uint32 {
|
|
||||||
return uint32(pm.ClientViewSize >> 32)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (pm PORT_MESSAGE) DoNotUseThisField() float64 {
|
|
||||||
panic("WE TOLD YOU NOT TO USE THIS FIELD")
|
|
||||||
}
|
|
||||||
|
|
||||||
const PORT_MESSAGE_SIZE = 0x28
|
|
||||||
|
|
||||||
// http://www.nirsoft.net/kernel_struct/vista/SECURITY_QUALITY_OF_SERVICE.html
|
|
||||||
type SECURITY_QUALITY_OF_SERVICE struct {
|
|
||||||
Length uint32
|
|
||||||
ImpersonationLevel uint32
|
|
||||||
ContextTrackingMode byte
|
|
||||||
EffectiveOnly byte
|
|
||||||
_ [2]byte // align to 12 bytes
|
|
||||||
}
|
|
||||||
|
|
||||||
const SECURITY_QOS_SIZE = 12
|
|
||||||
|
|
||||||
// nt!_ALPC_PORT_ATTRIBUTES
|
|
||||||
// +0x000 Flags : Uint4B
|
|
||||||
// +0x004 SecurityQos : _SECURITY_QUALITY_OF_SERVICE
|
|
||||||
// +0x010 MaxMessageLength : Uint8B
|
|
||||||
// +0x018 MemoryBandwidth : Uint8B
|
|
||||||
// +0x020 MaxPoolUsage : Uint8B
|
|
||||||
// +0x028 MaxSectionSize : Uint8B
|
|
||||||
// +0x030 MaxViewSize : Uint8B
|
|
||||||
// +0x038 MaxTotalSectionSize : Uint8B
|
|
||||||
// +0x040 DupObjectTypes : Uint4B
|
|
||||||
// +0x044 Reserved : Uint4B
|
|
||||||
type ALPC_PORT_ATTRIBUTES struct {
|
|
||||||
Flags uint32
|
|
||||||
SecurityQos SECURITY_QUALITY_OF_SERVICE
|
|
||||||
MaxMessageLength uint64 // must be filled out
|
|
||||||
MemoryBandwidth uint64
|
|
||||||
MaxPoolUsage uint64
|
|
||||||
MaxSectionSize uint64
|
|
||||||
MaxViewSize uint64
|
|
||||||
MaxTotalSectionSize uint64
|
|
||||||
DupObjectTypes uint32
|
|
||||||
Reserved uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
const SHORT_MESSAGE_MAX_SIZE uint16 = 65535 // MAX_USHORT
|
|
||||||
const SHORT_MESSAGE_MAX_PAYLOAD uint16 = SHORT_MESSAGE_MAX_SIZE - PORT_MESSAGE_SIZE
|
|
||||||
|
|
||||||
// LPC uses the first 4 bytes of the payload as an LPC Command, but this is
|
|
||||||
// NOT represented here, to allow the use of raw ALPC. For legacy LPC, callers
|
|
||||||
// must include the command as part of their payload.
|
|
||||||
type AlpcShortMessage struct {
|
|
||||||
PORT_MESSAGE
|
|
||||||
Data [SHORT_MESSAGE_MAX_PAYLOAD]byte
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewAlpcShortMessage() AlpcShortMessage {
|
|
||||||
sm := AlpcShortMessage{}
|
|
||||||
sm.TotalLength = SHORT_MESSAGE_MAX_SIZE
|
|
||||||
return sm
|
|
||||||
}
|
|
||||||
|
|
||||||
func (sm *AlpcShortMessage) SetData(d []byte) (e error) {
|
|
||||||
|
|
||||||
copy(sm.Data[:], d)
|
|
||||||
if len(d) > int(SHORT_MESSAGE_MAX_PAYLOAD) {
|
|
||||||
e = errors.New("data too big - truncated")
|
|
||||||
sm.DataLength = SHORT_MESSAGE_MAX_PAYLOAD
|
|
||||||
sm.TotalLength = SHORT_MESSAGE_MAX_SIZE
|
|
||||||
return
|
|
||||||
}
|
|
||||||
sm.TotalLength = uint16(PORT_MESSAGE_SIZE + len(d))
|
|
||||||
sm.DataLength = uint16(len(d))
|
|
||||||
return
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO - is this still useful?
|
|
||||||
func (sm *AlpcShortMessage) GetData() []byte {
|
|
||||||
if int(sm.DataLength) > int(SHORT_MESSAGE_MAX_PAYLOAD) {
|
|
||||||
return sm.Data[:] // truncate
|
|
||||||
}
|
|
||||||
return sm.Data[:sm.DataLength]
|
|
||||||
}
|
|
||||||
|
|
||||||
func (sm *AlpcShortMessage) Reset() {
|
|
||||||
// zero the PORT_MESSAGE header
|
|
||||||
sm.PORT_MESSAGE = PORT_MESSAGE{}
|
|
||||||
sm.TotalLength = SHORT_MESSAGE_MAX_SIZE
|
|
||||||
sm.DataLength = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
type AlpcPortContext struct {
|
|
||||||
Handle HANDLE
|
|
||||||
}
|
|
||||||
109
vendor/github.com/apenwarr/w32/comctl32.go
generated
vendored
109
vendor/github.com/apenwarr/w32/comctl32.go
generated
vendored
|
|
@ -1,109 +0,0 @@
|
||||||
// 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 (
|
|
||||||
modcomctl32 = syscall.NewLazyDLL("comctl32.dll")
|
|
||||||
|
|
||||||
procInitCommonControlsEx = modcomctl32.NewProc("InitCommonControlsEx")
|
|
||||||
procImageList_Create = modcomctl32.NewProc("ImageList_Create")
|
|
||||||
procImageList_Destroy = modcomctl32.NewProc("ImageList_Destroy")
|
|
||||||
procImageList_GetImageCount = modcomctl32.NewProc("ImageList_GetImageCount")
|
|
||||||
procImageList_SetImageCount = modcomctl32.NewProc("ImageList_SetImageCount")
|
|
||||||
procImageList_Add = modcomctl32.NewProc("ImageList_Add")
|
|
||||||
procImageList_ReplaceIcon = modcomctl32.NewProc("ImageList_ReplaceIcon")
|
|
||||||
procImageList_Remove = modcomctl32.NewProc("ImageList_Remove")
|
|
||||||
procTrackMouseEvent = modcomctl32.NewProc("_TrackMouseEvent")
|
|
||||||
)
|
|
||||||
|
|
||||||
func InitCommonControlsEx(lpInitCtrls *INITCOMMONCONTROLSEX) bool {
|
|
||||||
ret, _, _ := procInitCommonControlsEx.Call(
|
|
||||||
uintptr(unsafe.Pointer(lpInitCtrls)))
|
|
||||||
|
|
||||||
return ret != 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func ImageList_Create(cx, cy int, flags uint, cInitial, cGrow int) HIMAGELIST {
|
|
||||||
ret, _, _ := procImageList_Create.Call(
|
|
||||||
uintptr(cx),
|
|
||||||
uintptr(cy),
|
|
||||||
uintptr(flags),
|
|
||||||
uintptr(cInitial),
|
|
||||||
uintptr(cGrow))
|
|
||||||
|
|
||||||
if ret == 0 {
|
|
||||||
panic("Create image list failed")
|
|
||||||
}
|
|
||||||
|
|
||||||
return HIMAGELIST(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func ImageList_Destroy(himl HIMAGELIST) bool {
|
|
||||||
ret, _, _ := procImageList_Destroy.Call(
|
|
||||||
uintptr(himl))
|
|
||||||
|
|
||||||
return ret != 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func ImageList_GetImageCount(himl HIMAGELIST) int {
|
|
||||||
ret, _, _ := procImageList_GetImageCount.Call(
|
|
||||||
uintptr(himl))
|
|
||||||
|
|
||||||
return int(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func ImageList_SetImageCount(himl HIMAGELIST, uNewCount uint) bool {
|
|
||||||
ret, _, _ := procImageList_SetImageCount.Call(
|
|
||||||
uintptr(himl),
|
|
||||||
uintptr(uNewCount))
|
|
||||||
|
|
||||||
return ret != 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func ImageList_Add(himl HIMAGELIST, hbmImage, hbmMask HBITMAP) int {
|
|
||||||
ret, _, _ := procImageList_Add.Call(
|
|
||||||
uintptr(himl),
|
|
||||||
uintptr(hbmImage),
|
|
||||||
uintptr(hbmMask))
|
|
||||||
|
|
||||||
return int(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func ImageList_ReplaceIcon(himl HIMAGELIST, i int, hicon HICON) int {
|
|
||||||
ret, _, _ := procImageList_ReplaceIcon.Call(
|
|
||||||
uintptr(himl),
|
|
||||||
uintptr(i),
|
|
||||||
uintptr(hicon))
|
|
||||||
|
|
||||||
return int(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func ImageList_AddIcon(himl HIMAGELIST, hicon HICON) int {
|
|
||||||
return ImageList_ReplaceIcon(himl, -1, hicon)
|
|
||||||
}
|
|
||||||
|
|
||||||
func ImageList_Remove(himl HIMAGELIST, i int) bool {
|
|
||||||
ret, _, _ := procImageList_Remove.Call(
|
|
||||||
uintptr(himl),
|
|
||||||
uintptr(i))
|
|
||||||
|
|
||||||
return ret != 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func ImageList_RemoveAll(himl HIMAGELIST) bool {
|
|
||||||
return ImageList_Remove(himl, -1)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TrackMouseEvent(tme *TRACKMOUSEEVENT) bool {
|
|
||||||
ret, _, _ := procTrackMouseEvent.Call(
|
|
||||||
uintptr(unsafe.Pointer(tme)))
|
|
||||||
|
|
||||||
return ret != 0
|
|
||||||
}
|
|
||||||
38
vendor/github.com/apenwarr/w32/comdlg32.go
generated
vendored
38
vendor/github.com/apenwarr/w32/comdlg32.go
generated
vendored
|
|
@ -1,38 +0,0 @@
|
||||||
// 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 (
|
|
||||||
modcomdlg32 = syscall.NewLazyDLL("comdlg32.dll")
|
|
||||||
|
|
||||||
procGetSaveFileName = modcomdlg32.NewProc("GetSaveFileNameW")
|
|
||||||
procGetOpenFileName = modcomdlg32.NewProc("GetOpenFileNameW")
|
|
||||||
procCommDlgExtendedError = modcomdlg32.NewProc("CommDlgExtendedError")
|
|
||||||
)
|
|
||||||
|
|
||||||
func GetOpenFileName(ofn *OPENFILENAME) bool {
|
|
||||||
ret, _, _ := procGetOpenFileName.Call(
|
|
||||||
uintptr(unsafe.Pointer(ofn)))
|
|
||||||
|
|
||||||
return ret != 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetSaveFileName(ofn *OPENFILENAME) bool {
|
|
||||||
ret, _, _ := procGetSaveFileName.Call(
|
|
||||||
uintptr(unsafe.Pointer(ofn)))
|
|
||||||
|
|
||||||
return ret != 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func CommDlgExtendedError() uint {
|
|
||||||
ret, _, _ := procCommDlgExtendedError.Call()
|
|
||||||
|
|
||||||
return uint(ret)
|
|
||||||
}
|
|
||||||
2628
vendor/github.com/apenwarr/w32/constants.go
generated
vendored
2628
vendor/github.com/apenwarr/w32/constants.go
generated
vendored
File diff suppressed because it is too large
Load diff
152
vendor/github.com/apenwarr/w32/create_process.go
generated
vendored
152
vendor/github.com/apenwarr/w32/create_process.go
generated
vendored
|
|
@ -1,152 +0,0 @@
|
||||||
// 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 (
|
|
||||||
kernel32 = syscall.NewLazyDLL("kernel32.dll")
|
|
||||||
|
|
||||||
procCreateProcessW = kernel32.NewProc("CreateProcessW")
|
|
||||||
procTerminateProcess = kernel32.NewProc("TerminateProcess")
|
|
||||||
procGetExitCodeProcess = kernel32.NewProc("GetExitCodeProcess")
|
|
||||||
procWaitForSingleObject = kernel32.NewProc("WaitForSingleObject")
|
|
||||||
)
|
|
||||||
|
|
||||||
// WINBASEAPI WINBOOL WINAPI
|
|
||||||
// CreateProcessW (
|
|
||||||
// LPCWSTR lpApplicationName,
|
|
||||||
// LPWSTR lpCommandLine,
|
|
||||||
// LPSECURITY_ATTRIBUTES lpProcessAttributes,
|
|
||||||
// LPSECURITY_ATTRIBUTES lpThreadAttributes
|
|
||||||
// WINBOOL bInheritHandles
|
|
||||||
// DWORD dwCreationFlags
|
|
||||||
// LPVOID lpEnvironment
|
|
||||||
// LPCWSTR lpCurrentDirectory
|
|
||||||
// LPSTARTUPINFOW lpStartupInfo
|
|
||||||
// LPPROCESS_INFORMATION lpProcessInformation
|
|
||||||
//);
|
|
||||||
func CreateProcessW(
|
|
||||||
lpApplicationName, lpCommandLine string,
|
|
||||||
lpProcessAttributes, lpThreadAttributes *SECURITY_ATTRIBUTES,
|
|
||||||
bInheritHandles BOOL,
|
|
||||||
dwCreationFlags uint32,
|
|
||||||
lpEnvironment unsafe.Pointer,
|
|
||||||
lpCurrentDirectory string,
|
|
||||||
lpStartupInfo *STARTUPINFOW,
|
|
||||||
lpProcessInformation *PROCESS_INFORMATION,
|
|
||||||
) (e error) {
|
|
||||||
|
|
||||||
var lpAN, lpCL, lpCD *uint16
|
|
||||||
if len(lpApplicationName) > 0 {
|
|
||||||
lpAN, e = syscall.UTF16PtrFromString(lpApplicationName)
|
|
||||||
if e != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if len(lpCommandLine) > 0 {
|
|
||||||
lpCL, e = syscall.UTF16PtrFromString(lpCommandLine)
|
|
||||||
if e != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if len(lpCurrentDirectory) > 0 {
|
|
||||||
lpCD, e = syscall.UTF16PtrFromString(lpCurrentDirectory)
|
|
||||||
if e != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ret, _, lastErr := procCreateProcessW.Call(
|
|
||||||
uintptr(unsafe.Pointer(lpAN)),
|
|
||||||
uintptr(unsafe.Pointer(lpCL)),
|
|
||||||
uintptr(unsafe.Pointer(lpProcessAttributes)),
|
|
||||||
uintptr(unsafe.Pointer(lpProcessInformation)),
|
|
||||||
uintptr(bInheritHandles),
|
|
||||||
uintptr(dwCreationFlags),
|
|
||||||
uintptr(lpEnvironment),
|
|
||||||
uintptr(unsafe.Pointer(lpCD)),
|
|
||||||
uintptr(unsafe.Pointer(lpStartupInfo)),
|
|
||||||
uintptr(unsafe.Pointer(lpProcessInformation)),
|
|
||||||
)
|
|
||||||
|
|
||||||
if ret == 0 {
|
|
||||||
e = lastErr
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func CreateProcessQuick(cmd string) (pi PROCESS_INFORMATION, e error) {
|
|
||||||
si := &STARTUPINFOW{}
|
|
||||||
e = CreateProcessW(
|
|
||||||
"",
|
|
||||||
cmd,
|
|
||||||
nil,
|
|
||||||
nil,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
unsafe.Pointer(nil),
|
|
||||||
"",
|
|
||||||
si,
|
|
||||||
&pi,
|
|
||||||
)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func TerminateProcess(hProcess HANDLE, exitCode uint32) (e error) {
|
|
||||||
ret, _, lastErr := procTerminateProcess.Call(
|
|
||||||
uintptr(hProcess),
|
|
||||||
uintptr(exitCode),
|
|
||||||
)
|
|
||||||
|
|
||||||
if ret == 0 {
|
|
||||||
e = lastErr
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetExitCodeProcess(hProcess HANDLE) (code uintptr, e error) {
|
|
||||||
ret, _, lastErr := procGetExitCodeProcess.Call(
|
|
||||||
uintptr(hProcess),
|
|
||||||
uintptr(unsafe.Pointer(&code)),
|
|
||||||
)
|
|
||||||
|
|
||||||
if ret == 0 {
|
|
||||||
e = lastErr
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// DWORD WINAPI WaitForSingleObject(
|
|
||||||
// _In_ HANDLE hHandle,
|
|
||||||
// _In_ DWORD dwMilliseconds
|
|
||||||
// );
|
|
||||||
|
|
||||||
func WaitForSingleObject(hHandle HANDLE, msecs uint32) (ok bool, e error) {
|
|
||||||
|
|
||||||
ret, _, lastErr := procWaitForSingleObject.Call(
|
|
||||||
uintptr(hHandle),
|
|
||||||
uintptr(msecs),
|
|
||||||
)
|
|
||||||
|
|
||||||
if ret == WAIT_OBJECT_0 {
|
|
||||||
ok = true
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// don't set e for timeouts, or it will be ERROR_SUCCESS which is
|
|
||||||
// confusing
|
|
||||||
if ret != WAIT_TIMEOUT {
|
|
||||||
e = lastErr
|
|
||||||
}
|
|
||||||
return
|
|
||||||
|
|
||||||
}
|
|
||||||
9
vendor/github.com/apenwarr/w32/create_process_constants.go
generated
vendored
9
vendor/github.com/apenwarr/w32/create_process_constants.go
generated
vendored
|
|
@ -1,9 +0,0 @@
|
||||||
package w32
|
|
||||||
|
|
||||||
const (
|
|
||||||
WAIT_ABANDONED = 0x00000080
|
|
||||||
WAIT_OBJECT_0 = 0x00000000
|
|
||||||
WAIT_TIMEOUT = 0x00000102
|
|
||||||
WAIT_FAILED = 0xFFFFFFFF
|
|
||||||
INFINITE = 0xFFFFFFFF
|
|
||||||
)
|
|
||||||
68
vendor/github.com/apenwarr/w32/create_process_typedef.go
generated
vendored
68
vendor/github.com/apenwarr/w32/create_process_typedef.go
generated
vendored
|
|
@ -1,68 +0,0 @@
|
||||||
package w32
|
|
||||||
|
|
||||||
// typedef struct _PROCESS_INFORMATION {
|
|
||||||
// HANDLE hProcess;
|
|
||||||
// HANDLE hThread;
|
|
||||||
// DWORD dwProcessId;
|
|
||||||
// DWORD dwThreadId;
|
|
||||||
// } PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;
|
|
||||||
|
|
||||||
type PROCESS_INFORMATION struct {
|
|
||||||
Process HANDLE
|
|
||||||
Thread HANDLE
|
|
||||||
ProcessId uint32
|
|
||||||
ThreadId uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
// typedef struct _STARTUPINFOW {
|
|
||||||
// DWORD cb;
|
|
||||||
// LPWSTR lpReserved;
|
|
||||||
// LPWSTR lpDesktop;
|
|
||||||
// LPWSTR lpTitle;
|
|
||||||
// DWORD dwX;
|
|
||||||
// DWORD dwY;
|
|
||||||
// DWORD dwXSize;
|
|
||||||
// DWORD dwYSize;
|
|
||||||
// DWORD dwXCountChars;
|
|
||||||
// DWORD dwYCountChars;
|
|
||||||
// DWORD dwFillAttribute;
|
|
||||||
// DWORD dwFlags;
|
|
||||||
// WORD wShowWindow;
|
|
||||||
// WORD cbReserved2;
|
|
||||||
// LPBYTE lpReserved2;
|
|
||||||
// HANDLE hStdInput;
|
|
||||||
// HANDLE hStdOutput;
|
|
||||||
// HANDLE hStdError;
|
|
||||||
// } STARTUPINFOW, *LPSTARTUPINFOW;
|
|
||||||
|
|
||||||
type STARTUPINFOW struct {
|
|
||||||
cb uint32
|
|
||||||
_ *uint16
|
|
||||||
Desktop *uint16
|
|
||||||
Title *uint16
|
|
||||||
X uint32
|
|
||||||
Y uint32
|
|
||||||
XSize uint32
|
|
||||||
YSize uint32
|
|
||||||
XCountChars uint32
|
|
||||||
YCountChars uint32
|
|
||||||
FillAttribute uint32
|
|
||||||
Flags uint32
|
|
||||||
ShowWindow uint16
|
|
||||||
_ uint16
|
|
||||||
_ *uint8
|
|
||||||
StdInput HANDLE
|
|
||||||
StdOutput HANDLE
|
|
||||||
StdError HANDLE
|
|
||||||
}
|
|
||||||
|
|
||||||
// combase!_SECURITY_ATTRIBUTES
|
|
||||||
// +0x000 nLength : Uint4B
|
|
||||||
// +0x008 lpSecurityDescriptor : Ptr64 Void
|
|
||||||
// +0x010 bInheritHandle : Int4B
|
|
||||||
|
|
||||||
type SECURITY_ATTRIBUTES struct {
|
|
||||||
Length uint32
|
|
||||||
SecurityDescriptor uintptr
|
|
||||||
InheritHandle BOOL
|
|
||||||
}
|
|
||||||
254
vendor/github.com/apenwarr/w32/dwmapi.go
generated
vendored
254
vendor/github.com/apenwarr/w32/dwmapi.go
generated
vendored
|
|
@ -1,254 +0,0 @@
|
||||||
// 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 (
|
|
||||||
"fmt"
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
// DEFINED IN THE DWM API BUT NOT IMPLEMENTED BY MS:
|
|
||||||
// DwmAttachMilContent
|
|
||||||
// DwmDetachMilContent
|
|
||||||
// DwmEnableComposition
|
|
||||||
// DwmGetGraphicsStreamClient
|
|
||||||
// DwmGetGraphicsStreamTransformHint
|
|
||||||
|
|
||||||
var (
|
|
||||||
moddwmapi = syscall.NewLazyDLL("dwmapi.dll")
|
|
||||||
|
|
||||||
procDwmDefWindowProc = moddwmapi.NewProc("DwmDefWindowProc")
|
|
||||||
procDwmEnableBlurBehindWindow = moddwmapi.NewProc("DwmEnableBlurBehindWindow")
|
|
||||||
procDwmEnableMMCSS = moddwmapi.NewProc("DwmEnableMMCSS")
|
|
||||||
procDwmExtendFrameIntoClientArea = moddwmapi.NewProc("DwmExtendFrameIntoClientArea")
|
|
||||||
procDwmFlush = moddwmapi.NewProc("DwmFlush")
|
|
||||||
procDwmGetColorizationColor = moddwmapi.NewProc("DwmGetColorizationColor")
|
|
||||||
procDwmGetCompositionTimingInfo = moddwmapi.NewProc("DwmGetCompositionTimingInfo")
|
|
||||||
procDwmGetTransportAttributes = moddwmapi.NewProc("DwmGetTransportAttributes")
|
|
||||||
procDwmGetWindowAttribute = moddwmapi.NewProc("DwmGetWindowAttribute")
|
|
||||||
procDwmInvalidateIconicBitmaps = moddwmapi.NewProc("DwmInvalidateIconicBitmaps")
|
|
||||||
procDwmIsCompositionEnabled = moddwmapi.NewProc("DwmIsCompositionEnabled")
|
|
||||||
procDwmModifyPreviousDxFrameDuration = moddwmapi.NewProc("DwmModifyPreviousDxFrameDuration")
|
|
||||||
procDwmQueryThumbnailSourceSize = moddwmapi.NewProc("DwmQueryThumbnailSourceSize")
|
|
||||||
procDwmRegisterThumbnail = moddwmapi.NewProc("DwmRegisterThumbnail")
|
|
||||||
procDwmRenderGesture = moddwmapi.NewProc("DwmRenderGesture")
|
|
||||||
procDwmSetDxFrameDuration = moddwmapi.NewProc("DwmSetDxFrameDuration")
|
|
||||||
procDwmSetIconicLivePreviewBitmap = moddwmapi.NewProc("DwmSetIconicLivePreviewBitmap")
|
|
||||||
procDwmSetIconicThumbnail = moddwmapi.NewProc("DwmSetIconicThumbnail")
|
|
||||||
procDwmSetPresentParameters = moddwmapi.NewProc("DwmSetPresentParameters")
|
|
||||||
procDwmSetWindowAttribute = moddwmapi.NewProc("DwmSetWindowAttribute")
|
|
||||||
procDwmShowContact = moddwmapi.NewProc("DwmShowContact")
|
|
||||||
procDwmTetherContact = moddwmapi.NewProc("DwmTetherContact")
|
|
||||||
procDwmTransitionOwnedWindow = moddwmapi.NewProc("DwmTransitionOwnedWindow")
|
|
||||||
procDwmUnregisterThumbnail = moddwmapi.NewProc("DwmUnregisterThumbnail")
|
|
||||||
procDwmUpdateThumbnailProperties = moddwmapi.NewProc("DwmUpdateThumbnailProperties")
|
|
||||||
)
|
|
||||||
|
|
||||||
func DwmDefWindowProc(hWnd HWND, msg uint, wParam, lParam uintptr) (bool, uint) {
|
|
||||||
var result uint
|
|
||||||
ret, _, _ := procDwmDefWindowProc.Call(
|
|
||||||
uintptr(hWnd),
|
|
||||||
uintptr(msg),
|
|
||||||
wParam,
|
|
||||||
lParam,
|
|
||||||
uintptr(unsafe.Pointer(&result)))
|
|
||||||
return ret != 0, result
|
|
||||||
}
|
|
||||||
|
|
||||||
func DwmEnableBlurBehindWindow(hWnd HWND, pBlurBehind *DWM_BLURBEHIND) HRESULT {
|
|
||||||
ret, _, _ := procDwmEnableBlurBehindWindow.Call(
|
|
||||||
uintptr(hWnd),
|
|
||||||
uintptr(unsafe.Pointer(pBlurBehind)))
|
|
||||||
return HRESULT(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func DwmEnableMMCSS(fEnableMMCSS bool) HRESULT {
|
|
||||||
ret, _, _ := procDwmEnableMMCSS.Call(
|
|
||||||
uintptr(BoolToBOOL(fEnableMMCSS)))
|
|
||||||
return HRESULT(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func DwmExtendFrameIntoClientArea(hWnd HWND, pMarInset *MARGINS) HRESULT {
|
|
||||||
ret, _, _ := procDwmExtendFrameIntoClientArea.Call(
|
|
||||||
uintptr(hWnd),
|
|
||||||
uintptr(unsafe.Pointer(pMarInset)))
|
|
||||||
return HRESULT(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func DwmFlush() HRESULT {
|
|
||||||
ret, _, _ := procDwmFlush.Call()
|
|
||||||
return HRESULT(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func DwmGetColorizationColor(pcrColorization *uint32, pfOpaqueBlend *BOOL) HRESULT {
|
|
||||||
ret, _, _ := procDwmGetColorizationColor.Call(
|
|
||||||
uintptr(unsafe.Pointer(pcrColorization)),
|
|
||||||
uintptr(unsafe.Pointer(pfOpaqueBlend)))
|
|
||||||
return HRESULT(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func DwmGetCompositionTimingInfo(hWnd HWND, pTimingInfo *DWM_TIMING_INFO) HRESULT {
|
|
||||||
ret, _, _ := procDwmGetCompositionTimingInfo.Call(
|
|
||||||
uintptr(hWnd),
|
|
||||||
uintptr(unsafe.Pointer(pTimingInfo)))
|
|
||||||
return HRESULT(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func DwmGetTransportAttributes(pfIsRemoting *BOOL, pfIsConnected *BOOL, pDwGeneration *uint32) HRESULT {
|
|
||||||
ret, _, _ := procDwmGetTransportAttributes.Call(
|
|
||||||
uintptr(unsafe.Pointer(pfIsRemoting)),
|
|
||||||
uintptr(unsafe.Pointer(pfIsConnected)),
|
|
||||||
uintptr(unsafe.Pointer(pDwGeneration)))
|
|
||||||
return HRESULT(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: verify handling of variable arguments
|
|
||||||
func DwmGetWindowAttribute(hWnd HWND, dwAttribute uint32) (pAttribute interface{}, result HRESULT) {
|
|
||||||
var pvAttribute, pvAttrSize uintptr
|
|
||||||
switch dwAttribute {
|
|
||||||
case DWMWA_NCRENDERING_ENABLED:
|
|
||||||
v := new(BOOL)
|
|
||||||
pAttribute = v
|
|
||||||
pvAttribute = uintptr(unsafe.Pointer(v))
|
|
||||||
pvAttrSize = unsafe.Sizeof(*v)
|
|
||||||
case DWMWA_CAPTION_BUTTON_BOUNDS, DWMWA_EXTENDED_FRAME_BOUNDS:
|
|
||||||
v := new(RECT)
|
|
||||||
pAttribute = v
|
|
||||||
pvAttribute = uintptr(unsafe.Pointer(v))
|
|
||||||
pvAttrSize = unsafe.Sizeof(*v)
|
|
||||||
case DWMWA_CLOAKED:
|
|
||||||
panic(fmt.Sprintf("DwmGetWindowAttribute(%d) is not currently supported.", dwAttribute))
|
|
||||||
default:
|
|
||||||
panic(fmt.Sprintf("DwmGetWindowAttribute(%d) is not valid.", dwAttribute))
|
|
||||||
}
|
|
||||||
|
|
||||||
ret, _, _ := procDwmGetWindowAttribute.Call(
|
|
||||||
uintptr(hWnd),
|
|
||||||
uintptr(dwAttribute),
|
|
||||||
pvAttribute,
|
|
||||||
pvAttrSize)
|
|
||||||
result = HRESULT(ret)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func DwmInvalidateIconicBitmaps(hWnd HWND) HRESULT {
|
|
||||||
ret, _, _ := procDwmInvalidateIconicBitmaps.Call(
|
|
||||||
uintptr(hWnd))
|
|
||||||
return HRESULT(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func DwmIsCompositionEnabled(pfEnabled *BOOL) HRESULT {
|
|
||||||
ret, _, _ := procDwmIsCompositionEnabled.Call(
|
|
||||||
uintptr(unsafe.Pointer(pfEnabled)))
|
|
||||||
return HRESULT(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func DwmModifyPreviousDxFrameDuration(hWnd HWND, cRefreshes int, fRelative bool) HRESULT {
|
|
||||||
ret, _, _ := procDwmModifyPreviousDxFrameDuration.Call(
|
|
||||||
uintptr(hWnd),
|
|
||||||
uintptr(cRefreshes),
|
|
||||||
uintptr(BoolToBOOL(fRelative)))
|
|
||||||
return HRESULT(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func DwmQueryThumbnailSourceSize(hThumbnail HTHUMBNAIL, pSize *SIZE) HRESULT {
|
|
||||||
ret, _, _ := procDwmQueryThumbnailSourceSize.Call(
|
|
||||||
uintptr(hThumbnail),
|
|
||||||
uintptr(unsafe.Pointer(pSize)))
|
|
||||||
return HRESULT(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func DwmRegisterThumbnail(hWndDestination HWND, hWndSource HWND, phThumbnailId *HTHUMBNAIL) HRESULT {
|
|
||||||
ret, _, _ := procDwmRegisterThumbnail.Call(
|
|
||||||
uintptr(hWndDestination),
|
|
||||||
uintptr(hWndSource),
|
|
||||||
uintptr(unsafe.Pointer(phThumbnailId)))
|
|
||||||
return HRESULT(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func DwmRenderGesture(gt GESTURE_TYPE, cContacts uint, pdwPointerID *uint32, pPoints *POINT) {
|
|
||||||
procDwmRenderGesture.Call(
|
|
||||||
uintptr(gt),
|
|
||||||
uintptr(cContacts),
|
|
||||||
uintptr(unsafe.Pointer(pdwPointerID)),
|
|
||||||
uintptr(unsafe.Pointer(pPoints)))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func DwmSetDxFrameDuration(hWnd HWND, cRefreshes int) HRESULT {
|
|
||||||
ret, _, _ := procDwmSetDxFrameDuration.Call(
|
|
||||||
uintptr(hWnd),
|
|
||||||
uintptr(cRefreshes))
|
|
||||||
return HRESULT(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func DwmSetIconicLivePreviewBitmap(hWnd HWND, hbmp HBITMAP, pptClient *POINT, dwSITFlags uint32) HRESULT {
|
|
||||||
ret, _, _ := procDwmSetIconicLivePreviewBitmap.Call(
|
|
||||||
uintptr(hWnd),
|
|
||||||
uintptr(hbmp),
|
|
||||||
uintptr(unsafe.Pointer(pptClient)),
|
|
||||||
uintptr(dwSITFlags))
|
|
||||||
return HRESULT(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func DwmSetIconicThumbnail(hWnd HWND, hbmp HBITMAP, dwSITFlags uint32) HRESULT {
|
|
||||||
ret, _, _ := procDwmSetIconicThumbnail.Call(
|
|
||||||
uintptr(hWnd),
|
|
||||||
uintptr(hbmp),
|
|
||||||
uintptr(dwSITFlags))
|
|
||||||
return HRESULT(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func DwmSetPresentParameters(hWnd HWND, pPresentParams *DWM_PRESENT_PARAMETERS) HRESULT {
|
|
||||||
ret, _, _ := procDwmSetPresentParameters.Call(
|
|
||||||
uintptr(hWnd),
|
|
||||||
uintptr(unsafe.Pointer(pPresentParams)))
|
|
||||||
return HRESULT(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func DwmSetWindowAttribute(hWnd HWND, dwAttribute uint32, pvAttribute LPCVOID, cbAttribute uint32) HRESULT {
|
|
||||||
ret, _, _ := procDwmSetWindowAttribute.Call(
|
|
||||||
uintptr(hWnd),
|
|
||||||
uintptr(dwAttribute),
|
|
||||||
uintptr(pvAttribute),
|
|
||||||
uintptr(cbAttribute))
|
|
||||||
return HRESULT(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func DwmShowContact(dwPointerID uint32, eShowContact DWM_SHOWCONTACT) {
|
|
||||||
procDwmShowContact.Call(
|
|
||||||
uintptr(dwPointerID),
|
|
||||||
uintptr(eShowContact))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func DwmTetherContact(dwPointerID uint32, fEnable bool, ptTether POINT) {
|
|
||||||
procDwmTetherContact.Call(
|
|
||||||
uintptr(dwPointerID),
|
|
||||||
uintptr(BoolToBOOL(fEnable)),
|
|
||||||
uintptr(unsafe.Pointer(&ptTether)))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func DwmTransitionOwnedWindow(hWnd HWND, target DWMTRANSITION_OWNEDWINDOW_TARGET) {
|
|
||||||
procDwmTransitionOwnedWindow.Call(
|
|
||||||
uintptr(hWnd),
|
|
||||||
uintptr(target))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func DwmUnregisterThumbnail(hThumbnailId HTHUMBNAIL) HRESULT {
|
|
||||||
ret, _, _ := procDwmUnregisterThumbnail.Call(
|
|
||||||
uintptr(hThumbnailId))
|
|
||||||
return HRESULT(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func DwmUpdateThumbnailProperties(hThumbnailId HTHUMBNAIL, ptnProperties *DWM_THUMBNAIL_PROPERTIES) HRESULT {
|
|
||||||
ret, _, _ := procDwmUpdateThumbnailProperties.Call(
|
|
||||||
uintptr(hThumbnailId),
|
|
||||||
uintptr(unsafe.Pointer(ptnProperties)))
|
|
||||||
return HRESULT(ret)
|
|
||||||
}
|
|
||||||
174
vendor/github.com/apenwarr/w32/fork.go
generated
vendored
174
vendor/github.com/apenwarr/w32/fork.go
generated
vendored
|
|
@ -1,174 +0,0 @@
|
||||||
// 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
|
|
||||||
|
|
||||||
// #include <stdlib.h>
|
|
||||||
//import (
|
|
||||||
// "C"
|
|
||||||
//)
|
|
||||||
|
|
||||||
// Based on C code found here https://gist.github.com/juntalis/4366916
|
|
||||||
// Original code license:
|
|
||||||
/*
|
|
||||||
* fork.c
|
|
||||||
* Experimental fork() on Windows. Requires NT 6 subsystem or
|
|
||||||
* newer.
|
|
||||||
*
|
|
||||||
* Copyright (c) 2012 William Pitcock <nenolod@dereferenced.org>
|
|
||||||
*
|
|
||||||
* Permission to use, copy, modify, and/or distribute this software for any
|
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
|
||||||
* copyright notice and this permission notice appear in all copies.
|
|
||||||
*
|
|
||||||
* This software is provided 'as is' and without any warranty, express or
|
|
||||||
* implied. In no event shall the authors be liable for any damages arising
|
|
||||||
* from the use of this software.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
ntdll = syscall.NewLazyDLL("ntdll.dll")
|
|
||||||
|
|
||||||
procRtlCloneUserProcess = ntdll.NewProc("RtlCloneUserProcess")
|
|
||||||
procAllocConsole = modkernel32.NewProc("AllocConsole")
|
|
||||||
procOpenProcess = modkernel32.NewProc("OpenProcess")
|
|
||||||
procOpenThread = modkernel32.NewProc("OpenThread")
|
|
||||||
procResumeThread = modkernel32.NewProc("ResumeThread")
|
|
||||||
)
|
|
||||||
|
|
||||||
func OpenProcess(desiredAccess int, inheritHandle bool, processId uintptr) (h HANDLE, e error) {
|
|
||||||
inherit := uintptr(0)
|
|
||||||
if inheritHandle {
|
|
||||||
inherit = 1
|
|
||||||
}
|
|
||||||
|
|
||||||
ret, _, lastErr := procOpenProcess.Call(
|
|
||||||
uintptr(desiredAccess),
|
|
||||||
inherit,
|
|
||||||
uintptr(processId),
|
|
||||||
)
|
|
||||||
|
|
||||||
if ret == 0 {
|
|
||||||
e = lastErr
|
|
||||||
}
|
|
||||||
|
|
||||||
h = HANDLE(ret)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func OpenThread(desiredAccess int, inheritHandle bool, threadId uintptr) (h HANDLE, e error) {
|
|
||||||
inherit := uintptr(0)
|
|
||||||
if inheritHandle {
|
|
||||||
inherit = 1
|
|
||||||
}
|
|
||||||
|
|
||||||
ret, _, lastErr := procOpenThread.Call(
|
|
||||||
uintptr(desiredAccess),
|
|
||||||
inherit,
|
|
||||||
uintptr(threadId),
|
|
||||||
)
|
|
||||||
|
|
||||||
if ret == 0 {
|
|
||||||
e = lastErr
|
|
||||||
}
|
|
||||||
|
|
||||||
h = HANDLE(ret)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// DWORD WINAPI ResumeThread(
|
|
||||||
// _In_ HANDLE hThread
|
|
||||||
// );
|
|
||||||
func ResumeThread(ht HANDLE) (e error) {
|
|
||||||
|
|
||||||
ret, _, lastErr := procResumeThread.Call(
|
|
||||||
uintptr(ht),
|
|
||||||
)
|
|
||||||
if ret == ^uintptr(0) { // -1
|
|
||||||
e = lastErr
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// BOOL WINAPI AllocConsole(void);
|
|
||||||
func AllocConsole() (e error) {
|
|
||||||
ret, _, lastErr := procAllocConsole.Call()
|
|
||||||
if ret != ERROR_SUCCESS {
|
|
||||||
e = lastErr
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// NTSYSAPI
|
|
||||||
// NTSTATUS
|
|
||||||
// NTAPI RtlCloneUserProcess (
|
|
||||||
// _In_ ULONG ProcessFlags,
|
|
||||||
// _In_opt_ PSECURITY_DESCRIPTOR ProcessSecurityDescriptor,
|
|
||||||
// _In_opt_ PSECURITY_DESCRIPTOR ThreadSecurityDescriptor,
|
|
||||||
// _In_opt_ HANDLE DebugPort,
|
|
||||||
// _Out_ PRTL_USER_PROCESS_INFORMATION ProcessInformation
|
|
||||||
// )
|
|
||||||
|
|
||||||
func RtlCloneUserProcess(
|
|
||||||
ProcessFlags uint32,
|
|
||||||
ProcessSecurityDescriptor, ThreadSecurityDescriptor *SECURITY_DESCRIPTOR, // in advapi32_typedef.go
|
|
||||||
DebugPort HANDLE,
|
|
||||||
ProcessInformation *RTL_USER_PROCESS_INFORMATION,
|
|
||||||
) (status uintptr) {
|
|
||||||
|
|
||||||
status, _, _ = procRtlCloneUserProcess.Call(
|
|
||||||
uintptr(ProcessFlags),
|
|
||||||
uintptr(unsafe.Pointer(ProcessSecurityDescriptor)),
|
|
||||||
uintptr(unsafe.Pointer(ThreadSecurityDescriptor)),
|
|
||||||
uintptr(DebugPort),
|
|
||||||
uintptr(unsafe.Pointer(ProcessInformation)),
|
|
||||||
)
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fork creates a clone of the current process using the undocumented
|
|
||||||
// RtlCloneUserProcess call in ntdll, similar to unix fork(). The
|
|
||||||
// return value in the parent is the child PID. In the child it is 0.
|
|
||||||
func Fork() (pid uintptr, e error) {
|
|
||||||
|
|
||||||
pi := &RTL_USER_PROCESS_INFORMATION{}
|
|
||||||
|
|
||||||
ret := RtlCloneUserProcess(
|
|
||||||
RTL_CLONE_PROCESS_FLAGS_CREATE_SUSPENDED|RTL_CLONE_PROCESS_FLAGS_INHERIT_HANDLES,
|
|
||||||
nil,
|
|
||||||
nil,
|
|
||||||
HANDLE(0),
|
|
||||||
pi,
|
|
||||||
)
|
|
||||||
|
|
||||||
switch ret {
|
|
||||||
case RTL_CLONE_PARENT:
|
|
||||||
pid = pi.ClientId.UniqueProcess
|
|
||||||
ht, err := OpenThread(THREAD_ALL_ACCESS, false, pi.ClientId.UniqueThread)
|
|
||||||
if err != nil {
|
|
||||||
e = fmt.Errorf("OpenThread: %s", err)
|
|
||||||
}
|
|
||||||
err = ResumeThread(ht)
|
|
||||||
if err != nil {
|
|
||||||
e = fmt.Errorf("ResumeThread: %s", err)
|
|
||||||
}
|
|
||||||
CloseHandle(ht)
|
|
||||||
case RTL_CLONE_CHILD:
|
|
||||||
pid = 0
|
|
||||||
err := AllocConsole()
|
|
||||||
if err != nil {
|
|
||||||
e = fmt.Errorf("AllocConsole: %s", err)
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
e = fmt.Errorf("0x%x", ret)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
26
vendor/github.com/apenwarr/w32/fork_constants.go
generated
vendored
26
vendor/github.com/apenwarr/w32/fork_constants.go
generated
vendored
|
|
@ -1,26 +0,0 @@
|
||||||
package w32
|
|
||||||
|
|
||||||
const (
|
|
||||||
RTL_CLONE_PROCESS_FLAGS_CREATE_SUSPENDED = 0x00000001
|
|
||||||
RTL_CLONE_PROCESS_FLAGS_INHERIT_HANDLES = 0x00000002
|
|
||||||
RTL_CLONE_PROCESS_FLAGS_NO_SYNCHRONIZE = 0x00000004
|
|
||||||
|
|
||||||
RTL_CLONE_PARENT = 0
|
|
||||||
RTL_CLONE_CHILD = 297
|
|
||||||
|
|
||||||
THREAD_TERMINATE = 0x0001
|
|
||||||
THREAD_SUSPEND_RESUME = 0x0002
|
|
||||||
THREAD_GET_CONTEXT = 0x0008
|
|
||||||
THREAD_SET_CONTEXT = 0x0010
|
|
||||||
THREAD_SET_INFORMATION = 0x0020
|
|
||||||
THREAD_QUERY_INFORMATION = 0x0040
|
|
||||||
THREAD_SET_THREAD_TOKEN = 0x0080
|
|
||||||
THREAD_IMPERSONATE = 0x0100
|
|
||||||
THREAD_DIRECT_IMPERSONATION = 0x0200
|
|
||||||
THREAD_SET_LIMITED_INFORMATION = 0x0400
|
|
||||||
THREAD_QUERY_LIMITED_INFORMATION = 0x0800
|
|
||||||
THREAD_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xffff
|
|
||||||
|
|
||||||
PROCESS_SET_SESSIONID = 0x0004
|
|
||||||
PROCESS_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xffff
|
|
||||||
)
|
|
||||||
89
vendor/github.com/apenwarr/w32/fork_typedef.go
generated
vendored
89
vendor/github.com/apenwarr/w32/fork_typedef.go
generated
vendored
|
|
@ -1,89 +0,0 @@
|
||||||
package w32
|
|
||||||
|
|
||||||
// combase!_SECTION_IMAGE_INFORMATION
|
|
||||||
// +0x000 TransferAddress : Ptr64 Void
|
|
||||||
// +0x008 ZeroBits : Uint4B
|
|
||||||
// +0x010 MaximumStackSize : Uint8B
|
|
||||||
// +0x018 CommittedStackSize : Uint8B
|
|
||||||
// +0x020 SubSystemType : Uint4B
|
|
||||||
// +0x024 SubSystemMinorVersion : Uint2B
|
|
||||||
// +0x026 SubSystemMajorVersion : Uint2B
|
|
||||||
// +0x024 SubSystemVersion : Uint4B
|
|
||||||
// +0x028 MajorOperatingSystemVersion : Uint2B
|
|
||||||
// +0x02a MinorOperatingSystemVersion : Uint2B
|
|
||||||
// +0x028 OperatingSystemVersion : Uint4B
|
|
||||||
// +0x02c ImageCharacteristics : Uint2B
|
|
||||||
// +0x02e DllCharacteristics : Uint2B
|
|
||||||
// +0x030 Machine : Uint2B
|
|
||||||
// +0x032 ImageContainsCode : UChar
|
|
||||||
// +0x033 ImageFlags : UChar
|
|
||||||
// +0x033 ComPlusNativeReady : Pos 0, 1 Bit
|
|
||||||
// +0x033 ComPlusILOnly : Pos 1, 1 Bit
|
|
||||||
// +0x033 ImageDynamicallyRelocated : Pos 2, 1 Bit
|
|
||||||
// +0x033 ImageMappedFlat : Pos 3, 1 Bit
|
|
||||||
// +0x033 BaseBelow4gb : Pos 4, 1 Bit
|
|
||||||
// +0x033 ComPlusPrefer32bit : Pos 5, 1 Bit
|
|
||||||
// +0x033 Reserved : Pos 6, 2 Bits
|
|
||||||
// +0x034 LoaderFlags : Uint4B
|
|
||||||
// +0x038 ImageFileSize : Uint4B
|
|
||||||
// +0x03c CheckSum : Uint4B
|
|
||||||
type SECTION_IMAGE_INFORMATION struct {
|
|
||||||
TransferAddress uintptr
|
|
||||||
ZeroBits uint32
|
|
||||||
MaximumStackSize uint64
|
|
||||||
CommittedStackSize uint64
|
|
||||||
SubSystemType uint32
|
|
||||||
SubSystemMinorVersion uint16
|
|
||||||
SubSystemMajorVersion uint16
|
|
||||||
SubSystemVersion uint32
|
|
||||||
MajorOperatingSystemVersion uint16
|
|
||||||
MinorOperatingSystemVersion uint16
|
|
||||||
OperatingSystemVersion uint32
|
|
||||||
ImageCharacteristics uint16
|
|
||||||
DllCharacteristics uint16
|
|
||||||
Machine uint16
|
|
||||||
ImageContainsCode uint8
|
|
||||||
ImageFlags uint8
|
|
||||||
ComPlusFlags uint8
|
|
||||||
LoaderFlags uint32
|
|
||||||
ImageFileSize uint32
|
|
||||||
CheckSum uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
func (si *SECTION_IMAGE_INFORMATION) ComPlusNativeReady() bool {
|
|
||||||
return (si.ComPlusFlags & (1 << 0)) == 1
|
|
||||||
}
|
|
||||||
|
|
||||||
func (si *SECTION_IMAGE_INFORMATION) ComPlusILOnly() bool {
|
|
||||||
return (si.ComPlusFlags & (1 << 1)) == 1
|
|
||||||
}
|
|
||||||
|
|
||||||
func (si *SECTION_IMAGE_INFORMATION) ImageDynamicallyRelocated() bool {
|
|
||||||
return (si.ComPlusFlags & (1 << 2)) == 1
|
|
||||||
}
|
|
||||||
|
|
||||||
func (si *SECTION_IMAGE_INFORMATION) ImageMappedFlat() bool {
|
|
||||||
return (si.ComPlusFlags & (1 << 3)) == 1
|
|
||||||
}
|
|
||||||
|
|
||||||
func (si *SECTION_IMAGE_INFORMATION) BaseBelow4gb() bool {
|
|
||||||
return (si.ComPlusFlags & (1 << 4)) == 1
|
|
||||||
}
|
|
||||||
|
|
||||||
func (si *SECTION_IMAGE_INFORMATION) ComPlusPrefer32bit() bool {
|
|
||||||
return (si.ComPlusFlags & (1 << 5)) == 1
|
|
||||||
}
|
|
||||||
|
|
||||||
// combase!_RTL_USER_PROCESS_INFORMATION
|
|
||||||
// +0x000 Length : Uint4B
|
|
||||||
// +0x008 Process : Ptr64 Void
|
|
||||||
// +0x010 Thread : Ptr64 Void
|
|
||||||
// +0x018 ClientId : _CLIENT_ID
|
|
||||||
// +0x028 ImageInformation : _SECTION_IMAGE_INFORMATION
|
|
||||||
type RTL_USER_PROCESS_INFORMATION struct {
|
|
||||||
Length uint32
|
|
||||||
Process HANDLE
|
|
||||||
Thread HANDLE
|
|
||||||
ClientId CLIENT_ID
|
|
||||||
ImageInformation SECTION_IMAGE_INFORMATION
|
|
||||||
}
|
|
||||||
543
vendor/github.com/apenwarr/w32/gdi32.go
generated
vendored
543
vendor/github.com/apenwarr/w32/gdi32.go
generated
vendored
|
|
@ -1,543 +0,0 @@
|
||||||
// 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 (
|
|
||||||
modgdi32 = syscall.NewLazyDLL("gdi32.dll")
|
|
||||||
|
|
||||||
procGetDeviceCaps = modgdi32.NewProc("GetDeviceCaps")
|
|
||||||
procGetCurrentObject = modgdi32.NewProc("GetCurrentObject")
|
|
||||||
procDeleteObject = modgdi32.NewProc("DeleteObject")
|
|
||||||
procCreateFontIndirect = modgdi32.NewProc("CreateFontIndirectW")
|
|
||||||
procAbortDoc = modgdi32.NewProc("AbortDoc")
|
|
||||||
procBitBlt = modgdi32.NewProc("BitBlt")
|
|
||||||
procPatBlt = modgdi32.NewProc("PatBlt")
|
|
||||||
procCloseEnhMetaFile = modgdi32.NewProc("CloseEnhMetaFile")
|
|
||||||
procCopyEnhMetaFile = modgdi32.NewProc("CopyEnhMetaFileW")
|
|
||||||
procCreateBrushIndirect = modgdi32.NewProc("CreateBrushIndirect")
|
|
||||||
procCreateCompatibleDC = modgdi32.NewProc("CreateCompatibleDC")
|
|
||||||
procCreateDC = modgdi32.NewProc("CreateDCW")
|
|
||||||
procCreateCompatibleBitmap = modgdi32.NewProc("CreateCompatibleBitmap")
|
|
||||||
procCreateDIBSection = modgdi32.NewProc("CreateDIBSection")
|
|
||||||
procCreateEnhMetaFile = modgdi32.NewProc("CreateEnhMetaFileW")
|
|
||||||
procCreateIC = modgdi32.NewProc("CreateICW")
|
|
||||||
procDeleteDC = modgdi32.NewProc("DeleteDC")
|
|
||||||
procDeleteEnhMetaFile = modgdi32.NewProc("DeleteEnhMetaFile")
|
|
||||||
procEllipse = modgdi32.NewProc("Ellipse")
|
|
||||||
procEndDoc = modgdi32.NewProc("EndDoc")
|
|
||||||
procEndPage = modgdi32.NewProc("EndPage")
|
|
||||||
procExtCreatePen = modgdi32.NewProc("ExtCreatePen")
|
|
||||||
procGetEnhMetaFile = modgdi32.NewProc("GetEnhMetaFileW")
|
|
||||||
procGetEnhMetaFileHeader = modgdi32.NewProc("GetEnhMetaFileHeader")
|
|
||||||
procGetObject = modgdi32.NewProc("GetObjectW")
|
|
||||||
procGetStockObject = modgdi32.NewProc("GetStockObject")
|
|
||||||
procGetTextExtentExPoint = modgdi32.NewProc("GetTextExtentExPointW")
|
|
||||||
procGetTextExtentPoint32 = modgdi32.NewProc("GetTextExtentPoint32W")
|
|
||||||
procGetTextMetrics = modgdi32.NewProc("GetTextMetricsW")
|
|
||||||
procLineTo = modgdi32.NewProc("LineTo")
|
|
||||||
procMoveToEx = modgdi32.NewProc("MoveToEx")
|
|
||||||
procPlayEnhMetaFile = modgdi32.NewProc("PlayEnhMetaFile")
|
|
||||||
procRectangle = modgdi32.NewProc("Rectangle")
|
|
||||||
procResetDC = modgdi32.NewProc("ResetDCW")
|
|
||||||
procSelectObject = modgdi32.NewProc("SelectObject")
|
|
||||||
procSetBkMode = modgdi32.NewProc("SetBkMode")
|
|
||||||
procSetBrushOrgEx = modgdi32.NewProc("SetBrushOrgEx")
|
|
||||||
procSetStretchBltMode = modgdi32.NewProc("SetStretchBltMode")
|
|
||||||
procSetTextColor = modgdi32.NewProc("SetTextColor")
|
|
||||||
procSetBkColor = modgdi32.NewProc("SetBkColor")
|
|
||||||
procStartDoc = modgdi32.NewProc("StartDocW")
|
|
||||||
procStartPage = modgdi32.NewProc("StartPage")
|
|
||||||
procStretchBlt = modgdi32.NewProc("StretchBlt")
|
|
||||||
procSetDIBitsToDevice = modgdi32.NewProc("SetDIBitsToDevice")
|
|
||||||
procChoosePixelFormat = modgdi32.NewProc("ChoosePixelFormat")
|
|
||||||
procDescribePixelFormat = modgdi32.NewProc("DescribePixelFormat")
|
|
||||||
procGetEnhMetaFilePixelFormat = modgdi32.NewProc("GetEnhMetaFilePixelFormat")
|
|
||||||
procGetPixelFormat = modgdi32.NewProc("GetPixelFormat")
|
|
||||||
procSetPixelFormat = modgdi32.NewProc("SetPixelFormat")
|
|
||||||
procSwapBuffers = modgdi32.NewProc("SwapBuffers")
|
|
||||||
)
|
|
||||||
|
|
||||||
func GetDeviceCaps(hdc HDC, index int) int {
|
|
||||||
ret, _, _ := procGetDeviceCaps.Call(
|
|
||||||
uintptr(hdc),
|
|
||||||
uintptr(index))
|
|
||||||
|
|
||||||
return int(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetCurrentObject(hdc HDC, uObjectType uint32) HGDIOBJ {
|
|
||||||
ret, _, _ := procGetCurrentObject.Call(
|
|
||||||
uintptr(hdc),
|
|
||||||
uintptr(uObjectType))
|
|
||||||
|
|
||||||
return HGDIOBJ(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func DeleteObject(hObject HGDIOBJ) bool {
|
|
||||||
ret, _, _ := procDeleteObject.Call(
|
|
||||||
uintptr(hObject))
|
|
||||||
|
|
||||||
return ret != 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func CreateFontIndirect(logFont *LOGFONT) HFONT {
|
|
||||||
ret, _, _ := procCreateFontIndirect.Call(
|
|
||||||
uintptr(unsafe.Pointer(logFont)))
|
|
||||||
|
|
||||||
return HFONT(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func AbortDoc(hdc HDC) int {
|
|
||||||
ret, _, _ := procAbortDoc.Call(
|
|
||||||
uintptr(hdc))
|
|
||||||
|
|
||||||
return int(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func BitBlt(hdcDest HDC, nXDest, nYDest, nWidth, nHeight int, hdcSrc HDC, nXSrc, nYSrc int, dwRop uint) {
|
|
||||||
ret, _, _ := procBitBlt.Call(
|
|
||||||
uintptr(hdcDest),
|
|
||||||
uintptr(nXDest),
|
|
||||||
uintptr(nYDest),
|
|
||||||
uintptr(nWidth),
|
|
||||||
uintptr(nHeight),
|
|
||||||
uintptr(hdcSrc),
|
|
||||||
uintptr(nXSrc),
|
|
||||||
uintptr(nYSrc),
|
|
||||||
uintptr(dwRop))
|
|
||||||
|
|
||||||
if ret == 0 {
|
|
||||||
panic("BitBlt failed")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func PatBlt(hdc HDC, nXLeft, nYLeft, nWidth, nHeight int, dwRop uint) {
|
|
||||||
ret, _, _ := procPatBlt.Call(
|
|
||||||
uintptr(hdc),
|
|
||||||
uintptr(nXLeft),
|
|
||||||
uintptr(nYLeft),
|
|
||||||
uintptr(nWidth),
|
|
||||||
uintptr(nHeight),
|
|
||||||
uintptr(dwRop))
|
|
||||||
|
|
||||||
if ret == 0 {
|
|
||||||
panic("PatBlt failed")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func CloseEnhMetaFile(hdc HDC) HENHMETAFILE {
|
|
||||||
ret, _, _ := procCloseEnhMetaFile.Call(
|
|
||||||
uintptr(hdc))
|
|
||||||
|
|
||||||
return HENHMETAFILE(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func CopyEnhMetaFile(hemfSrc HENHMETAFILE, lpszFile *uint16) HENHMETAFILE {
|
|
||||||
ret, _, _ := procCopyEnhMetaFile.Call(
|
|
||||||
uintptr(hemfSrc),
|
|
||||||
uintptr(unsafe.Pointer(lpszFile)))
|
|
||||||
|
|
||||||
return HENHMETAFILE(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func CreateBrushIndirect(lplb *LOGBRUSH) HBRUSH {
|
|
||||||
ret, _, _ := procCreateBrushIndirect.Call(
|
|
||||||
uintptr(unsafe.Pointer(lplb)))
|
|
||||||
|
|
||||||
return HBRUSH(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func CreateCompatibleDC(hdc HDC) HDC {
|
|
||||||
ret, _, _ := procCreateCompatibleDC.Call(
|
|
||||||
uintptr(hdc))
|
|
||||||
|
|
||||||
if ret == 0 {
|
|
||||||
panic("Create compatible DC failed")
|
|
||||||
}
|
|
||||||
|
|
||||||
return HDC(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func CreateDC(lpszDriver, lpszDevice, lpszOutput *uint16, lpInitData *DEVMODE) HDC {
|
|
||||||
ret, _, _ := procCreateDC.Call(
|
|
||||||
uintptr(unsafe.Pointer(lpszDriver)),
|
|
||||||
uintptr(unsafe.Pointer(lpszDevice)),
|
|
||||||
uintptr(unsafe.Pointer(lpszOutput)),
|
|
||||||
uintptr(unsafe.Pointer(lpInitData)))
|
|
||||||
|
|
||||||
return HDC(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func CreateCompatibleBitmap(hdc HDC, width, height uint) HBITMAP {
|
|
||||||
ret, _, _ := procCreateCompatibleBitmap.Call(
|
|
||||||
uintptr(hdc),
|
|
||||||
uintptr(width),
|
|
||||||
uintptr(height))
|
|
||||||
|
|
||||||
return HBITMAP(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func CreateDIBSection(hdc HDC, pbmi *BITMAPINFO, iUsage uint, ppvBits *unsafe.Pointer, hSection HANDLE, dwOffset uint) HBITMAP {
|
|
||||||
ret, _, _ := procCreateDIBSection.Call(
|
|
||||||
uintptr(hdc),
|
|
||||||
uintptr(unsafe.Pointer(pbmi)),
|
|
||||||
uintptr(iUsage),
|
|
||||||
uintptr(unsafe.Pointer(ppvBits)),
|
|
||||||
uintptr(hSection),
|
|
||||||
uintptr(dwOffset))
|
|
||||||
|
|
||||||
return HBITMAP(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func CreateEnhMetaFile(hdcRef HDC, lpFilename *uint16, lpRect *RECT, lpDescription *uint16) HDC {
|
|
||||||
ret, _, _ := procCreateEnhMetaFile.Call(
|
|
||||||
uintptr(hdcRef),
|
|
||||||
uintptr(unsafe.Pointer(lpFilename)),
|
|
||||||
uintptr(unsafe.Pointer(lpRect)),
|
|
||||||
uintptr(unsafe.Pointer(lpDescription)))
|
|
||||||
|
|
||||||
return HDC(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func CreateIC(lpszDriver, lpszDevice, lpszOutput *uint16, lpdvmInit *DEVMODE) HDC {
|
|
||||||
ret, _, _ := procCreateIC.Call(
|
|
||||||
uintptr(unsafe.Pointer(lpszDriver)),
|
|
||||||
uintptr(unsafe.Pointer(lpszDevice)),
|
|
||||||
uintptr(unsafe.Pointer(lpszOutput)),
|
|
||||||
uintptr(unsafe.Pointer(lpdvmInit)))
|
|
||||||
|
|
||||||
return HDC(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func DeleteDC(hdc HDC) bool {
|
|
||||||
ret, _, _ := procDeleteDC.Call(
|
|
||||||
uintptr(hdc))
|
|
||||||
|
|
||||||
return ret != 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func DeleteEnhMetaFile(hemf HENHMETAFILE) bool {
|
|
||||||
ret, _, _ := procDeleteEnhMetaFile.Call(
|
|
||||||
uintptr(hemf))
|
|
||||||
|
|
||||||
return ret != 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func Ellipse(hdc HDC, nLeftRect, nTopRect, nRightRect, nBottomRect int) bool {
|
|
||||||
ret, _, _ := procEllipse.Call(
|
|
||||||
uintptr(hdc),
|
|
||||||
uintptr(nLeftRect),
|
|
||||||
uintptr(nTopRect),
|
|
||||||
uintptr(nRightRect),
|
|
||||||
uintptr(nBottomRect))
|
|
||||||
|
|
||||||
return ret != 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func EndDoc(hdc HDC) int {
|
|
||||||
ret, _, _ := procEndDoc.Call(
|
|
||||||
uintptr(hdc))
|
|
||||||
|
|
||||||
return int(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func EndPage(hdc HDC) int {
|
|
||||||
ret, _, _ := procEndPage.Call(
|
|
||||||
uintptr(hdc))
|
|
||||||
|
|
||||||
return int(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func ExtCreatePen(dwPenStyle, dwWidth uint, lplb *LOGBRUSH, dwStyleCount uint, lpStyle *uint) HPEN {
|
|
||||||
ret, _, _ := procExtCreatePen.Call(
|
|
||||||
uintptr(dwPenStyle),
|
|
||||||
uintptr(dwWidth),
|
|
||||||
uintptr(unsafe.Pointer(lplb)),
|
|
||||||
uintptr(dwStyleCount),
|
|
||||||
uintptr(unsafe.Pointer(lpStyle)))
|
|
||||||
|
|
||||||
return HPEN(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetEnhMetaFile(lpszMetaFile *uint16) HENHMETAFILE {
|
|
||||||
ret, _, _ := procGetEnhMetaFile.Call(
|
|
||||||
uintptr(unsafe.Pointer(lpszMetaFile)))
|
|
||||||
|
|
||||||
return HENHMETAFILE(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetEnhMetaFileHeader(hemf HENHMETAFILE, cbBuffer uint, lpemh *ENHMETAHEADER) uint {
|
|
||||||
ret, _, _ := procGetEnhMetaFileHeader.Call(
|
|
||||||
uintptr(hemf),
|
|
||||||
uintptr(cbBuffer),
|
|
||||||
uintptr(unsafe.Pointer(lpemh)))
|
|
||||||
|
|
||||||
return uint(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetObject(hgdiobj HGDIOBJ, cbBuffer uintptr, lpvObject unsafe.Pointer) int {
|
|
||||||
ret, _, _ := procGetObject.Call(
|
|
||||||
uintptr(hgdiobj),
|
|
||||||
uintptr(cbBuffer),
|
|
||||||
uintptr(lpvObject))
|
|
||||||
|
|
||||||
return int(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetStockObject(fnObject int) HGDIOBJ {
|
|
||||||
ret, _, _ := procGetStockObject.Call(
|
|
||||||
uintptr(fnObject))
|
|
||||||
|
|
||||||
return HGDIOBJ(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetTextExtentExPoint(hdc HDC, lpszStr *uint16, cchString, nMaxExtent int, lpnFit, alpDx *int, lpSize *SIZE) bool {
|
|
||||||
ret, _, _ := procGetTextExtentExPoint.Call(
|
|
||||||
uintptr(hdc),
|
|
||||||
uintptr(unsafe.Pointer(lpszStr)),
|
|
||||||
uintptr(cchString),
|
|
||||||
uintptr(nMaxExtent),
|
|
||||||
uintptr(unsafe.Pointer(lpnFit)),
|
|
||||||
uintptr(unsafe.Pointer(alpDx)),
|
|
||||||
uintptr(unsafe.Pointer(lpSize)))
|
|
||||||
|
|
||||||
return ret != 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetTextExtentPoint32(hdc HDC, lpString *uint16, c int, lpSize *SIZE) bool {
|
|
||||||
ret, _, _ := procGetTextExtentPoint32.Call(
|
|
||||||
uintptr(hdc),
|
|
||||||
uintptr(unsafe.Pointer(lpString)),
|
|
||||||
uintptr(c),
|
|
||||||
uintptr(unsafe.Pointer(lpSize)))
|
|
||||||
|
|
||||||
return ret != 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetTextMetrics(hdc HDC, lptm *TEXTMETRIC) bool {
|
|
||||||
ret, _, _ := procGetTextMetrics.Call(
|
|
||||||
uintptr(hdc),
|
|
||||||
uintptr(unsafe.Pointer(lptm)))
|
|
||||||
|
|
||||||
return ret != 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func LineTo(hdc HDC, nXEnd, nYEnd int) bool {
|
|
||||||
ret, _, _ := procLineTo.Call(
|
|
||||||
uintptr(hdc),
|
|
||||||
uintptr(nXEnd),
|
|
||||||
uintptr(nYEnd))
|
|
||||||
|
|
||||||
return ret != 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func MoveToEx(hdc HDC, x, y int, lpPoint *POINT) bool {
|
|
||||||
ret, _, _ := procMoveToEx.Call(
|
|
||||||
uintptr(hdc),
|
|
||||||
uintptr(x),
|
|
||||||
uintptr(y),
|
|
||||||
uintptr(unsafe.Pointer(lpPoint)))
|
|
||||||
|
|
||||||
return ret != 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func PlayEnhMetaFile(hdc HDC, hemf HENHMETAFILE, lpRect *RECT) bool {
|
|
||||||
ret, _, _ := procPlayEnhMetaFile.Call(
|
|
||||||
uintptr(hdc),
|
|
||||||
uintptr(hemf),
|
|
||||||
uintptr(unsafe.Pointer(lpRect)))
|
|
||||||
|
|
||||||
return ret != 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func Rectangle(hdc HDC, nLeftRect, nTopRect, nRightRect, nBottomRect int) bool {
|
|
||||||
ret, _, _ := procRectangle.Call(
|
|
||||||
uintptr(hdc),
|
|
||||||
uintptr(nLeftRect),
|
|
||||||
uintptr(nTopRect),
|
|
||||||
uintptr(nRightRect),
|
|
||||||
uintptr(nBottomRect))
|
|
||||||
|
|
||||||
return ret != 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func ResetDC(hdc HDC, lpInitData *DEVMODE) HDC {
|
|
||||||
ret, _, _ := procResetDC.Call(
|
|
||||||
uintptr(hdc),
|
|
||||||
uintptr(unsafe.Pointer(lpInitData)))
|
|
||||||
|
|
||||||
return HDC(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func SelectObject(hdc HDC, hgdiobj HGDIOBJ) HGDIOBJ {
|
|
||||||
ret, _, _ := procSelectObject.Call(
|
|
||||||
uintptr(hdc),
|
|
||||||
uintptr(hgdiobj))
|
|
||||||
|
|
||||||
if ret == 0 {
|
|
||||||
panic("SelectObject failed")
|
|
||||||
}
|
|
||||||
|
|
||||||
return HGDIOBJ(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func SetBkMode(hdc HDC, iBkMode int) int {
|
|
||||||
ret, _, _ := procSetBkMode.Call(
|
|
||||||
uintptr(hdc),
|
|
||||||
uintptr(iBkMode))
|
|
||||||
|
|
||||||
if ret == 0 {
|
|
||||||
panic("SetBkMode failed")
|
|
||||||
}
|
|
||||||
|
|
||||||
return int(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func SetBrushOrgEx(hdc HDC, nXOrg, nYOrg int, lppt *POINT) bool {
|
|
||||||
ret, _, _ := procSetBrushOrgEx.Call(
|
|
||||||
uintptr(hdc),
|
|
||||||
uintptr(nXOrg),
|
|
||||||
uintptr(nYOrg),
|
|
||||||
uintptr(unsafe.Pointer(lppt)))
|
|
||||||
|
|
||||||
return ret != 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func SetStretchBltMode(hdc HDC, iStretchMode int) int {
|
|
||||||
ret, _, _ := procSetStretchBltMode.Call(
|
|
||||||
uintptr(hdc),
|
|
||||||
uintptr(iStretchMode))
|
|
||||||
|
|
||||||
return int(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func SetTextColor(hdc HDC, crColor COLORREF) COLORREF {
|
|
||||||
ret, _, _ := procSetTextColor.Call(
|
|
||||||
uintptr(hdc),
|
|
||||||
uintptr(crColor))
|
|
||||||
|
|
||||||
if ret == CLR_INVALID {
|
|
||||||
panic("SetTextColor failed")
|
|
||||||
}
|
|
||||||
|
|
||||||
return COLORREF(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func SetBkColor(hdc HDC, crColor COLORREF) COLORREF {
|
|
||||||
ret, _, _ := procSetBkColor.Call(
|
|
||||||
uintptr(hdc),
|
|
||||||
uintptr(crColor))
|
|
||||||
|
|
||||||
if ret == CLR_INVALID {
|
|
||||||
panic("SetBkColor failed")
|
|
||||||
}
|
|
||||||
|
|
||||||
return COLORREF(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func StartDoc(hdc HDC, lpdi *DOCINFO) int {
|
|
||||||
ret, _, _ := procStartDoc.Call(
|
|
||||||
uintptr(hdc),
|
|
||||||
uintptr(unsafe.Pointer(lpdi)))
|
|
||||||
|
|
||||||
return int(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func StartPage(hdc HDC) int {
|
|
||||||
ret, _, _ := procStartPage.Call(
|
|
||||||
uintptr(hdc))
|
|
||||||
|
|
||||||
return int(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func StretchBlt(hdcDest HDC, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest int, hdcSrc HDC, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc int, dwRop uint) {
|
|
||||||
ret, _, _ := procStretchBlt.Call(
|
|
||||||
uintptr(hdcDest),
|
|
||||||
uintptr(nXOriginDest),
|
|
||||||
uintptr(nYOriginDest),
|
|
||||||
uintptr(nWidthDest),
|
|
||||||
uintptr(nHeightDest),
|
|
||||||
uintptr(hdcSrc),
|
|
||||||
uintptr(nXOriginSrc),
|
|
||||||
uintptr(nYOriginSrc),
|
|
||||||
uintptr(nWidthSrc),
|
|
||||||
uintptr(nHeightSrc),
|
|
||||||
uintptr(dwRop))
|
|
||||||
|
|
||||||
if ret == 0 {
|
|
||||||
panic("StretchBlt failed")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func SetDIBitsToDevice(hdc HDC, xDest, yDest, dwWidth, dwHeight, xSrc, ySrc int, uStartScan, cScanLines uint, lpvBits []byte, lpbmi *BITMAPINFO, fuColorUse uint) int {
|
|
||||||
ret, _, _ := procSetDIBitsToDevice.Call(
|
|
||||||
uintptr(hdc),
|
|
||||||
uintptr(xDest),
|
|
||||||
uintptr(yDest),
|
|
||||||
uintptr(dwWidth),
|
|
||||||
uintptr(dwHeight),
|
|
||||||
uintptr(xSrc),
|
|
||||||
uintptr(ySrc),
|
|
||||||
uintptr(uStartScan),
|
|
||||||
uintptr(cScanLines),
|
|
||||||
uintptr(unsafe.Pointer(&lpvBits[0])),
|
|
||||||
uintptr(unsafe.Pointer(lpbmi)),
|
|
||||||
uintptr(fuColorUse))
|
|
||||||
|
|
||||||
return int(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func ChoosePixelFormat(hdc HDC, pfd *PIXELFORMATDESCRIPTOR) int {
|
|
||||||
ret, _, _ := procChoosePixelFormat.Call(
|
|
||||||
uintptr(hdc),
|
|
||||||
uintptr(unsafe.Pointer(pfd)),
|
|
||||||
)
|
|
||||||
return int(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func DescribePixelFormat(hdc HDC, iPixelFormat int, nBytes uint, pfd *PIXELFORMATDESCRIPTOR) int {
|
|
||||||
ret, _, _ := procDescribePixelFormat.Call(
|
|
||||||
uintptr(hdc),
|
|
||||||
uintptr(iPixelFormat),
|
|
||||||
uintptr(nBytes),
|
|
||||||
uintptr(unsafe.Pointer(pfd)),
|
|
||||||
)
|
|
||||||
return int(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetEnhMetaFilePixelFormat(hemf HENHMETAFILE, cbBuffer uint32, pfd *PIXELFORMATDESCRIPTOR) uint {
|
|
||||||
ret, _, _ := procGetEnhMetaFilePixelFormat.Call(
|
|
||||||
uintptr(hemf),
|
|
||||||
uintptr(cbBuffer),
|
|
||||||
uintptr(unsafe.Pointer(pfd)),
|
|
||||||
)
|
|
||||||
return uint(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetPixelFormat(hdc HDC) int {
|
|
||||||
ret, _, _ := procGetPixelFormat.Call(
|
|
||||||
uintptr(hdc),
|
|
||||||
)
|
|
||||||
return int(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func SetPixelFormat(hdc HDC, iPixelFormat int, pfd *PIXELFORMATDESCRIPTOR) bool {
|
|
||||||
ret, _, _ := procSetPixelFormat.Call(
|
|
||||||
uintptr(hdc),
|
|
||||||
uintptr(iPixelFormat),
|
|
||||||
uintptr(unsafe.Pointer(pfd)),
|
|
||||||
)
|
|
||||||
return ret == TRUE
|
|
||||||
}
|
|
||||||
|
|
||||||
func SwapBuffers(hdc HDC) bool {
|
|
||||||
ret, _, _ := procSwapBuffers.Call(uintptr(hdc))
|
|
||||||
return ret == TRUE
|
|
||||||
}
|
|
||||||
175
vendor/github.com/apenwarr/w32/gdiplus.go
generated
vendored
175
vendor/github.com/apenwarr/w32/gdiplus.go
generated
vendored
|
|
@ -1,175 +0,0 @@
|
||||||
// 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 (
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
Ok = 0
|
|
||||||
GenericError = 1
|
|
||||||
InvalidParameter = 2
|
|
||||||
OutOfMemory = 3
|
|
||||||
ObjectBusy = 4
|
|
||||||
InsufficientBuffer = 5
|
|
||||||
NotImplemented = 6
|
|
||||||
Win32Error = 7
|
|
||||||
WrongState = 8
|
|
||||||
Aborted = 9
|
|
||||||
FileNotFound = 10
|
|
||||||
ValueOverflow = 11
|
|
||||||
AccessDenied = 12
|
|
||||||
UnknownImageFormat = 13
|
|
||||||
FontFamilyNotFound = 14
|
|
||||||
FontStyleNotFound = 15
|
|
||||||
NotTrueTypeFont = 16
|
|
||||||
UnsupportedGdiplusVersion = 17
|
|
||||||
GdiplusNotInitialized = 18
|
|
||||||
PropertyNotFound = 19
|
|
||||||
PropertyNotSupported = 20
|
|
||||||
ProfileNotFound = 21
|
|
||||||
)
|
|
||||||
|
|
||||||
func GetGpStatus(s int32) string {
|
|
||||||
switch s {
|
|
||||||
case Ok:
|
|
||||||
return "Ok"
|
|
||||||
case GenericError:
|
|
||||||
return "GenericError"
|
|
||||||
case InvalidParameter:
|
|
||||||
return "InvalidParameter"
|
|
||||||
case OutOfMemory:
|
|
||||||
return "OutOfMemory"
|
|
||||||
case ObjectBusy:
|
|
||||||
return "ObjectBusy"
|
|
||||||
case InsufficientBuffer:
|
|
||||||
return "InsufficientBuffer"
|
|
||||||
case NotImplemented:
|
|
||||||
return "NotImplemented"
|
|
||||||
case Win32Error:
|
|
||||||
return "Win32Error"
|
|
||||||
case WrongState:
|
|
||||||
return "WrongState"
|
|
||||||
case Aborted:
|
|
||||||
return "Aborted"
|
|
||||||
case FileNotFound:
|
|
||||||
return "FileNotFound"
|
|
||||||
case ValueOverflow:
|
|
||||||
return "ValueOverflow"
|
|
||||||
case AccessDenied:
|
|
||||||
return "AccessDenied"
|
|
||||||
case UnknownImageFormat:
|
|
||||||
return "UnknownImageFormat"
|
|
||||||
case FontFamilyNotFound:
|
|
||||||
return "FontFamilyNotFound"
|
|
||||||
case FontStyleNotFound:
|
|
||||||
return "FontStyleNotFound"
|
|
||||||
case NotTrueTypeFont:
|
|
||||||
return "NotTrueTypeFont"
|
|
||||||
case UnsupportedGdiplusVersion:
|
|
||||||
return "UnsupportedGdiplusVersion"
|
|
||||||
case GdiplusNotInitialized:
|
|
||||||
return "GdiplusNotInitialized"
|
|
||||||
case PropertyNotFound:
|
|
||||||
return "PropertyNotFound"
|
|
||||||
case PropertyNotSupported:
|
|
||||||
return "PropertyNotSupported"
|
|
||||||
case ProfileNotFound:
|
|
||||||
return "ProfileNotFound"
|
|
||||||
}
|
|
||||||
return "Unknown Status Value"
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
token uintptr
|
|
||||||
|
|
||||||
modgdiplus = syscall.NewLazyDLL("gdiplus.dll")
|
|
||||||
|
|
||||||
procGdipCreateBitmapFromFile = modgdiplus.NewProc("GdipCreateBitmapFromFile")
|
|
||||||
procGdipCreateBitmapFromHBITMAP = modgdiplus.NewProc("GdipCreateBitmapFromHBITMAP")
|
|
||||||
procGdipCreateHBITMAPFromBitmap = modgdiplus.NewProc("GdipCreateHBITMAPFromBitmap")
|
|
||||||
procGdipCreateBitmapFromResource = modgdiplus.NewProc("GdipCreateBitmapFromResource")
|
|
||||||
procGdipCreateBitmapFromStream = modgdiplus.NewProc("GdipCreateBitmapFromStream")
|
|
||||||
procGdipDisposeImage = modgdiplus.NewProc("GdipDisposeImage")
|
|
||||||
procGdiplusShutdown = modgdiplus.NewProc("GdiplusShutdown")
|
|
||||||
procGdiplusStartup = modgdiplus.NewProc("GdiplusStartup")
|
|
||||||
)
|
|
||||||
|
|
||||||
func GdipCreateBitmapFromFile(filename string) (*uintptr, error) {
|
|
||||||
var bitmap *uintptr
|
|
||||||
ret, _, _ := procGdipCreateBitmapFromFile.Call(
|
|
||||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(filename))),
|
|
||||||
uintptr(unsafe.Pointer(&bitmap)))
|
|
||||||
|
|
||||||
if ret != Ok {
|
|
||||||
return nil, errors.New(fmt.Sprintf("GdipCreateBitmapFromFile failed with status '%s' for file '%s'", GetGpStatus(int32(ret)), filename))
|
|
||||||
}
|
|
||||||
|
|
||||||
return bitmap, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func GdipCreateBitmapFromResource(instance HINSTANCE, resId *uint16) (*uintptr, error) {
|
|
||||||
var bitmap *uintptr
|
|
||||||
ret, _, _ := procGdipCreateBitmapFromResource.Call(
|
|
||||||
uintptr(instance),
|
|
||||||
uintptr(unsafe.Pointer(resId)),
|
|
||||||
uintptr(unsafe.Pointer(&bitmap)))
|
|
||||||
|
|
||||||
if ret != Ok {
|
|
||||||
return nil, errors.New(fmt.Sprintf("GdiCreateBitmapFromResource failed with status '%s'", GetGpStatus(int32(ret))))
|
|
||||||
}
|
|
||||||
|
|
||||||
return bitmap, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func GdipCreateBitmapFromStream(stream *IStream) (*uintptr, error) {
|
|
||||||
var bitmap *uintptr
|
|
||||||
ret, _, _ := procGdipCreateBitmapFromStream.Call(
|
|
||||||
uintptr(unsafe.Pointer(stream)),
|
|
||||||
uintptr(unsafe.Pointer(&bitmap)))
|
|
||||||
|
|
||||||
if ret != Ok {
|
|
||||||
return nil, errors.New(fmt.Sprintf("GdipCreateBitmapFromStream failed with status '%s'", GetGpStatus(int32(ret))))
|
|
||||||
}
|
|
||||||
|
|
||||||
return bitmap, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func GdipCreateHBITMAPFromBitmap(bitmap *uintptr, background uint32) (HBITMAP, error) {
|
|
||||||
var hbitmap HBITMAP
|
|
||||||
ret, _, _ := procGdipCreateHBITMAPFromBitmap.Call(
|
|
||||||
uintptr(unsafe.Pointer(bitmap)),
|
|
||||||
uintptr(unsafe.Pointer(&hbitmap)),
|
|
||||||
uintptr(background))
|
|
||||||
|
|
||||||
if ret != Ok {
|
|
||||||
return 0, errors.New(fmt.Sprintf("GdipCreateHBITMAPFromBitmap failed with status '%s'", GetGpStatus(int32(ret))))
|
|
||||||
}
|
|
||||||
|
|
||||||
return hbitmap, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func GdipDisposeImage(image *uintptr) {
|
|
||||||
procGdipDisposeImage.Call(uintptr(unsafe.Pointer(image)))
|
|
||||||
}
|
|
||||||
|
|
||||||
func GdiplusShutdown() {
|
|
||||||
procGdiplusShutdown.Call(token)
|
|
||||||
}
|
|
||||||
|
|
||||||
func GdiplusStartup(input *GdiplusStartupInput, output *GdiplusStartupOutput) {
|
|
||||||
ret, _, _ := procGdiplusStartup.Call(
|
|
||||||
uintptr(unsafe.Pointer(&token)),
|
|
||||||
uintptr(unsafe.Pointer(input)),
|
|
||||||
uintptr(unsafe.Pointer(output)))
|
|
||||||
|
|
||||||
if ret != Ok {
|
|
||||||
panic("GdiplusStartup failed with status " + GetGpStatus(int32(ret)))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
43
vendor/github.com/apenwarr/w32/idispatch.go
generated
vendored
43
vendor/github.com/apenwarr/w32/idispatch.go
generated
vendored
|
|
@ -1,43 +0,0 @@
|
||||||
// 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 (
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
type pIDispatchVtbl struct {
|
|
||||||
pQueryInterface uintptr
|
|
||||||
pAddRef uintptr
|
|
||||||
pRelease uintptr
|
|
||||||
pGetTypeInfoCount uintptr
|
|
||||||
pGetTypeInfo uintptr
|
|
||||||
pGetIDsOfNames uintptr
|
|
||||||
pInvoke uintptr
|
|
||||||
}
|
|
||||||
|
|
||||||
type IDispatch struct {
|
|
||||||
lpVtbl *pIDispatchVtbl
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *IDispatch) QueryInterface(id *GUID) *IDispatch {
|
|
||||||
return ComQueryInterface((*IUnknown)(unsafe.Pointer(this)), id)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *IDispatch) AddRef() int32 {
|
|
||||||
return ComAddRef((*IUnknown)(unsafe.Pointer(this)))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *IDispatch) Release() int32 {
|
|
||||||
return ComRelease((*IUnknown)(unsafe.Pointer(this)))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *IDispatch) GetIDsOfName(names []string) []int32 {
|
|
||||||
return ComGetIDsOfName(this, names)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *IDispatch) Invoke(dispid int32, dispatch int16, params ...interface{}) *VARIANT {
|
|
||||||
return ComInvoke(this, dispid, dispatch, params...)
|
|
||||||
}
|
|
||||||
31
vendor/github.com/apenwarr/w32/istream.go
generated
vendored
31
vendor/github.com/apenwarr/w32/istream.go
generated
vendored
|
|
@ -1,31 +0,0 @@
|
||||||
// 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 (
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
type pIStreamVtbl struct {
|
|
||||||
pQueryInterface uintptr
|
|
||||||
pAddRef uintptr
|
|
||||||
pRelease uintptr
|
|
||||||
}
|
|
||||||
|
|
||||||
type IStream struct {
|
|
||||||
lpVtbl *pIStreamVtbl
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *IStream) QueryInterface(id *GUID) *IDispatch {
|
|
||||||
return ComQueryInterface((*IUnknown)(unsafe.Pointer(this)), id)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *IStream) AddRef() int32 {
|
|
||||||
return ComAddRef((*IUnknown)(unsafe.Pointer(this)))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *IStream) Release() int32 {
|
|
||||||
return ComRelease((*IUnknown)(unsafe.Pointer(this)))
|
|
||||||
}
|
|
||||||
27
vendor/github.com/apenwarr/w32/iunknown.go
generated
vendored
27
vendor/github.com/apenwarr/w32/iunknown.go
generated
vendored
|
|
@ -1,27 +0,0 @@
|
||||||
// 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
|
|
||||||
|
|
||||||
type pIUnknownVtbl struct {
|
|
||||||
pQueryInterface uintptr
|
|
||||||
pAddRef uintptr
|
|
||||||
pRelease uintptr
|
|
||||||
}
|
|
||||||
|
|
||||||
type IUnknown struct {
|
|
||||||
lpVtbl *pIUnknownVtbl
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *IUnknown) QueryInterface(id *GUID) *IDispatch {
|
|
||||||
return ComQueryInterface(this, id)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *IUnknown) AddRef() int32 {
|
|
||||||
return ComAddRef(this)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *IUnknown) Release() int32 {
|
|
||||||
return ComRelease(this)
|
|
||||||
}
|
|
||||||
388
vendor/github.com/apenwarr/w32/kernel32.go
generated
vendored
388
vendor/github.com/apenwarr/w32/kernel32.go
generated
vendored
|
|
@ -1,388 +0,0 @@
|
||||||
// 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
|
|
||||||
}
|
|
||||||
63
vendor/github.com/apenwarr/w32/ole32.go
generated
vendored
63
vendor/github.com/apenwarr/w32/ole32.go
generated
vendored
|
|
@ -1,63 +0,0 @@
|
||||||
// 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 (
|
|
||||||
modole32 = syscall.NewLazyDLL("ole32.dll")
|
|
||||||
|
|
||||||
procCoInitializeEx = modole32.NewProc("CoInitializeEx")
|
|
||||||
procCoInitialize = modole32.NewProc("CoInitialize")
|
|
||||||
procCoUninitialize = modole32.NewProc("CoUninitialize")
|
|
||||||
procCreateStreamOnHGlobal = modole32.NewProc("CreateStreamOnHGlobal")
|
|
||||||
)
|
|
||||||
|
|
||||||
func CoInitializeEx(coInit uintptr) HRESULT {
|
|
||||||
ret, _, _ := procCoInitializeEx.Call(
|
|
||||||
0,
|
|
||||||
coInit)
|
|
||||||
|
|
||||||
switch uint32(ret) {
|
|
||||||
case E_INVALIDARG:
|
|
||||||
panic("CoInitializeEx failed with E_INVALIDARG")
|
|
||||||
case E_OUTOFMEMORY:
|
|
||||||
panic("CoInitializeEx failed with E_OUTOFMEMORY")
|
|
||||||
case E_UNEXPECTED:
|
|
||||||
panic("CoInitializeEx failed with E_UNEXPECTED")
|
|
||||||
}
|
|
||||||
|
|
||||||
return HRESULT(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func CoInitialize() {
|
|
||||||
procCoInitialize.Call(0)
|
|
||||||
}
|
|
||||||
|
|
||||||
func CoUninitialize() {
|
|
||||||
procCoUninitialize.Call()
|
|
||||||
}
|
|
||||||
|
|
||||||
func CreateStreamOnHGlobal(hGlobal HGLOBAL, fDeleteOnRelease bool) *IStream {
|
|
||||||
stream := new(IStream)
|
|
||||||
ret, _, _ := procCreateStreamOnHGlobal.Call(
|
|
||||||
uintptr(hGlobal),
|
|
||||||
uintptr(BoolToBOOL(fDeleteOnRelease)),
|
|
||||||
uintptr(unsafe.Pointer(&stream)))
|
|
||||||
|
|
||||||
switch uint32(ret) {
|
|
||||||
case E_INVALIDARG:
|
|
||||||
panic("CreateStreamOnHGlobal failed with E_INVALIDARG")
|
|
||||||
case E_OUTOFMEMORY:
|
|
||||||
panic("CreateStreamOnHGlobal failed with E_OUTOFMEMORY")
|
|
||||||
case E_UNEXPECTED:
|
|
||||||
panic("CreateStreamOnHGlobal failed with E_UNEXPECTED")
|
|
||||||
}
|
|
||||||
|
|
||||||
return stream
|
|
||||||
}
|
|
||||||
48
vendor/github.com/apenwarr/w32/oleaut32.go
generated
vendored
48
vendor/github.com/apenwarr/w32/oleaut32.go
generated
vendored
|
|
@ -1,48 +0,0 @@
|
||||||
// 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 (
|
|
||||||
modoleaut32 = syscall.NewLazyDLL("oleaut32")
|
|
||||||
|
|
||||||
procVariantInit = modoleaut32.NewProc("VariantInit")
|
|
||||||
procSysAllocString = modoleaut32.NewProc("SysAllocString")
|
|
||||||
procSysFreeString = modoleaut32.NewProc("SysFreeString")
|
|
||||||
procSysStringLen = modoleaut32.NewProc("SysStringLen")
|
|
||||||
procCreateDispTypeInfo = modoleaut32.NewProc("CreateDispTypeInfo")
|
|
||||||
procCreateStdDispatch = modoleaut32.NewProc("CreateStdDispatch")
|
|
||||||
)
|
|
||||||
|
|
||||||
func VariantInit(v *VARIANT) {
|
|
||||||
hr, _, _ := procVariantInit.Call(uintptr(unsafe.Pointer(v)))
|
|
||||||
if hr != 0 {
|
|
||||||
panic("Invoke VariantInit error.")
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func SysAllocString(v string) (ss *int16) {
|
|
||||||
pss, _, _ := procSysAllocString.Call(uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(v))))
|
|
||||||
ss = (*int16)(unsafe.Pointer(pss))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func SysFreeString(v *int16) {
|
|
||||||
hr, _, _ := procSysFreeString.Call(uintptr(unsafe.Pointer(v)))
|
|
||||||
if hr != 0 {
|
|
||||||
panic("Invoke SysFreeString error.")
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func SysStringLen(v *int16) uint {
|
|
||||||
l, _, _ := procSysStringLen.Call(uintptr(unsafe.Pointer(v)))
|
|
||||||
return uint(l)
|
|
||||||
}
|
|
||||||
72
vendor/github.com/apenwarr/w32/opengl32.go
generated
vendored
72
vendor/github.com/apenwarr/w32/opengl32.go
generated
vendored
|
|
@ -1,72 +0,0 @@
|
||||||
// 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 (
|
|
||||||
modopengl32 = syscall.NewLazyDLL("opengl32.dll")
|
|
||||||
|
|
||||||
procwglCreateContext = modopengl32.NewProc("wglCreateContext")
|
|
||||||
procwglCreateLayerContext = modopengl32.NewProc("wglCreateLayerContext")
|
|
||||||
procwglDeleteContext = modopengl32.NewProc("wglDeleteContext")
|
|
||||||
procwglGetProcAddress = modopengl32.NewProc("wglGetProcAddress")
|
|
||||||
procwglMakeCurrent = modopengl32.NewProc("wglMakeCurrent")
|
|
||||||
procwglShareLists = modopengl32.NewProc("wglShareLists")
|
|
||||||
)
|
|
||||||
|
|
||||||
func WglCreateContext(hdc HDC) HGLRC {
|
|
||||||
ret, _, _ := procwglCreateContext.Call(
|
|
||||||
uintptr(hdc),
|
|
||||||
)
|
|
||||||
|
|
||||||
return HGLRC(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func WglCreateLayerContext(hdc HDC, iLayerPlane int) HGLRC {
|
|
||||||
ret, _, _ := procwglCreateLayerContext.Call(
|
|
||||||
uintptr(hdc),
|
|
||||||
uintptr(iLayerPlane),
|
|
||||||
)
|
|
||||||
|
|
||||||
return HGLRC(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func WglDeleteContext(hglrc HGLRC) bool {
|
|
||||||
ret, _, _ := procwglDeleteContext.Call(
|
|
||||||
uintptr(hglrc),
|
|
||||||
)
|
|
||||||
|
|
||||||
return ret == TRUE
|
|
||||||
}
|
|
||||||
|
|
||||||
func WglGetProcAddress(szProc string) uintptr {
|
|
||||||
ret, _, _ := procwglGetProcAddress.Call(
|
|
||||||
uintptr(unsafe.Pointer(syscall.StringBytePtr(szProc))),
|
|
||||||
)
|
|
||||||
|
|
||||||
return ret
|
|
||||||
}
|
|
||||||
|
|
||||||
func WglMakeCurrent(hdc HDC, hglrc HGLRC) bool {
|
|
||||||
ret, _, _ := procwglMakeCurrent.Call(
|
|
||||||
uintptr(hdc),
|
|
||||||
uintptr(hglrc),
|
|
||||||
)
|
|
||||||
|
|
||||||
return ret == TRUE
|
|
||||||
}
|
|
||||||
|
|
||||||
func WglShareLists(hglrc1, hglrc2 HGLRC) bool {
|
|
||||||
ret, _, _ := procwglShareLists.Call(
|
|
||||||
uintptr(hglrc1),
|
|
||||||
uintptr(hglrc2),
|
|
||||||
)
|
|
||||||
|
|
||||||
return ret == TRUE
|
|
||||||
}
|
|
||||||
25
vendor/github.com/apenwarr/w32/psapi.go
generated
vendored
25
vendor/github.com/apenwarr/w32/psapi.go
generated
vendored
|
|
@ -1,25 +0,0 @@
|
||||||
// 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 (
|
|
||||||
modpsapi = syscall.NewLazyDLL("psapi.dll")
|
|
||||||
|
|
||||||
procEnumProcesses = modpsapi.NewProc("EnumProcesses")
|
|
||||||
)
|
|
||||||
|
|
||||||
func EnumProcesses(processIds []uint32, cb uint32, bytesReturned *uint32) bool {
|
|
||||||
ret, _, _ := procEnumProcesses.Call(
|
|
||||||
uintptr(unsafe.Pointer(&processIds[0])),
|
|
||||||
uintptr(cb),
|
|
||||||
uintptr(unsafe.Pointer(bytesReturned)))
|
|
||||||
|
|
||||||
return ret != 0
|
|
||||||
}
|
|
||||||
153
vendor/github.com/apenwarr/w32/shell32.go
generated
vendored
153
vendor/github.com/apenwarr/w32/shell32.go
generated
vendored
|
|
@ -1,153 +0,0 @@
|
||||||
// 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 (
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"syscall"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
modshell32 = syscall.NewLazyDLL("shell32.dll")
|
|
||||||
|
|
||||||
procSHBrowseForFolder = modshell32.NewProc("SHBrowseForFolderW")
|
|
||||||
procSHGetPathFromIDList = modshell32.NewProc("SHGetPathFromIDListW")
|
|
||||||
procDragAcceptFiles = modshell32.NewProc("DragAcceptFiles")
|
|
||||||
procDragQueryFile = modshell32.NewProc("DragQueryFileW")
|
|
||||||
procDragQueryPoint = modshell32.NewProc("DragQueryPoint")
|
|
||||||
procDragFinish = modshell32.NewProc("DragFinish")
|
|
||||||
procShellExecute = modshell32.NewProc("ShellExecuteW")
|
|
||||||
procExtractIcon = modshell32.NewProc("ExtractIconW")
|
|
||||||
)
|
|
||||||
|
|
||||||
func SHBrowseForFolder(bi *BROWSEINFO) uintptr {
|
|
||||||
ret, _, _ := procSHBrowseForFolder.Call(uintptr(unsafe.Pointer(bi)))
|
|
||||||
|
|
||||||
return ret
|
|
||||||
}
|
|
||||||
|
|
||||||
func SHGetPathFromIDList(idl uintptr) string {
|
|
||||||
buf := make([]uint16, 1024)
|
|
||||||
procSHGetPathFromIDList.Call(
|
|
||||||
idl,
|
|
||||||
uintptr(unsafe.Pointer(&buf[0])))
|
|
||||||
|
|
||||||
return syscall.UTF16ToString(buf)
|
|
||||||
}
|
|
||||||
|
|
||||||
func DragAcceptFiles(hwnd HWND, accept bool) {
|
|
||||||
procDragAcceptFiles.Call(
|
|
||||||
uintptr(hwnd),
|
|
||||||
uintptr(BoolToBOOL(accept)))
|
|
||||||
}
|
|
||||||
|
|
||||||
func DragQueryFile(hDrop HDROP, iFile uint) (fileName string, fileCount uint) {
|
|
||||||
ret, _, _ := procDragQueryFile.Call(
|
|
||||||
uintptr(hDrop),
|
|
||||||
uintptr(iFile),
|
|
||||||
0,
|
|
||||||
0)
|
|
||||||
|
|
||||||
fileCount = uint(ret)
|
|
||||||
|
|
||||||
if iFile != 0xFFFFFFFF {
|
|
||||||
buf := make([]uint16, fileCount+1)
|
|
||||||
|
|
||||||
ret, _, _ := procDragQueryFile.Call(
|
|
||||||
uintptr(hDrop),
|
|
||||||
uintptr(iFile),
|
|
||||||
uintptr(unsafe.Pointer(&buf[0])),
|
|
||||||
uintptr(fileCount+1))
|
|
||||||
|
|
||||||
if ret == 0 {
|
|
||||||
panic("Invoke DragQueryFile error.")
|
|
||||||
}
|
|
||||||
|
|
||||||
fileName = syscall.UTF16ToString(buf)
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func DragQueryPoint(hDrop HDROP) (x, y int, isClientArea bool) {
|
|
||||||
var pt POINT
|
|
||||||
ret, _, _ := procDragQueryPoint.Call(
|
|
||||||
uintptr(hDrop),
|
|
||||||
uintptr(unsafe.Pointer(&pt)))
|
|
||||||
|
|
||||||
return int(pt.X), int(pt.Y), (ret == 1)
|
|
||||||
}
|
|
||||||
|
|
||||||
func DragFinish(hDrop HDROP) {
|
|
||||||
procDragFinish.Call(uintptr(hDrop))
|
|
||||||
}
|
|
||||||
|
|
||||||
func ShellExecute(hwnd HWND, lpOperation, lpFile, lpParameters, lpDirectory string, nShowCmd int) error {
|
|
||||||
var op, param, directory uintptr
|
|
||||||
if len(lpOperation) != 0 {
|
|
||||||
op = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpOperation)))
|
|
||||||
}
|
|
||||||
if len(lpParameters) != 0 {
|
|
||||||
param = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpParameters)))
|
|
||||||
}
|
|
||||||
if len(lpDirectory) != 0 {
|
|
||||||
directory = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpDirectory)))
|
|
||||||
}
|
|
||||||
|
|
||||||
ret, _, _ := procShellExecute.Call(
|
|
||||||
uintptr(hwnd),
|
|
||||||
op,
|
|
||||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpFile))),
|
|
||||||
param,
|
|
||||||
directory,
|
|
||||||
uintptr(nShowCmd))
|
|
||||||
|
|
||||||
errorMsg := ""
|
|
||||||
if ret != 0 && ret <= 32 {
|
|
||||||
switch int(ret) {
|
|
||||||
case ERROR_FILE_NOT_FOUND:
|
|
||||||
errorMsg = "The specified file was not found."
|
|
||||||
case ERROR_PATH_NOT_FOUND:
|
|
||||||
errorMsg = "The specified path was not found."
|
|
||||||
case ERROR_BAD_FORMAT:
|
|
||||||
errorMsg = "The .exe file is invalid (non-Win32 .exe or error in .exe image)."
|
|
||||||
case SE_ERR_ACCESSDENIED:
|
|
||||||
errorMsg = "The operating system denied access to the specified file."
|
|
||||||
case SE_ERR_ASSOCINCOMPLETE:
|
|
||||||
errorMsg = "The file name association is incomplete or invalid."
|
|
||||||
case SE_ERR_DDEBUSY:
|
|
||||||
errorMsg = "The DDE transaction could not be completed because other DDE transactions were being processed."
|
|
||||||
case SE_ERR_DDEFAIL:
|
|
||||||
errorMsg = "The DDE transaction failed."
|
|
||||||
case SE_ERR_DDETIMEOUT:
|
|
||||||
errorMsg = "The DDE transaction could not be completed because the request timed out."
|
|
||||||
case SE_ERR_DLLNOTFOUND:
|
|
||||||
errorMsg = "The specified DLL was not found."
|
|
||||||
case SE_ERR_NOASSOC:
|
|
||||||
errorMsg = "There is no application associated with the given file name extension. This error will also be returned if you attempt to print a file that is not printable."
|
|
||||||
case SE_ERR_OOM:
|
|
||||||
errorMsg = "There was not enough memory to complete the operation."
|
|
||||||
case SE_ERR_SHARE:
|
|
||||||
errorMsg = "A sharing violation occurred."
|
|
||||||
default:
|
|
||||||
errorMsg = fmt.Sprintf("Unknown error occurred with error code %v", ret)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return errors.New(errorMsg)
|
|
||||||
}
|
|
||||||
|
|
||||||
func ExtractIcon(lpszExeFileName string, nIconIndex int) HICON {
|
|
||||||
ret, _, _ := procExtractIcon.Call(
|
|
||||||
0,
|
|
||||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpszExeFileName))),
|
|
||||||
uintptr(nIconIndex))
|
|
||||||
|
|
||||||
return HICON(ret)
|
|
||||||
}
|
|
||||||
891
vendor/github.com/apenwarr/w32/typedef.go
generated
vendored
891
vendor/github.com/apenwarr/w32/typedef.go
generated
vendored
|
|
@ -1,891 +0,0 @@
|
||||||
// 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 (
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
// From MSDN: Windows Data Types
|
|
||||||
// http://msdn.microsoft.com/en-us/library/s3f49ktz.aspx
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751.aspx
|
|
||||||
// ATOM WORD
|
|
||||||
// BOOL int32
|
|
||||||
// BOOLEAN byte
|
|
||||||
// BYTE byte
|
|
||||||
// CCHAR int8
|
|
||||||
// CHAR int8
|
|
||||||
// COLORREF DWORD
|
|
||||||
// DWORD uint32
|
|
||||||
// DWORDLONG ULONGLONG
|
|
||||||
// DWORD_PTR ULONG_PTR
|
|
||||||
// DWORD32 uint32
|
|
||||||
// DWORD64 uint64
|
|
||||||
// FLOAT float32
|
|
||||||
// HACCEL HANDLE
|
|
||||||
// HALF_PTR struct{} // ???
|
|
||||||
// HANDLE PVOID
|
|
||||||
// HBITMAP HANDLE
|
|
||||||
// HBRUSH HANDLE
|
|
||||||
// HCOLORSPACE HANDLE
|
|
||||||
// HCONV HANDLE
|
|
||||||
// HCONVLIST HANDLE
|
|
||||||
// HCURSOR HANDLE
|
|
||||||
// HDC HANDLE
|
|
||||||
// HDDEDATA HANDLE
|
|
||||||
// HDESK HANDLE
|
|
||||||
// HDROP HANDLE
|
|
||||||
// HDWP HANDLE
|
|
||||||
// HENHMETAFILE HANDLE
|
|
||||||
// HFILE HANDLE
|
|
||||||
// HFONT HANDLE
|
|
||||||
// HGDIOBJ HANDLE
|
|
||||||
// HGLOBAL HANDLE
|
|
||||||
// HHOOK HANDLE
|
|
||||||
// HICON HANDLE
|
|
||||||
// HINSTANCE HANDLE
|
|
||||||
// HKEY HANDLE
|
|
||||||
// HKL HANDLE
|
|
||||||
// HLOCAL HANDLE
|
|
||||||
// HMENU HANDLE
|
|
||||||
// HMETAFILE HANDLE
|
|
||||||
// HMODULE HANDLE
|
|
||||||
// HPALETTE HANDLE
|
|
||||||
// HPEN HANDLE
|
|
||||||
// HRESULT int32
|
|
||||||
// HRGN HANDLE
|
|
||||||
// HSZ HANDLE
|
|
||||||
// HWINSTA HANDLE
|
|
||||||
// HWND HANDLE
|
|
||||||
// INT int32
|
|
||||||
// INT_PTR uintptr
|
|
||||||
// INT8 int8
|
|
||||||
// INT16 int16
|
|
||||||
// INT32 int32
|
|
||||||
// INT64 int64
|
|
||||||
// LANGID WORD
|
|
||||||
// LCID DWORD
|
|
||||||
// LCTYPE DWORD
|
|
||||||
// LGRPID DWORD
|
|
||||||
// LONG int32
|
|
||||||
// LONGLONG int64
|
|
||||||
// LONG_PTR uintptr
|
|
||||||
// LONG32 int32
|
|
||||||
// LONG64 int64
|
|
||||||
// LPARAM LONG_PTR
|
|
||||||
// LPBOOL *BOOL
|
|
||||||
// LPBYTE *BYTE
|
|
||||||
// LPCOLORREF *COLORREF
|
|
||||||
// LPCSTR *int8
|
|
||||||
// LPCTSTR LPCWSTR
|
|
||||||
// LPCVOID unsafe.Pointer
|
|
||||||
// LPCWSTR *WCHAR
|
|
||||||
// LPDWORD *DWORD
|
|
||||||
// LPHANDLE *HANDLE
|
|
||||||
// LPINT *INT
|
|
||||||
// LPLONG *LONG
|
|
||||||
// LPSTR *CHAR
|
|
||||||
// LPTSTR LPWSTR
|
|
||||||
// LPVOID unsafe.Pointer
|
|
||||||
// LPWORD *WORD
|
|
||||||
// LPWSTR *WCHAR
|
|
||||||
// LRESULT LONG_PTR
|
|
||||||
// PBOOL *BOOL
|
|
||||||
// PBOOLEAN *BOOLEAN
|
|
||||||
// PBYTE *BYTE
|
|
||||||
// PCHAR *CHAR
|
|
||||||
// PCSTR *CHAR
|
|
||||||
// PCTSTR PCWSTR
|
|
||||||
// PCWSTR *WCHAR
|
|
||||||
// PDWORD *DWORD
|
|
||||||
// PDWORDLONG *DWORDLONG
|
|
||||||
// PDWORD_PTR *DWORD_PTR
|
|
||||||
// PDWORD32 *DWORD32
|
|
||||||
// PDWORD64 *DWORD64
|
|
||||||
// PFLOAT *FLOAT
|
|
||||||
// PHALF_PTR *HALF_PTR
|
|
||||||
// PHANDLE *HANDLE
|
|
||||||
// PHKEY *HKEY
|
|
||||||
// PINT_PTR *INT_PTR
|
|
||||||
// PINT8 *INT8
|
|
||||||
// PINT16 *INT16
|
|
||||||
// PINT32 *INT32
|
|
||||||
// PINT64 *INT64
|
|
||||||
// PLCID *LCID
|
|
||||||
// PLONG *LONG
|
|
||||||
// PLONGLONG *LONGLONG
|
|
||||||
// PLONG_PTR *LONG_PTR
|
|
||||||
// PLONG32 *LONG32
|
|
||||||
// PLONG64 *LONG64
|
|
||||||
// POINTER_32 struct{} // ???
|
|
||||||
// POINTER_64 struct{} // ???
|
|
||||||
// POINTER_SIGNED uintptr
|
|
||||||
// POINTER_UNSIGNED uintptr
|
|
||||||
// PSHORT *SHORT
|
|
||||||
// PSIZE_T *SIZE_T
|
|
||||||
// PSSIZE_T *SSIZE_T
|
|
||||||
// PSTR *CHAR
|
|
||||||
// PTBYTE *TBYTE
|
|
||||||
// PTCHAR *TCHAR
|
|
||||||
// PTSTR PWSTR
|
|
||||||
// PUCHAR *UCHAR
|
|
||||||
// PUHALF_PTR *UHALF_PTR
|
|
||||||
// PUINT *UINT
|
|
||||||
// PUINT_PTR *UINT_PTR
|
|
||||||
// PUINT8 *UINT8
|
|
||||||
// PUINT16 *UINT16
|
|
||||||
// PUINT32 *UINT32
|
|
||||||
// PUINT64 *UINT64
|
|
||||||
// PULONG *ULONG
|
|
||||||
// PULONGLONG *ULONGLONG
|
|
||||||
// PULONG_PTR *ULONG_PTR
|
|
||||||
// PULONG32 *ULONG32
|
|
||||||
// PULONG64 *ULONG64
|
|
||||||
// PUSHORT *USHORT
|
|
||||||
// PVOID unsafe.Pointer
|
|
||||||
// PWCHAR *WCHAR
|
|
||||||
// PWORD *WORD
|
|
||||||
// PWSTR *WCHAR
|
|
||||||
// QWORD uint64
|
|
||||||
// SC_HANDLE HANDLE
|
|
||||||
// SC_LOCK LPVOID
|
|
||||||
// SERVICE_STATUS_HANDLE HANDLE
|
|
||||||
// SHORT int16
|
|
||||||
// SIZE_T ULONG_PTR
|
|
||||||
// SSIZE_T LONG_PTR
|
|
||||||
// TBYTE WCHAR
|
|
||||||
// TCHAR WCHAR
|
|
||||||
// UCHAR uint8
|
|
||||||
// UHALF_PTR struct{} // ???
|
|
||||||
// UINT uint32
|
|
||||||
// UINT_PTR uintptr
|
|
||||||
// UINT8 uint8
|
|
||||||
// UINT16 uint16
|
|
||||||
// UINT32 uint32
|
|
||||||
// UINT64 uint64
|
|
||||||
// ULONG uint32
|
|
||||||
// ULONGLONG uint64
|
|
||||||
// ULONG_PTR uintptr
|
|
||||||
// ULONG32 uint32
|
|
||||||
// ULONG64 uint64
|
|
||||||
// USHORT uint16
|
|
||||||
// USN LONGLONG
|
|
||||||
// WCHAR uint16
|
|
||||||
// WORD uint16
|
|
||||||
// WPARAM UINT_PTR
|
|
||||||
type (
|
|
||||||
ATOM uint16
|
|
||||||
BOOL int32
|
|
||||||
COLORREF uint32
|
|
||||||
DWM_FRAME_COUNT uint64
|
|
||||||
DWORD uint32
|
|
||||||
HACCEL HANDLE
|
|
||||||
HANDLE uintptr
|
|
||||||
HBITMAP HANDLE
|
|
||||||
HBRUSH HANDLE
|
|
||||||
HCURSOR HANDLE
|
|
||||||
HDC HANDLE
|
|
||||||
HDROP HANDLE
|
|
||||||
HDWP HANDLE
|
|
||||||
HENHMETAFILE HANDLE
|
|
||||||
HFONT HANDLE
|
|
||||||
HGDIOBJ HANDLE
|
|
||||||
HGLOBAL HANDLE
|
|
||||||
HGLRC HANDLE
|
|
||||||
HHOOK HANDLE
|
|
||||||
HICON HANDLE
|
|
||||||
HIMAGELIST HANDLE
|
|
||||||
HINSTANCE HANDLE
|
|
||||||
HKEY HANDLE
|
|
||||||
HKL HANDLE
|
|
||||||
HMENU HANDLE
|
|
||||||
HMODULE HANDLE
|
|
||||||
HMONITOR HANDLE
|
|
||||||
HPEN HANDLE
|
|
||||||
HRESULT int32
|
|
||||||
HRGN HANDLE
|
|
||||||
HRSRC HANDLE
|
|
||||||
HTHUMBNAIL HANDLE
|
|
||||||
HWND HANDLE
|
|
||||||
LPARAM uintptr
|
|
||||||
LPCVOID unsafe.Pointer
|
|
||||||
LRESULT uintptr
|
|
||||||
PVOID unsafe.Pointer
|
|
||||||
QPC_TIME uint64
|
|
||||||
ULONG_PTR uintptr
|
|
||||||
WPARAM uintptr
|
|
||||||
TRACEHANDLE uintptr
|
|
||||||
)
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd162805.aspx
|
|
||||||
type POINT struct {
|
|
||||||
X, Y int32
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd162897.aspx
|
|
||||||
type RECT struct {
|
|
||||||
Left, Top, Right, Bottom int32
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms633577.aspx
|
|
||||||
type WNDCLASSEX struct {
|
|
||||||
Size uint32
|
|
||||||
Style uint32
|
|
||||||
WndProc uintptr
|
|
||||||
ClsExtra int32
|
|
||||||
WndExtra int32
|
|
||||||
Instance HINSTANCE
|
|
||||||
Icon HICON
|
|
||||||
Cursor HCURSOR
|
|
||||||
Background HBRUSH
|
|
||||||
MenuName *uint16
|
|
||||||
ClassName *uint16
|
|
||||||
IconSm HICON
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms644958.aspx
|
|
||||||
type MSG struct {
|
|
||||||
Hwnd HWND
|
|
||||||
Message uint32
|
|
||||||
WParam uintptr
|
|
||||||
LParam uintptr
|
|
||||||
Time uint32
|
|
||||||
Pt POINT
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd145037.aspx
|
|
||||||
type LOGFONT struct {
|
|
||||||
Height int32
|
|
||||||
Width int32
|
|
||||||
Escapement int32
|
|
||||||
Orientation int32
|
|
||||||
Weight int32
|
|
||||||
Italic byte
|
|
||||||
Underline byte
|
|
||||||
StrikeOut byte
|
|
||||||
CharSet byte
|
|
||||||
OutPrecision byte
|
|
||||||
ClipPrecision byte
|
|
||||||
Quality byte
|
|
||||||
PitchAndFamily byte
|
|
||||||
FaceName [LF_FACESIZE]uint16
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms646839.aspx
|
|
||||||
type OPENFILENAME struct {
|
|
||||||
StructSize uint32
|
|
||||||
Owner HWND
|
|
||||||
Instance HINSTANCE
|
|
||||||
Filter *uint16
|
|
||||||
CustomFilter *uint16
|
|
||||||
MaxCustomFilter uint32
|
|
||||||
FilterIndex uint32
|
|
||||||
File *uint16
|
|
||||||
MaxFile uint32
|
|
||||||
FileTitle *uint16
|
|
||||||
MaxFileTitle uint32
|
|
||||||
InitialDir *uint16
|
|
||||||
Title *uint16
|
|
||||||
Flags uint32
|
|
||||||
FileOffset uint16
|
|
||||||
FileExtension uint16
|
|
||||||
DefExt *uint16
|
|
||||||
CustData uintptr
|
|
||||||
FnHook uintptr
|
|
||||||
TemplateName *uint16
|
|
||||||
PvReserved unsafe.Pointer
|
|
||||||
DwReserved uint32
|
|
||||||
FlagsEx uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/bb773205.aspx
|
|
||||||
type BROWSEINFO struct {
|
|
||||||
Owner HWND
|
|
||||||
Root *uint16
|
|
||||||
DisplayName *uint16
|
|
||||||
Title *uint16
|
|
||||||
Flags uint32
|
|
||||||
CallbackFunc uintptr
|
|
||||||
LParam uintptr
|
|
||||||
Image int32
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa373931.aspx
|
|
||||||
type GUID struct {
|
|
||||||
Data1 uint32
|
|
||||||
Data2 uint16
|
|
||||||
Data3 uint16
|
|
||||||
Data4 [8]byte
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms221627.aspx
|
|
||||||
type VARIANT struct {
|
|
||||||
VT uint16 // 2
|
|
||||||
WReserved1 uint16 // 4
|
|
||||||
WReserved2 uint16 // 6
|
|
||||||
WReserved3 uint16 // 8
|
|
||||||
Val int64 // 16
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms221416.aspx
|
|
||||||
type DISPPARAMS struct {
|
|
||||||
Rgvarg uintptr
|
|
||||||
RgdispidNamedArgs uintptr
|
|
||||||
CArgs uint32
|
|
||||||
CNamedArgs uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms221133.aspx
|
|
||||||
type EXCEPINFO struct {
|
|
||||||
WCode uint16
|
|
||||||
WReserved uint16
|
|
||||||
BstrSource *uint16
|
|
||||||
BstrDescription *uint16
|
|
||||||
BstrHelpFile *uint16
|
|
||||||
DwHelpContext uint32
|
|
||||||
PvReserved uintptr
|
|
||||||
PfnDeferredFillIn uintptr
|
|
||||||
Scode int32
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd145035.aspx
|
|
||||||
type LOGBRUSH struct {
|
|
||||||
LbStyle uint32
|
|
||||||
LbColor COLORREF
|
|
||||||
LbHatch uintptr
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd183565.aspx
|
|
||||||
type DEVMODE struct {
|
|
||||||
DmDeviceName [CCHDEVICENAME]uint16
|
|
||||||
DmSpecVersion uint16
|
|
||||||
DmDriverVersion uint16
|
|
||||||
DmSize uint16
|
|
||||||
DmDriverExtra uint16
|
|
||||||
DmFields uint32
|
|
||||||
DmOrientation int16
|
|
||||||
DmPaperSize int16
|
|
||||||
DmPaperLength int16
|
|
||||||
DmPaperWidth int16
|
|
||||||
DmScale int16
|
|
||||||
DmCopies int16
|
|
||||||
DmDefaultSource int16
|
|
||||||
DmPrintQuality int16
|
|
||||||
DmColor int16
|
|
||||||
DmDuplex int16
|
|
||||||
DmYResolution int16
|
|
||||||
DmTTOption int16
|
|
||||||
DmCollate int16
|
|
||||||
DmFormName [CCHFORMNAME]uint16
|
|
||||||
DmLogPixels uint16
|
|
||||||
DmBitsPerPel uint32
|
|
||||||
DmPelsWidth uint32
|
|
||||||
DmPelsHeight uint32
|
|
||||||
DmDisplayFlags uint32
|
|
||||||
DmDisplayFrequency uint32
|
|
||||||
DmICMMethod uint32
|
|
||||||
DmICMIntent uint32
|
|
||||||
DmMediaType uint32
|
|
||||||
DmDitherType uint32
|
|
||||||
DmReserved1 uint32
|
|
||||||
DmReserved2 uint32
|
|
||||||
DmPanningWidth uint32
|
|
||||||
DmPanningHeight uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd183376.aspx
|
|
||||||
type BITMAPINFOHEADER struct {
|
|
||||||
BiSize uint32
|
|
||||||
BiWidth int32
|
|
||||||
BiHeight int32
|
|
||||||
BiPlanes uint16
|
|
||||||
BiBitCount uint16
|
|
||||||
BiCompression uint32
|
|
||||||
BiSizeImage uint32
|
|
||||||
BiXPelsPerMeter int32
|
|
||||||
BiYPelsPerMeter int32
|
|
||||||
BiClrUsed uint32
|
|
||||||
BiClrImportant uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd162938.aspx
|
|
||||||
type RGBQUAD struct {
|
|
||||||
RgbBlue byte
|
|
||||||
RgbGreen byte
|
|
||||||
RgbRed byte
|
|
||||||
RgbReserved byte
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd183375.aspx
|
|
||||||
type BITMAPINFO struct {
|
|
||||||
BmiHeader BITMAPINFOHEADER
|
|
||||||
BmiColors *RGBQUAD
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd183371.aspx
|
|
||||||
type BITMAP struct {
|
|
||||||
BmType int32
|
|
||||||
BmWidth int32
|
|
||||||
BmHeight int32
|
|
||||||
BmWidthBytes int32
|
|
||||||
BmPlanes uint16
|
|
||||||
BmBitsPixel uint16
|
|
||||||
BmBits unsafe.Pointer
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd183567.aspx
|
|
||||||
type DIBSECTION struct {
|
|
||||||
DsBm BITMAP
|
|
||||||
DsBmih BITMAPINFOHEADER
|
|
||||||
DsBitfields [3]uint32
|
|
||||||
DshSection HANDLE
|
|
||||||
DsOffset uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd162607.aspx
|
|
||||||
type ENHMETAHEADER struct {
|
|
||||||
IType uint32
|
|
||||||
NSize uint32
|
|
||||||
RclBounds RECT
|
|
||||||
RclFrame RECT
|
|
||||||
DSignature uint32
|
|
||||||
NVersion uint32
|
|
||||||
NBytes uint32
|
|
||||||
NRecords uint32
|
|
||||||
NHandles uint16
|
|
||||||
SReserved uint16
|
|
||||||
NDescription uint32
|
|
||||||
OffDescription uint32
|
|
||||||
NPalEntries uint32
|
|
||||||
SzlDevice SIZE
|
|
||||||
SzlMillimeters SIZE
|
|
||||||
CbPixelFormat uint32
|
|
||||||
OffPixelFormat uint32
|
|
||||||
BOpenGL uint32
|
|
||||||
SzlMicrometers SIZE
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd145106.aspx
|
|
||||||
type SIZE struct {
|
|
||||||
CX, CY int32
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd145132.aspx
|
|
||||||
type TEXTMETRIC struct {
|
|
||||||
TmHeight int32
|
|
||||||
TmAscent int32
|
|
||||||
TmDescent int32
|
|
||||||
TmInternalLeading int32
|
|
||||||
TmExternalLeading int32
|
|
||||||
TmAveCharWidth int32
|
|
||||||
TmMaxCharWidth int32
|
|
||||||
TmWeight int32
|
|
||||||
TmOverhang int32
|
|
||||||
TmDigitizedAspectX int32
|
|
||||||
TmDigitizedAspectY int32
|
|
||||||
TmFirstChar uint16
|
|
||||||
TmLastChar uint16
|
|
||||||
TmDefaultChar uint16
|
|
||||||
TmBreakChar uint16
|
|
||||||
TmItalic byte
|
|
||||||
TmUnderlined byte
|
|
||||||
TmStruckOut byte
|
|
||||||
TmPitchAndFamily byte
|
|
||||||
TmCharSet byte
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd183574.aspx
|
|
||||||
type DOCINFO struct {
|
|
||||||
CbSize int32
|
|
||||||
LpszDocName *uint16
|
|
||||||
LpszOutput *uint16
|
|
||||||
LpszDatatype *uint16
|
|
||||||
FwType uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/bb775514.aspx
|
|
||||||
type NMHDR struct {
|
|
||||||
HwndFrom HWND
|
|
||||||
IdFrom uintptr
|
|
||||||
Code uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/bb774743.aspx
|
|
||||||
type LVCOLUMN struct {
|
|
||||||
Mask uint32
|
|
||||||
Fmt int32
|
|
||||||
Cx int32
|
|
||||||
PszText *uint16
|
|
||||||
CchTextMax int32
|
|
||||||
ISubItem int32
|
|
||||||
IImage int32
|
|
||||||
IOrder int32
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/bb774760.aspx
|
|
||||||
type LVITEM struct {
|
|
||||||
Mask uint32
|
|
||||||
IItem int32
|
|
||||||
ISubItem int32
|
|
||||||
State uint32
|
|
||||||
StateMask uint32
|
|
||||||
PszText *uint16
|
|
||||||
CchTextMax int32
|
|
||||||
IImage int32
|
|
||||||
LParam uintptr
|
|
||||||
IIndent int32
|
|
||||||
IGroupId int32
|
|
||||||
CColumns uint32
|
|
||||||
PuColumns uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/bb774754.aspx
|
|
||||||
type LVHITTESTINFO struct {
|
|
||||||
Pt POINT
|
|
||||||
Flags uint32
|
|
||||||
IItem int32
|
|
||||||
ISubItem int32
|
|
||||||
IGroup int32
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/bb774771.aspx
|
|
||||||
type NMITEMACTIVATE struct {
|
|
||||||
Hdr NMHDR
|
|
||||||
IItem int32
|
|
||||||
ISubItem int32
|
|
||||||
UNewState uint32
|
|
||||||
UOldState uint32
|
|
||||||
UChanged uint32
|
|
||||||
PtAction POINT
|
|
||||||
LParam uintptr
|
|
||||||
UKeyFlags uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/bb774773.aspx
|
|
||||||
type NMLISTVIEW struct {
|
|
||||||
Hdr NMHDR
|
|
||||||
IItem int32
|
|
||||||
ISubItem int32
|
|
||||||
UNewState uint32
|
|
||||||
UOldState uint32
|
|
||||||
UChanged uint32
|
|
||||||
PtAction POINT
|
|
||||||
LParam uintptr
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/bb774780.aspx
|
|
||||||
type NMLVDISPINFO struct {
|
|
||||||
Hdr NMHDR
|
|
||||||
Item LVITEM
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/bb775507.aspx
|
|
||||||
type INITCOMMONCONTROLSEX struct {
|
|
||||||
DwSize uint32
|
|
||||||
DwICC uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/bb760256.aspx
|
|
||||||
type TOOLINFO struct {
|
|
||||||
CbSize uint32
|
|
||||||
UFlags uint32
|
|
||||||
Hwnd HWND
|
|
||||||
UId uintptr
|
|
||||||
Rect RECT
|
|
||||||
Hinst HINSTANCE
|
|
||||||
LpszText *uint16
|
|
||||||
LParam uintptr
|
|
||||||
LpReserved unsafe.Pointer
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms645604.aspx
|
|
||||||
type TRACKMOUSEEVENT struct {
|
|
||||||
CbSize uint32
|
|
||||||
DwFlags uint32
|
|
||||||
HwndTrack HWND
|
|
||||||
DwHoverTime uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms534067.aspx
|
|
||||||
type GdiplusStartupInput struct {
|
|
||||||
GdiplusVersion uint32
|
|
||||||
DebugEventCallback uintptr
|
|
||||||
SuppressBackgroundThread BOOL
|
|
||||||
SuppressExternalCodecs BOOL
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms534068.aspx
|
|
||||||
type GdiplusStartupOutput struct {
|
|
||||||
NotificationHook uintptr
|
|
||||||
NotificationUnhook uintptr
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd162768.aspx
|
|
||||||
type PAINTSTRUCT struct {
|
|
||||||
Hdc HDC
|
|
||||||
FErase BOOL
|
|
||||||
RcPaint RECT
|
|
||||||
FRestore BOOL
|
|
||||||
FIncUpdate BOOL
|
|
||||||
RgbReserved [32]byte
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms684225.aspx
|
|
||||||
type MODULEENTRY32 struct {
|
|
||||||
Size uint32
|
|
||||||
ModuleID uint32
|
|
||||||
ProcessID uint32
|
|
||||||
GlblcntUsage uint32
|
|
||||||
ProccntUsage uint32
|
|
||||||
ModBaseAddr *uint8
|
|
||||||
ModBaseSize uint32
|
|
||||||
HModule HMODULE
|
|
||||||
SzModule [MAX_MODULE_NAME32 + 1]uint16
|
|
||||||
SzExePath [MAX_PATH]uint16
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms724284.aspx
|
|
||||||
type FILETIME struct {
|
|
||||||
DwLowDateTime uint32
|
|
||||||
DwHighDateTime uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms682119.aspx
|
|
||||||
type COORD struct {
|
|
||||||
X, Y int16
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms686311.aspx
|
|
||||||
type SMALL_RECT struct {
|
|
||||||
Left, Top, Right, Bottom int16
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms682093.aspx
|
|
||||||
type CONSOLE_SCREEN_BUFFER_INFO struct {
|
|
||||||
DwSize COORD
|
|
||||||
DwCursorPosition COORD
|
|
||||||
WAttributes uint16
|
|
||||||
SrWindow SMALL_RECT
|
|
||||||
DwMaximumWindowSize COORD
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/bb773244.aspx
|
|
||||||
type MARGINS struct {
|
|
||||||
CxLeftWidth, CxRightWidth, CyTopHeight, CyBottomHeight int32
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa969500.aspx
|
|
||||||
type DWM_BLURBEHIND struct {
|
|
||||||
DwFlags uint32
|
|
||||||
fEnable BOOL
|
|
||||||
hRgnBlur HRGN
|
|
||||||
fTransitionOnMaximized BOOL
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa969501.aspx
|
|
||||||
type DWM_PRESENT_PARAMETERS struct {
|
|
||||||
cbSize uint32
|
|
||||||
fQueue BOOL
|
|
||||||
cRefreshStart DWM_FRAME_COUNT
|
|
||||||
cBuffer uint32
|
|
||||||
fUseSourceRate BOOL
|
|
||||||
rateSource UNSIGNED_RATIO
|
|
||||||
cRefreshesPerFrame uint32
|
|
||||||
eSampling DWM_SOURCE_FRAME_SAMPLING
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa969502.aspx
|
|
||||||
type DWM_THUMBNAIL_PROPERTIES struct {
|
|
||||||
dwFlags uint32
|
|
||||||
rcDestination RECT
|
|
||||||
rcSource RECT
|
|
||||||
opacity byte
|
|
||||||
fVisible BOOL
|
|
||||||
fSourceClientAreaOnly BOOL
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa969503.aspx
|
|
||||||
type DWM_TIMING_INFO struct {
|
|
||||||
cbSize uint32
|
|
||||||
rateRefresh UNSIGNED_RATIO
|
|
||||||
qpcRefreshPeriod QPC_TIME
|
|
||||||
rateCompose UNSIGNED_RATIO
|
|
||||||
qpcVBlank QPC_TIME
|
|
||||||
cRefresh DWM_FRAME_COUNT
|
|
||||||
cDXRefresh uint32
|
|
||||||
qpcCompose QPC_TIME
|
|
||||||
cFrame DWM_FRAME_COUNT
|
|
||||||
cDXPresent uint32
|
|
||||||
cRefreshFrame DWM_FRAME_COUNT
|
|
||||||
cFrameSubmitted DWM_FRAME_COUNT
|
|
||||||
cDXPresentSubmitted uint32
|
|
||||||
cFrameConfirmed DWM_FRAME_COUNT
|
|
||||||
cDXPresentConfirmed uint32
|
|
||||||
cRefreshConfirmed DWM_FRAME_COUNT
|
|
||||||
cDXRefreshConfirmed uint32
|
|
||||||
cFramesLate DWM_FRAME_COUNT
|
|
||||||
cFramesOutstanding uint32
|
|
||||||
cFrameDisplayed DWM_FRAME_COUNT
|
|
||||||
qpcFrameDisplayed QPC_TIME
|
|
||||||
cRefreshFrameDisplayed DWM_FRAME_COUNT
|
|
||||||
cFrameComplete DWM_FRAME_COUNT
|
|
||||||
qpcFrameComplete QPC_TIME
|
|
||||||
cFramePending DWM_FRAME_COUNT
|
|
||||||
qpcFramePending QPC_TIME
|
|
||||||
cFramesDisplayed DWM_FRAME_COUNT
|
|
||||||
cFramesComplete DWM_FRAME_COUNT
|
|
||||||
cFramesPending DWM_FRAME_COUNT
|
|
||||||
cFramesAvailable DWM_FRAME_COUNT
|
|
||||||
cFramesDropped DWM_FRAME_COUNT
|
|
||||||
cFramesMissed DWM_FRAME_COUNT
|
|
||||||
cRefreshNextDisplayed DWM_FRAME_COUNT
|
|
||||||
cRefreshNextPresented DWM_FRAME_COUNT
|
|
||||||
cRefreshesDisplayed DWM_FRAME_COUNT
|
|
||||||
cRefreshesPresented DWM_FRAME_COUNT
|
|
||||||
cRefreshStarted DWM_FRAME_COUNT
|
|
||||||
cPixelsReceived uint64
|
|
||||||
cPixelsDrawn uint64
|
|
||||||
cBuffersEmpty DWM_FRAME_COUNT
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd389402.aspx
|
|
||||||
type MilMatrix3x2D struct {
|
|
||||||
S_11, S_12, S_21, S_22 float64
|
|
||||||
DX, DY float64
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa969505.aspx
|
|
||||||
type UNSIGNED_RATIO struct {
|
|
||||||
uiNumerator uint32
|
|
||||||
uiDenominator uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms632603.aspx
|
|
||||||
type CREATESTRUCT struct {
|
|
||||||
CreateParams uintptr
|
|
||||||
Instance HINSTANCE
|
|
||||||
Menu HMENU
|
|
||||||
Parent HWND
|
|
||||||
Cy, Cx int32
|
|
||||||
Y, X int32
|
|
||||||
Style int32
|
|
||||||
Name *uint16
|
|
||||||
Class *uint16
|
|
||||||
dwExStyle uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd145065.aspx
|
|
||||||
type MONITORINFO struct {
|
|
||||||
CbSize uint32
|
|
||||||
RcMonitor RECT
|
|
||||||
RcWork RECT
|
|
||||||
DwFlags uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd145066.aspx
|
|
||||||
type MONITORINFOEX struct {
|
|
||||||
MONITORINFO
|
|
||||||
SzDevice [CCHDEVICENAME]uint16
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd368826.aspx
|
|
||||||
type PIXELFORMATDESCRIPTOR struct {
|
|
||||||
Size uint16
|
|
||||||
Version uint16
|
|
||||||
DwFlags uint32
|
|
||||||
IPixelType byte
|
|
||||||
ColorBits byte
|
|
||||||
RedBits, RedShift byte
|
|
||||||
GreenBits, GreenShift byte
|
|
||||||
BlueBits, BlueShift byte
|
|
||||||
AlphaBits, AlphaShift byte
|
|
||||||
AccumBits byte
|
|
||||||
AccumRedBits byte
|
|
||||||
AccumGreenBits byte
|
|
||||||
AccumBlueBits byte
|
|
||||||
AccumAlphaBits byte
|
|
||||||
DepthBits, StencilBits byte
|
|
||||||
AuxBuffers byte
|
|
||||||
ILayerType byte
|
|
||||||
Reserved byte
|
|
||||||
DwLayerMask uint32
|
|
||||||
DwVisibleMask uint32
|
|
||||||
DwDamageMask uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms646270(v=vs.85).aspx
|
|
||||||
type INPUT struct {
|
|
||||||
Type uint32
|
|
||||||
Mi MOUSEINPUT
|
|
||||||
Ki KEYBDINPUT
|
|
||||||
Hi HARDWAREINPUT
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms646273(v=vs.85).aspx
|
|
||||||
type MOUSEINPUT struct {
|
|
||||||
Dx int32
|
|
||||||
Dy int32
|
|
||||||
MouseData uint32
|
|
||||||
DwFlags uint32
|
|
||||||
Time uint32
|
|
||||||
DwExtraInfo uintptr
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms646271(v=vs.85).aspx
|
|
||||||
type KEYBDINPUT struct {
|
|
||||||
WVk uint16
|
|
||||||
WScan uint16
|
|
||||||
DwFlags uint32
|
|
||||||
Time uint32
|
|
||||||
DwExtraInfo uintptr
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms646269(v=vs.85).aspx
|
|
||||||
type HARDWAREINPUT struct {
|
|
||||||
UMsg uint32
|
|
||||||
WParamL uint16
|
|
||||||
WParamH uint16
|
|
||||||
}
|
|
||||||
|
|
||||||
type KbdInput struct {
|
|
||||||
typ uint32
|
|
||||||
ki KEYBDINPUT
|
|
||||||
}
|
|
||||||
|
|
||||||
type MouseInput struct {
|
|
||||||
typ uint32
|
|
||||||
mi MOUSEINPUT
|
|
||||||
}
|
|
||||||
|
|
||||||
type HardwareInput struct {
|
|
||||||
typ uint32
|
|
||||||
hi HARDWAREINPUT
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms724950(v=vs.85).aspx
|
|
||||||
type SYSTEMTIME struct {
|
|
||||||
Year uint16
|
|
||||||
Month uint16
|
|
||||||
DayOfWeek uint16
|
|
||||||
Day uint16
|
|
||||||
Hour uint16
|
|
||||||
Minute uint16
|
|
||||||
Second uint16
|
|
||||||
Milliseconds uint16
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms644967(v=vs.85).aspx
|
|
||||||
type KBDLLHOOKSTRUCT struct {
|
|
||||||
VkCode DWORD
|
|
||||||
ScanCode DWORD
|
|
||||||
Flags DWORD
|
|
||||||
Time DWORD
|
|
||||||
DwExtraInfo ULONG_PTR
|
|
||||||
}
|
|
||||||
|
|
||||||
type HOOKPROC func(int, WPARAM, LPARAM) LRESULT
|
|
||||||
|
|
||||||
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms633498(v=vs.85).aspx
|
|
||||||
type WNDENUMPROC func(HWND, LPARAM) LRESULT
|
|
||||||
1046
vendor/github.com/apenwarr/w32/user32.go
generated
vendored
1046
vendor/github.com/apenwarr/w32/user32.go
generated
vendored
File diff suppressed because it is too large
Load diff
201
vendor/github.com/apenwarr/w32/utils.go
generated
vendored
201
vendor/github.com/apenwarr/w32/utils.go
generated
vendored
|
|
@ -1,201 +0,0 @@
|
||||||
// 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"
|
|
||||||
"unicode/utf16"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
func MakeIntResource(id uint16) *uint16 {
|
|
||||||
return (*uint16)(unsafe.Pointer(uintptr(id)))
|
|
||||||
}
|
|
||||||
|
|
||||||
func LOWORD(dw uint32) uint16 {
|
|
||||||
return uint16(dw)
|
|
||||||
}
|
|
||||||
|
|
||||||
func HIWORD(dw uint32) uint16 {
|
|
||||||
return uint16(dw >> 16 & 0xffff)
|
|
||||||
}
|
|
||||||
|
|
||||||
func BoolToBOOL(value bool) BOOL {
|
|
||||||
if value {
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func UTF16PtrToString(cstr *uint16) string {
|
|
||||||
if cstr != nil {
|
|
||||||
us := make([]uint16, 0, 256)
|
|
||||||
for p := uintptr(unsafe.Pointer(cstr)); ; p += 2 {
|
|
||||||
u := *(*uint16)(unsafe.Pointer(p))
|
|
||||||
if u == 0 {
|
|
||||||
return string(utf16.Decode(us))
|
|
||||||
}
|
|
||||||
us = append(us, u)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func ComAddRef(unknown *IUnknown) int32 {
|
|
||||||
ret, _, _ := syscall.Syscall(unknown.lpVtbl.pAddRef, 1,
|
|
||||||
uintptr(unsafe.Pointer(unknown)),
|
|
||||||
0,
|
|
||||||
0)
|
|
||||||
return int32(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func ComRelease(unknown *IUnknown) int32 {
|
|
||||||
ret, _, _ := syscall.Syscall(unknown.lpVtbl.pRelease, 1,
|
|
||||||
uintptr(unsafe.Pointer(unknown)),
|
|
||||||
0,
|
|
||||||
0)
|
|
||||||
return int32(ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
func ComQueryInterface(unknown *IUnknown, id *GUID) *IDispatch {
|
|
||||||
var disp *IDispatch
|
|
||||||
hr, _, _ := syscall.Syscall(unknown.lpVtbl.pQueryInterface, 3,
|
|
||||||
uintptr(unsafe.Pointer(unknown)),
|
|
||||||
uintptr(unsafe.Pointer(id)),
|
|
||||||
uintptr(unsafe.Pointer(&disp)))
|
|
||||||
if hr != 0 {
|
|
||||||
panic("Invoke QieryInterface error.")
|
|
||||||
}
|
|
||||||
return disp
|
|
||||||
}
|
|
||||||
|
|
||||||
func ComGetIDsOfName(disp *IDispatch, names []string) []int32 {
|
|
||||||
wnames := make([]*uint16, len(names))
|
|
||||||
dispid := make([]int32, len(names))
|
|
||||||
for i := 0; i < len(names); i++ {
|
|
||||||
wnames[i] = syscall.StringToUTF16Ptr(names[i])
|
|
||||||
}
|
|
||||||
hr, _, _ := syscall.Syscall6(disp.lpVtbl.pGetIDsOfNames, 6,
|
|
||||||
uintptr(unsafe.Pointer(disp)),
|
|
||||||
uintptr(unsafe.Pointer(IID_NULL)),
|
|
||||||
uintptr(unsafe.Pointer(&wnames[0])),
|
|
||||||
uintptr(len(names)),
|
|
||||||
uintptr(GetUserDefaultLCID()),
|
|
||||||
uintptr(unsafe.Pointer(&dispid[0])))
|
|
||||||
if hr != 0 {
|
|
||||||
panic("Invoke GetIDsOfName error.")
|
|
||||||
}
|
|
||||||
return dispid
|
|
||||||
}
|
|
||||||
|
|
||||||
func ComInvoke(disp *IDispatch, dispid int32, dispatch int16, params ...interface{}) (result *VARIANT) {
|
|
||||||
var dispparams DISPPARAMS
|
|
||||||
|
|
||||||
if dispatch&DISPATCH_PROPERTYPUT != 0 {
|
|
||||||
dispnames := [1]int32{DISPID_PROPERTYPUT}
|
|
||||||
dispparams.RgdispidNamedArgs = uintptr(unsafe.Pointer(&dispnames[0]))
|
|
||||||
dispparams.CNamedArgs = 1
|
|
||||||
}
|
|
||||||
var vargs []VARIANT
|
|
||||||
if len(params) > 0 {
|
|
||||||
vargs = make([]VARIANT, len(params))
|
|
||||||
for i, v := range params {
|
|
||||||
//n := len(params)-i-1
|
|
||||||
n := len(params) - i - 1
|
|
||||||
VariantInit(&vargs[n])
|
|
||||||
switch v.(type) {
|
|
||||||
case bool:
|
|
||||||
if v.(bool) {
|
|
||||||
vargs[n] = VARIANT{VT_BOOL, 0, 0, 0, 0xffff}
|
|
||||||
} else {
|
|
||||||
vargs[n] = VARIANT{VT_BOOL, 0, 0, 0, 0}
|
|
||||||
}
|
|
||||||
case *bool:
|
|
||||||
vargs[n] = VARIANT{VT_BOOL | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*bool))))}
|
|
||||||
case byte:
|
|
||||||
vargs[n] = VARIANT{VT_I1, 0, 0, 0, int64(v.(byte))}
|
|
||||||
case *byte:
|
|
||||||
vargs[n] = VARIANT{VT_I1 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*byte))))}
|
|
||||||
case int16:
|
|
||||||
vargs[n] = VARIANT{VT_I2, 0, 0, 0, int64(v.(int16))}
|
|
||||||
case *int16:
|
|
||||||
vargs[n] = VARIANT{VT_I2 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*int16))))}
|
|
||||||
case uint16:
|
|
||||||
vargs[n] = VARIANT{VT_UI2, 0, 0, 0, int64(v.(int16))}
|
|
||||||
case *uint16:
|
|
||||||
vargs[n] = VARIANT{VT_UI2 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*uint16))))}
|
|
||||||
case int, int32:
|
|
||||||
vargs[n] = VARIANT{VT_UI4, 0, 0, 0, int64(v.(int))}
|
|
||||||
case *int, *int32:
|
|
||||||
vargs[n] = VARIANT{VT_I4 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*int))))}
|
|
||||||
case uint, uint32:
|
|
||||||
vargs[n] = VARIANT{VT_UI4, 0, 0, 0, int64(v.(uint))}
|
|
||||||
case *uint, *uint32:
|
|
||||||
vargs[n] = VARIANT{VT_UI4 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*uint))))}
|
|
||||||
case int64:
|
|
||||||
vargs[n] = VARIANT{VT_I8, 0, 0, 0, v.(int64)}
|
|
||||||
case *int64:
|
|
||||||
vargs[n] = VARIANT{VT_I8 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*int64))))}
|
|
||||||
case uint64:
|
|
||||||
vargs[n] = VARIANT{VT_UI8, 0, 0, 0, int64(v.(uint64))}
|
|
||||||
case *uint64:
|
|
||||||
vargs[n] = VARIANT{VT_UI8 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*uint64))))}
|
|
||||||
case float32:
|
|
||||||
vargs[n] = VARIANT{VT_R4, 0, 0, 0, int64(v.(float32))}
|
|
||||||
case *float32:
|
|
||||||
vargs[n] = VARIANT{VT_R4 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*float32))))}
|
|
||||||
case float64:
|
|
||||||
vargs[n] = VARIANT{VT_R8, 0, 0, 0, int64(v.(float64))}
|
|
||||||
case *float64:
|
|
||||||
vargs[n] = VARIANT{VT_R8 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*float64))))}
|
|
||||||
case string:
|
|
||||||
vargs[n] = VARIANT{VT_BSTR, 0, 0, 0, int64(uintptr(unsafe.Pointer(SysAllocString(v.(string)))))}
|
|
||||||
case *string:
|
|
||||||
vargs[n] = VARIANT{VT_BSTR | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*string))))}
|
|
||||||
case *IDispatch:
|
|
||||||
vargs[n] = VARIANT{VT_DISPATCH, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*IDispatch))))}
|
|
||||||
case **IDispatch:
|
|
||||||
vargs[n] = VARIANT{VT_DISPATCH | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(**IDispatch))))}
|
|
||||||
case nil:
|
|
||||||
vargs[n] = VARIANT{VT_NULL, 0, 0, 0, 0}
|
|
||||||
case *VARIANT:
|
|
||||||
vargs[n] = VARIANT{VT_VARIANT | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*VARIANT))))}
|
|
||||||
default:
|
|
||||||
panic("unknown type")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
dispparams.Rgvarg = uintptr(unsafe.Pointer(&vargs[0]))
|
|
||||||
dispparams.CArgs = uint32(len(params))
|
|
||||||
}
|
|
||||||
|
|
||||||
var ret VARIANT
|
|
||||||
var excepInfo EXCEPINFO
|
|
||||||
VariantInit(&ret)
|
|
||||||
hr, _, _ := syscall.Syscall9(disp.lpVtbl.pInvoke, 8,
|
|
||||||
uintptr(unsafe.Pointer(disp)),
|
|
||||||
uintptr(dispid),
|
|
||||||
uintptr(unsafe.Pointer(IID_NULL)),
|
|
||||||
uintptr(GetUserDefaultLCID()),
|
|
||||||
uintptr(dispatch),
|
|
||||||
uintptr(unsafe.Pointer(&dispparams)),
|
|
||||||
uintptr(unsafe.Pointer(&ret)),
|
|
||||||
uintptr(unsafe.Pointer(&excepInfo)),
|
|
||||||
0)
|
|
||||||
if hr != 0 {
|
|
||||||
if excepInfo.BstrDescription != nil {
|
|
||||||
bs := UTF16PtrToString(excepInfo.BstrDescription)
|
|
||||||
panic(bs)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, varg := range vargs {
|
|
||||||
if varg.VT == VT_BSTR && varg.Val != 0 {
|
|
||||||
SysFreeString(((*int16)(unsafe.Pointer(uintptr(varg.Val)))))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result = &ret
|
|
||||||
return
|
|
||||||
}
|
|
||||||
13
vendor/github.com/apenwarr/w32/vars.go
generated
vendored
13
vendor/github.com/apenwarr/w32/vars.go
generated
vendored
|
|
@ -1,13 +0,0 @@
|
||||||
// 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
|
|
||||||
|
|
||||||
var (
|
|
||||||
IID_NULL = &GUID{0x00000000, 0x0000, 0x0000, [8]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
|
|
||||||
IID_IUnknown = &GUID{0x00000000, 0x0000, 0x0000, [8]byte{0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}}
|
|
||||||
IID_IDispatch = &GUID{0x00020400, 0x0000, 0x0000, [8]byte{0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}}
|
|
||||||
IID_IConnectionPointContainer = &GUID{0xB196B284, 0xBAB4, 0x101A, [8]byte{0xB6, 0x9C, 0x00, 0xAA, 0x00, 0x34, 0x1D, 0x07}}
|
|
||||||
IID_IConnectionPoint = &GUID{0xB196B286, 0xBAB4, 0x101A, [8]byte{0xB6, 0x9C, 0x00, 0xAA, 0x00, 0x34, 0x1D, 0x07}}
|
|
||||||
)
|
|
||||||
6
vendor/modules.txt
vendored
6
vendor/modules.txt
vendored
|
|
@ -50,12 +50,6 @@ github.com/antchfx/htmlquery
|
||||||
# github.com/antchfx/xpath v1.2.0
|
# github.com/antchfx/xpath v1.2.0
|
||||||
## explicit; go 1.14
|
## explicit; go 1.14
|
||||||
github.com/antchfx/xpath
|
github.com/antchfx/xpath
|
||||||
# github.com/apenwarr/fixconsole v0.0.0-20191012055117-5a9f6489cc29
|
|
||||||
## explicit; go 1.12
|
|
||||||
github.com/apenwarr/fixconsole
|
|
||||||
# github.com/apenwarr/w32 v0.0.0-20190407065021-aa00fece76ab
|
|
||||||
## explicit
|
|
||||||
github.com/apenwarr/w32
|
|
||||||
# github.com/chromedp/cdproto v0.0.0-20210622022015-fe1827b46b84
|
# github.com/chromedp/cdproto v0.0.0-20210622022015-fe1827b46b84
|
||||||
## explicit; go 1.14
|
## explicit; go 1.14
|
||||||
github.com/chromedp/cdproto
|
github.com/chromedp/cdproto
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue