From 04d7465088b8adeccf882a9ae1e0423323c7bd9d Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Thu, 21 Jan 2021 15:17:19 +0100 Subject: [PATCH] windows: correct signature of recently added GetWindowThreadProcessId MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This function returns 0 and sets last error on failure. While this isn't said explicitly on MSDN, there's no PID 0, and trivial reverse engineering shows that this is the case. For example: .text:00000001800035ED loc_1800035ED: ; CODE XREF: GetWindowThreadProcessId+23↑j .text:00000001800035ED ; GetWindowThreadProcessId+3D↑j ... .text:00000001800035ED mov ecx, 578h ; LastError .text:00000001800035F2 call cs:__imp_RtlSetLastWin32Error .text:00000001800035F9 nop dword ptr [rax+rax+00h] .text:00000001800035FE .text:00000001800035FE loc_1800035FE: ; CODE XREF: GetWindowThreadProcessId+65↑j .text:00000001800035FE xor eax, eax .text:0000000180003600 jmp short loc_1800035AA This function was also just added by a user who is likely its only consumer, so this error is not too late to fix. Change-Id: I5dd24e78c006686bb8f1288ad0fe63cd67df56a6 Reviewed-on: https://go-review.googlesource.com/c/sys/+/285272 Trust: Jason A. Donenfeld Trust: Alex Brainman Run-TryBot: Jason A. Donenfeld TryBot-Result: Go Bot Reviewed-by: Alex Brainman --- windows/syscall_windows.go | 2 +- windows/zsyscall_windows.go | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/windows/syscall_windows.go b/windows/syscall_windows.go index d249919c..1c2e80a9 100644 --- a/windows/syscall_windows.go +++ b/windows/syscall_windows.go @@ -215,7 +215,7 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys CreateProcess(appName *uint16, commandLine *uint16, procSecurity *SecurityAttributes, threadSecurity *SecurityAttributes, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (err error) = CreateProcessW //sys OpenProcess(desiredAccess uint32, inheritHandle bool, processId uint32) (handle Handle, err error) //sys ShellExecute(hwnd Handle, verb *uint16, file *uint16, args *uint16, cwd *uint16, showCmd int32) (err error) [failretval<=32] = shell32.ShellExecuteW -//sys GetWindowThreadProcessId(hwnd HWND, pid *uint32) (tid uint32) = user32.GetWindowThreadProcessId +//sys GetWindowThreadProcessId(hwnd HWND, pid *uint32) (tid uint32, err error) = user32.GetWindowThreadProcessId //sys GetShellWindow() (shellWindow HWND) = user32.GetShellWindow //sys MessageBox(hwnd HWND, text *uint16, caption *uint16, boxtype uint32) (ret int32, err error) [failretval==0] = user32.MessageBoxW //sys ExitWindowsEx(flags uint32, reason uint32) (err error) = user32.ExitWindowsEx diff --git a/windows/zsyscall_windows.go b/windows/zsyscall_windows.go index cd5e8528..8a79ea15 100644 --- a/windows/zsyscall_windows.go +++ b/windows/zsyscall_windows.go @@ -2904,9 +2904,12 @@ func GetShellWindow() (shellWindow HWND) { return } -func GetWindowThreadProcessId(hwnd HWND, pid *uint32) (tid uint32) { - r0, _, _ := syscall.Syscall(procGetWindowThreadProcessId.Addr(), 2, uintptr(hwnd), uintptr(unsafe.Pointer(pid)), 0) +func GetWindowThreadProcessId(hwnd HWND, pid *uint32) (tid uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetWindowThreadProcessId.Addr(), 2, uintptr(hwnd), uintptr(unsafe.Pointer(pid)), 0) tid = uint32(r0) + if tid == 0 { + err = errnoErr(e1) + } return }