aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/service/zsyscall_windows.go
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2019-02-28 07:19:06 +0100
committerJason A. Donenfeld <Jason@zx2c4.com>2019-02-28 08:05:02 +0100
commitf3c3bd215731f55cf042e0d1c9eae4aa880f6257 (patch)
tree243e106096b2df0f27074234d6acd56d518fb407 /service/zsyscall_windows.go
parentmanager: wire up config migrator (diff)
downloadwireguard-windows-f3c3bd215731f55cf042e0d1c9eae4aa880f6257.tar.xz
wireguard-windows-f3c3bd215731f55cf042e0d1c9eae4aa880f6257.zip
service: track tunnel service status
Diffstat (limited to '')
-rw-r--r--service/zsyscall_windows.go42
1 files changed, 38 insertions, 4 deletions
diff --git a/service/zsyscall_windows.go b/service/zsyscall_windows.go
index 649e3581..faf6d780 100644
--- a/service/zsyscall_windows.go
+++ b/service/zsyscall_windows.go
@@ -39,11 +39,14 @@ func errnoErr(e syscall.Errno) error {
var (
modwtsapi32 = windows.NewLazySystemDLL("wtsapi32.dll")
modadvapi32 = windows.NewLazySystemDLL("advapi32.dll")
+ modkernel32 = windows.NewLazySystemDLL("kernel32.dll")
- procWTSQueryUserToken = modwtsapi32.NewProc("WTSQueryUserToken")
- procWTSEnumerateSessionsW = modwtsapi32.NewProc("WTSEnumerateSessionsW")
- procWTSFreeMemory = modwtsapi32.NewProc("WTSFreeMemory")
- procCreateWellKnownSid = modadvapi32.NewProc("CreateWellKnownSid")
+ procWTSQueryUserToken = modwtsapi32.NewProc("WTSQueryUserToken")
+ procWTSEnumerateSessionsW = modwtsapi32.NewProc("WTSEnumerateSessionsW")
+ procWTSFreeMemory = modwtsapi32.NewProc("WTSFreeMemory")
+ procCreateWellKnownSid = modadvapi32.NewProc("CreateWellKnownSid")
+ procNotifyServiceStatusChangeW = modadvapi32.NewProc("NotifyServiceStatusChangeW")
+ procSleepEx = modkernel32.NewProc("SleepEx")
)
func wtfQueryUserToken(session uint32, token *windows.Token) (err error) {
@@ -86,3 +89,34 @@ func createWellKnownSid(sidType wellKnownSidType, domainSid *windows.SID, sid *w
}
return
}
+
+func notifyServiceStatusChange(service windows.Handle, notifyMask uint32, notifyBuffer uintptr) (err error) {
+ r1, _, e1 := syscall.Syscall(procNotifyServiceStatusChangeW.Addr(), 3, uintptr(service), uintptr(notifyMask), uintptr(notifyBuffer))
+ if r1 != 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func sleepEx(milliseconds uint32, alertable bool) (ret uint32, err error) {
+ var _p0 uint32
+ if alertable {
+ _p0 = 1
+ } else {
+ _p0 = 0
+ }
+ r0, _, e1 := syscall.Syscall(procSleepEx.Addr(), 2, uintptr(milliseconds), uintptr(_p0), 0)
+ ret = uint32(r0)
+ if ret == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}