;================================================== ; Win10 V2 beta3 ; 示例 ;================================================== Run(A_ScriptDir "\Hash.exe",,, &pid) ;; 打开进程 WinWait("ahk_pid " pid) Sleep 1000 MsgBox threadId := GetProcessThread(pid)[1] ;; 取进程的第一个线程 MsgBox TerminateThread(threadId) ;; 中断线程, 成功返回1 ;================================================== ; 返回包含指定进程的所有线程id的数组 ;================================================== GetProcessThread(pid) { threadEntry := Buffer(4 * 7), NumPut("uint", threadEntry.Size, threadEntry, 0) ;; initial if (-1 != threadSnapShot := DllCall("CreateToolhelp32Snapshot", "uint", 0x4, "uint", 0, "ptr")) { if (DllCall("Thread32First", "ptr", threadSnapShot, "ptr", threadEntry.Ptr, "int")) { arr := Array() loop { if (pid = NumGet(threadEntry, 12, "uint")) { arr.Push(NumGet(threadEntry, 8, "uint")) } } until !DllCall("Thread32Next", "ptr", threadSnapShot, "ptr", threadEntry.Ptr, "int") } } DllCall("CloseHandle", "ptr", threadSnapShot) return IsSet(arr) ? arr : 0 } ;================================================== ; 中断指定线程, 请谨慎使用 ;================================================== TerminateThread(threadId) { if (threadId := DllCall("OpenThread", "uint", 0x1f03ff, "int", 0, "uint", threadId, "ptr")) if (DllCall("GetExitCodeThread", "ptr", threadId, "uint*", &exitCode := 0)) return DllCall("TerminateThread", "ptr", threadId, "uint", exitCode) } ;================================================== ; 返回指定线程的入口地址 ;================================================== GetThreadAddress(threadId) { if (threadHandle := DllCall("OpenThread", "uint", 0x0040, "int", 0, "uint", threadId, "ptr")) return !DllCall("ntdll\NtQueryInformationThread", "ptr", threadHandle, "uint", 0x09, "ptr*", &Address := 0, "uint", A_PtrSize, "uint*", 0) ? Format("{:#X}", Address) : 0 }
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。
评论(0)