Como listar todas as alças da janela do Wine que pertencem à PID da janela selecionada?

1

Eu tenho o seguinte comando winedbg que me fornece uma lista de todos os identificadores de janela:

$ 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

Gostaria de filtrar essa lista para consistir apenas em identificadores de janela que pertencem ao processo específico ( terminal.exe / 000000ce ), mas o problema é que a lista acima não tem lista de pids (para que eu pudesse grep it) e meu processo tem 33 segmentos diferentes:

$ 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'

As faixas disponíveis podem ser listadas por (removidas algumas para facilitar a leitura):

$ 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

Qual seria a maneira mais fácil de filtrar a lista de identificadores de janela para consistir apenas naqueles que pertencem ao processo específico?

Existe alguma opção especial que eu não conheço, ou eu preciso ter poucos scripts de análise de linha para corresponder a pid- > thread- > wnd ids e grep it?

    
por kenorb 19.12.2016 / 18:21

1 resposta

0

Aqui está o comando listando as alças selecionadas (substitua terminal.exe pelo nome do aplicativo):

$ winedbg --command "info wnd" | grep -wf <(winedbg --command "info threads" | ex +"/terminal.exe\n\zs/;,/^\S/-p" -scq! /dev/stdin | awk '{print $1}' )

Basicamente, estamos grep da lista de todos os manipuladores de janela ( info wnd ) por lista específica de threads. A lista é analisada pelo editor ex com base na saída info threads e salva em um arquivo especial ( /dev/fd ) que é carregado por grep ( -f ). O comando Awk é usado para imprimir a primeira coluna onde os ids de thread estão listados.

Explicação da sintaxe ex usada:

  • +"cmd" - executa o comando
  • /terminal.exe\n\zs/;,/^\S/-p

    • /pattern1/;,/pattern2/ - uma pesquisa de intervalo ( ; coloca o cursor após o primeiro padrão)
    • /terminal.exe\n\zs/ - procure terminal.exe e marque o ponto inicial ( \zs )
    • /^\S/ - a seleção termina na primeira linha não em branco
    • -p - imprime a seleção acima, menos uma linha (relacionado post )
    • -scq! - s forçosa e forçosamente ( ! ) executa o q uit c ommand
    • /dev/stdin - leia o conteúdo da entrada padrão
por 20.12.2016 / 22:27

Tags