중요한
Windows 터미널 버전 1.18의 새로운 프로세스 모델에는 다른 접근 방식이 필요합니다.
새로운 구현에 대해서는 https://github.com/german-one/termwnd를 참조하세요.
이 저장소에 있는 코드의 목적은 Conhost와 Windows 터미널 프로세스를 구별하고 현재 콘솔 프로세스에 연결된 터미널 인스턴스를 결정하는 것입니다. 타사 터미널 앱은 지원되지 않습니다.
소스 파일은 서로 다른 프로그래밍 언어로 된 거의 동일한 핵심 코드의 사본입니다.
Windows Batch
, C
, C++
, C#.Net
, PowerShell
및 VB.Net
의 소스 파일은 src 폴더에 게시됩니다. 그들은 모두 Windows가 대상 운영 체제라는 점에 의존합니다. 기타 특정 종속성은 아래에 나열되어 있습니다.
파일 | 요구 사항 |
---|---|
*.bat | 윈도우 파워셸 2 |
*.c | C99 |
*.cpp | C++20 |
*.cs | .NET 프레임워크 4.5 |
*.ps1 | 윈도우 파워셸 2 |
*.vb | .NET 프레임워크 4.5 |
이 저장소의 소스 파일에는 검색 절차를 사용하는 방법을 보여 주는 완전한 기능의 코드가 포함되어 있습니다. 그러나 자신의 코드에서 이를 사용하려는 경우 포함해야 할 필수 코드 부분을 아는 것이 유용할 수 있습니다.
파일 | 관심 코드 | 관심가치 |
---|---|---|
*.bat | :init_TermPid 루틴에 정의된 TermPid 매크로 | TermPid 매크로에 의해 반환된 오류 수준은 호스팅 터미널의 PID입니다(오류가 발생한 경우 0 ). |
*.c | SYSTEM_HANDLE 구조 및 GetProcBaseName , GetPidOfNamedProcWithOpenProcHandle 함수와 함께 GetTermPid 함수 | GetTermPid 함수에 의해 반환된 값은 호스팅 터미널의 PID입니다(오류가 발생한 경우 0 ). |
*.cpp | 네임스페이스 saferes 및 GetProcBaseName 함수와 함께 termpid 네임스페이스의 모든 것 | GetTermPid 함수에 의해 반환된 값은 호스팅 터미널의 PID입니다( 0 또는 오류가 발생한 경우 예외). |
*.cs | 클래스 WinTerm | WinTerm.TermProc 속성의 값은 호스팅 터미널 프로세스를 나타냅니다(오류가 발생한 경우 null 또는 예외). |
*.ps1 | 유형 참조 클래스 WinTerm | [WinTerm]::TermProc 속성의 값은 호스팅 터미널 프로세스를 나타냅니다(오류가 발생한 경우 $null 또는 유형 WinTerm 정의되지 않음). |
*.vb | 모듈 WinTerm | WinTerm.TermProc 속성 값은 호스팅 터미널 프로세스를 참조합니다(오류가 발생한 경우 Nothing 또는 예외 없음). |
몇 년 전 Microsoft는 새로운 터미널 응용 프로그램인 Windows 터미널을 개발하기 시작했습니다. 설치는 Windows 10에서 가능하며 Windows 11에는 이미 설치가 함께 제공됩니다. Microsoft는 2022년 10월 업데이트를 통해 이를 Windows 11의 기본 터미널 앱으로 전환했습니다.
현재 Windows 터미널은 기존의 Conhost와 공존하고 있습니다. 사용자는 기본 터미널 앱으로 사용할 앱을 선택할 수 있습니다.
과거에는 쉘/콘솔 애플리케이션에 어떤 터미널 프로세스가 연결되어 있는지 쉽게 알아낼 수 있었습니다. 배후에는 항상 Conhost가 있었기 때문에 Microsoft는 conhost 프로세스를 생성한 프로세스를 터미널 프로세스로 보고하고 셸 응용 프로그램의 창을 콘솔 창으로 보고하는 Windows API를 만들었습니다. 이 모든 것이 기술적으로는 올바르지 않지만 동시에 매우 편안합니다.
그러나 Windows 터미널에는 이러한 편의 기능이 구현되지 않습니다. 그리고 Windows 터미널이 기본 터미널로 설정된 경우 프로세스 트리에서 어떤 터미널 프로세스가 쉘 프로세스와 통신하고 있는지 추론할 수 없습니다.
프로세스 탐색기를 사용하여 Windows 터미널 프로세스에 열려 있는 셸 프로세스에 대한 핸들이 있음을 관찰했습니다. 이것이 항상 그런 경우라고 가정하고 올바른 프로세스 핸들을 검색하는 모든 열린 핸들을 열거하는 코드 조각을 작성하려고 했습니다. 여기에는 문서화되지 않은 일부 API가 필요합니다. 나는 이 모든 것이 어떻게 작동하는지 대략적으로 설명하는 몇 가지 주석을 코드에 남겼습니다.
각 파일에는 창을 페이드 아웃했다가 다시 페이드 인하는 관련 없는 코드 조각도 있습니다. 나는 그것이 올바른 프로세스가 발견되었음을 증명하는 인상적인 방법이라고 생각했습니다.
소스코드에서 검색이 어떻게 구현되는지 간략하게 설명합니다.
NtQuerySystemInformation
API 함수는 실행 중인 모든 프로세스에서 열려 있는 모든 핸들의 스냅샷을 얻는 데 사용됩니다. (이 내용은 공식적으로 문서화되어 있지 않습니다.)