我有以下winedbg
命令,它提供了所有窗口句柄的列表:
$ winedbg --command "info wnd"
Window handle Class Name Style WndProc Thread Text
00010020 #32769 96000000 00000000 00000022 -- Empty --
006c02e4 tooltips_class32 84800000 00000000 00000115 -- Empty --
00270280 tooltips_class32 84800001 00000000 00000115 -- Empty --
002101a6 tooltips_class32 84800001 00000000 000000d6 -- Empty --
001700c4 tooltips_class32 84800000 00000000 000000d6 -- Empty --
019a02ca ComboLBox 44808041 00000000 00000115 -- Empty --
00700040 tooltips_class32 94800000 00000000 000000d6 -- Empty --
004106c8 tooltips_class32 84800001 00000000 00000115 -- Empty --
008f0172 tooltips_class32 84800000 00000000 00000115 -- Empty --
007402a8 ComboLBox 44808041 00000000 00000115 -- Empty --
003807de MetaQuotes::MetaT 14cf8000 00000000 00000115 1809640: MetaT
00230782 msctls_statusbar3 5400014e 00000000 00000115 -- Empty --
000f0670 AfxControlBar140s 56002800 00000000 00000115 Standard
003b065a Static 50000100 00000000 00000115 -- Empty --
00110678 ToolbarWindow32 5400186e 00000000 00000115 Timeframes
0050069a ToolbarWindow32 5400186e 00000000 00000115 Line Studies
001f06ac ToolbarWindow32 5400186e 00000000 00000115 Charts
001706b2 ToolbarWindow32 5400186e 00000000 00000115 Standard
001d05e2 AfxControlBar140s 56008200 00000000 00000115 Tester
001a048e Afx:00400000:b:00 56000000 00000000 00000115 Terminal
002c0118 Shell Embedding 56010000 00000000 00000115 Shell Embeddin
00900386 nsAppShell:EventW 04c00000 00000000 00000115 nsAppShell:Eve
07bf01c4 nsAppShell:EventW 04c00000 00000000 000000d6 nsAppShell:Eve
我想过滤该列表,使其仅包含属于特定进程 ( terminal.exe
/ 000000ce
) 的窗口句柄,但问题是上面的列表没有 pid 列表(所以我可以grep
),并且我的进程有 33 个不同的线程:
$ winedbg --command "info proc"
pid threads executable (all id:s are in hex)
000000ce 33 'terminal.exe'
0000002b 8 'rpcss.exe'
00000021 4 'explorer.exe'
0000000e 5 'services.exe'
0000001a 3 \_ 'plugplay.exe'
00000012 4 \_ 'winedevice.exe'
可用的步骤可以通过以下方式列出(为了便于阅读,删除了一些步骤):
$ winedbg --command "info thread"
process tid prio (all id:s are in hex)
0000000e services.exe
0000011a 0
0000001d 0
00000014 0
00000010 0
0000000f 0
000000ce terminal.exe
000000de 0
0000013a 0
0000004f 0
00000115 0
过滤窗口句柄列表以仅包含属于特定进程的窗口句柄的最简单方法是什么?
是否有任何我不知道的特殊选项,或者我需要几行解析脚本来匹配 pid->thread->wnd id 和grep
它?
答案1
以下是列出所选句柄的命令(替换terminal.exe
为应用程序名称):
$ winedbg --command "info wnd" | grep -wf <(winedbg --command "info threads" | ex +"/terminal.exe\n\zs/;,/^\S/-p" -scq! /dev/stdin | awk '{print $1}' )
基本上,我们通过特定的线程列表来grep
获取所有窗口处理程序()的列表。info wnd
该列表由ex
编辑器根据输出进行解析,并保存到由( )加载的info threads
特殊文件 ( ) 中。 awk 命令用于打印列出线程 ID 的第一列。/dev/fd
grep
-f
使用语法说明ex
:
+"cmd"
- 运行命令/terminal.exe\n\zs/;,/^\S/-p
/pattern1/;,/pattern2/
- 范围搜索(;
将光标置于第一个模式之后)/terminal.exe\n\zs/
- 搜索terminal.exe
并标记起点 (\zs
)/^\S/
- 选择在第一个非空行处结束-p
- 打印上面的选择,减去一行(相关邮政)-scq!
-s默默地、强行地(!
)执行q伊特C命令/dev/stdin
- 从标准输入读取内容