From 914ada52e94568921acdee6176c5ed6f434a8eb4 Mon Sep 17 00:00:00 2001 From: Takuto Ikuta Date: Tue, 11 Jun 2019 17:37:06 +0900 Subject: [PATCH] windows: add GetProcessId function ref: https://docs.microsoft.com/en-us/windows/desktop/api/processthreadsapi/nf-processthreadsapi-getprocessid Document does not say anything about return value, but when I use 0 for HANDLE, GetProcessId returns 0 with ERROR_INVALID_HANDLE from GetLastError(). Change-Id: Ib6782ccd5a4917e93ddbcf18c533921b12c67e3b Reviewed-on: https://go-review.googlesource.com/c/sys/+/180924 Reviewed-by: Marc-Antoine Ruel Reviewed-by: Alex Brainman Run-TryBot: Alex Brainman TryBot-Result: Gobot Gobot --- windows/syscall_windows.go | 1 + windows/zsyscall_windows.go | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/windows/syscall_windows.go b/windows/syscall_windows.go index 6abf4986..d9280921 100644 --- a/windows/syscall_windows.go +++ b/windows/syscall_windows.go @@ -266,6 +266,7 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys GetPriorityClass(process Handle) (ret uint32, err error) = kernel32.GetPriorityClass //sys SetInformationJobObject(job Handle, JobObjectInformationClass uint32, JobObjectInformation uintptr, JobObjectInformationLength uint32) (ret int, err error) //sys GenerateConsoleCtrlEvent(ctrlEvent uint32, processGroupID uint32) (err error) +//sys GetProcessId(process Handle) (id uint32, err error) // Volume Management Functions //sys DefineDosDevice(flags uint32, deviceName *uint16, targetPath *uint16) (err error) = DefineDosDeviceW diff --git a/windows/zsyscall_windows.go b/windows/zsyscall_windows.go index 23da089b..0f79fbd1 100644 --- a/windows/zsyscall_windows.go +++ b/windows/zsyscall_windows.go @@ -205,6 +205,7 @@ var ( procGetPriorityClass = modkernel32.NewProc("GetPriorityClass") procSetInformationJobObject = modkernel32.NewProc("SetInformationJobObject") procGenerateConsoleCtrlEvent = modkernel32.NewProc("GenerateConsoleCtrlEvent") + procGetProcessId = modkernel32.NewProc("GetProcessId") procDefineDosDeviceW = modkernel32.NewProc("DefineDosDeviceW") procDeleteVolumeMountPointW = modkernel32.NewProc("DeleteVolumeMountPointW") procFindFirstVolumeW = modkernel32.NewProc("FindFirstVolumeW") @@ -2209,6 +2210,19 @@ func GenerateConsoleCtrlEvent(ctrlEvent uint32, processGroupID uint32) (err erro return } +func GetProcessId(process Handle) (id uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetProcessId.Addr(), 1, uintptr(process), 0, 0) + id = uint32(r0) + if id == 0 { + 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 {