선택한 창 PID에 속하는 모든 와인 창 핸들을 나열하는 방법은 무엇입니까?

선택한 창 PID에 속하는 모든 와인 창 핸들을 나열하는 방법은 무엇입니까?

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/fdgrep-f

사용법 구문 지침 ex:

  • +"cmd"- 명령을 실행
  • /terminal.exe\n\zs/;,/^\S/-p

    • /pattern1/;,/pattern2/- 범위 검색( ;첫 번째 패턴 뒤에 커서를 놓습니다)
    • /terminal.exe\n\zs/- terminal.exe시작점 검색 및 표시 ( \zs)
    • /^\S/- 공백이 아닌 첫 번째 줄에서 선택이 끝납니다.
    • -p-위의 선택 항목에서 한 줄을 빼고 인쇄합니다(관련우편 엽서)
    • -scq!-에스묵묵하고 강압적으로 ( !) 실행그것주문하다
    • /dev/stdin- 표준 입력에서 읽기

관련 정보