瀏覽代碼

windows: add ResumeThread function

ref:
https://docs.microsoft.com/en-us/windows/desktop/api/processthreadsapi/nf-processthreadsapi-resumethread

Change-Id: I114846c85bc5b8eb8dc742fdc3bdacb7b28cddaa
Reviewed-on: https://go-review.googlesource.com/c/sys/+/179037
Reviewed-by: Alex Brainman <alex.brainman@gmail.com>
Run-TryBot: Alex Brainman <alex.brainman@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Takuto Ikuta 6 年之前
父節點
當前提交
9cd6430ef9
共有 2 個文件被更改,包括 15 次插入0 次删除
  1. 1 0
      windows/syscall_windows.go
  2. 14 0
      windows/zsyscall_windows.go

+ 1 - 0
windows/syscall_windows.go

@@ -257,6 +257,7 @@ func NewCallbackCDecl(fn interface{}) uintptr {
 //sys	AssignProcessToJobObject(job Handle, process Handle) (err error) = kernel32.AssignProcessToJobObject
 //sys	TerminateJobObject(job Handle, exitCode uint32) (err error) = kernel32.TerminateJobObject
 //sys	SetErrorMode(mode uint32) (ret uint32) = kernel32.SetErrorMode
+//sys	ResumeThread(thread Handle) (ret uint32, err error) [failretval==0xffffffff] = kernel32.ResumeThread
 
 // Volume Management Functions
 //sys	DefineDosDevice(flags uint32, deviceName *uint16, targetPath *uint16) (err error) = DefineDosDeviceW

+ 14 - 0
windows/zsyscall_windows.go

@@ -195,6 +195,7 @@ var (
 	procAssignProcessToJobObject           = modkernel32.NewProc("AssignProcessToJobObject")
 	procTerminateJobObject                 = modkernel32.NewProc("TerminateJobObject")
 	procSetErrorMode                       = modkernel32.NewProc("SetErrorMode")
+	procResumeThread                       = modkernel32.NewProc("ResumeThread")
 	procDefineDosDeviceW                   = modkernel32.NewProc("DefineDosDeviceW")
 	procDeleteVolumeMountPointW            = modkernel32.NewProc("DeleteVolumeMountPointW")
 	procFindFirstVolumeW                   = modkernel32.NewProc("FindFirstVolumeW")
@@ -2091,6 +2092,19 @@ func SetErrorMode(mode uint32) (ret uint32) {
 	return
 }
 
+func ResumeThread(thread Handle) (ret uint32, err error) {
+	r0, _, e1 := syscall.Syscall(procResumeThread.Addr(), 1, uintptr(thread), 0, 0)
+	ret = uint32(r0)
+	if ret == 0xffffffff {
+		if e1 != 0 {
+			err = errnoErr(e1)
+		} else {
+			err = syscall.EINVAL
+		}
+	}
+	return
+}
+
 func DefineDosDevice(flags uint32, deviceName *uint16, targetPath *uint16) (err error) {
 	r1, _, e1 := syscall.Syscall(procDefineDosDeviceW.Addr(), 3, uintptr(flags), uintptr(unsafe.Pointer(deviceName)), uintptr(unsafe.Pointer(targetPath)))
 	if r1 == 0 {