赞 | 0 |
VIP | 2 |
好人卡 | 27 |
积分 | 1 |
经验 | 26327 |
最后登录 | 2019-10-13 |
在线时间 | 953 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 110
- 在线时间
- 953 小时
- 注册时间
- 2007-4-25
- 帖子
- 805
|
TerminateProcess 接受的是一个进程句柄,进程句柄可以唯一标识一个进程,而进程的模块名(在你的场合下就是 keys.exe)则不能。你可以先通过 CreateToolhelp32Snapshot 和 Process32Next 枚举所有进程,找到其模块名匹配 "keys.exe" 的,然后获取它的进程标识(PID),再通过 OpenProcess 从进程标识获取一个进程句柄。在 Win32 环境中,大致框架如下:
create_toolhelp_32_snapshot = Win32API.new('kernel32', 'CreateToolhelp32Snapshot', 'll', 'i')
process_32_next = Win32API.new('kernel32', 'Process32Next', 'ip', 'i')
open_process = Win32API.new('kernel32', 'OpenProcess', 'lil', 'i')
terminate_process = Win32API.new('kernel32' , 'TerminateProcess', 'ii', 'i')
process_entry_32 = ' ' * 296
handle_snapshot = create_toolhelp_32_snapshot.call(2, 0)
while process_32_next.call(handle_snapshot, process_entry_32) == 1
if process_entry_32[36..-1][/^keys\.exe/]
pid = process_entry_32[8..12].unpack("L")[0]
handle_process = open_process.call(1, 0, pid)
terminate_process.call(handle_process, 0)
end
end
Process32Next 获取的只有模块名,如果想获取模块的完整路径需要使用 Module32Next,这样你就能区分两个模块名都是 keys.exe 但却是完全两个不同程序的进程了。
顺便问下Win32API.new里的kernel32,pi,i都是控制什么的啊?
p(不区分大小写)表示传递的是字符串指针,而 i 是本地 int 类型。Ruby 1.8 的源代码我没看过,但根据 Ruby 1.9 的源代码,可传递的不同的类型就只有这两种加上 v(void),l 会被当作 i 处理。 |
|