สำคัญ
รูปแบบกระบวนการใหม่ของ Windows Terminal เวอร์ชัน 1.18 ต้องใช้แนวทางที่แตกต่างออกไป
อ้างถึง https://github.com/german-one/termwnd สำหรับการใช้งานใหม่
วัตถุประสงค์ของโค้ดในที่เก็บนี้คือเพื่อแยกความแตกต่างระหว่างกระบวนการ Conhost และ Windows Terminal และเพื่อกำหนดว่าอินสแตนซ์เทอร์มินัลใดที่เชื่อมต่อกับกระบวนการคอนโซลปัจจุบัน ไม่รองรับแอปเทอร์มินัลของบริษัทอื่น
ไฟล์ต้นฉบับเป็นการถอดเสียงของโค้ดหลักเดียวกันในภาษาโปรแกรมต่างๆ
ไฟล์ต้นฉบับใน Windows Batch
, C
, C++
, C#.Net
, PowerShell
และ VB.Net
ได้รับการเผยแพร่ในโฟลเดอร์ src ทั้งหมดขึ้นอยู่กับ Windows ที่เป็นระบบปฏิบัติการเป้าหมาย การขึ้นต่อกันเฉพาะอื่นๆ ระบุไว้ด้านล่าง
ไฟล์ | ความต้องการ |
---|---|
*.bat | วินโดวส์ พาวเวอร์เชลล์ 2 |
*.c | C99 |
*.cpp | ค++20 |
*.cs | .NET Framework 4.5 |
*.ps1 | วินโดวส์ พาวเวอร์เชลล์ 2 |
*.vb | .NET Framework 4.5 |
ไฟล์ต้นฉบับในพื้นที่เก็บข้อมูลนี้มีโค้ดที่ทำงานได้อย่างสมบูรณ์ซึ่งสาธิตวิธีใช้ขั้นตอนการค้นหา อย่างไรก็ตาม หากคุณตั้งใจจะใช้มันในโค้ดของคุณเอง การทราบว่าคุณต้องรวมโค้ดสำคัญส่วนใดไว้ด้วยอาจเป็นประโยชน์
ไฟล์ | รหัสดอกเบี้ย | มูลค่าดอกเบี้ย |
---|---|---|
*.bat | แมโคร TermPid ที่กำหนดไว้ในรูทีน :init_TermPid | ระดับข้อผิดพลาดที่ส่งคืนโดยมาโคร TermPid คือ PID ของเทอร์มินัลการโฮสต์ ( 0 หากเกิดข้อผิดพลาด) |
*.c | ฟังก์ชัน GetTermPid พร้อมด้วยโครงสร้าง SYSTEM_HANDLE และฟังก์ชัน GetProcBaseName , GetPidOfNamedProcWithOpenProcHandle | ค่าที่ส่งคืนโดยฟังก์ชัน GetTermPid คือ PID ของเทอร์มินัลการโฮสต์ ( 0 หากเกิดข้อผิดพลาด) |
*.cpp | ทุกอย่างในเนมสเปซ termpid พร้อมด้วยเนมสเปซ saferes และฟังก์ชัน GetProcBaseName | ค่าที่ส่งคืนโดยฟังก์ชัน GetTermPid คือ PID ของเทอร์มินัลการโฮสต์ ( 0 หรือข้อยกเว้นหากเกิดข้อผิดพลาด) |
*.cs | คลาส WinTerm | ค่าของคุณสมบัติ WinTerm.TermProc อ้างถึงกระบวนการโฮสต์เทอร์มินัล ( null หรือข้อยกเว้นหากเกิดข้อผิดพลาด) |
*.ps1 | พิมพ์อ้างอิงคลาส WinTerm | ค่าของคุณสมบัติ [WinTerm]::TermProc อ้างถึงกระบวนการโฮสต์เทอร์มินัล ( $null หรือประเภท WinTerm ไม่ได้กำหนดไว้หากเกิดข้อผิดพลาด) |
*.vb | โมดูล WinTerm | ค่าของคุณสมบัติ WinTerm.TermProc อ้างถึงกระบวนการโฮสต์เทอร์มินัล ( Nothing หรือข้อยกเว้นหากเกิดข้อผิดพลาด) |
ไม่กี่ปีที่ผ่านมา Microsoft เริ่มพัฒนาแอปพลิเคชันเทอร์มินัลใหม่ - Windows Terminal การติดตั้งพร้อมใช้งานสำหรับ Windows 10 และ Windows 11 จัดส่งมาพร้อมกับมันแล้ว จากการอัปเดตในเดือนตุลาคม 22 Microsoft ได้เปลี่ยนให้เป็นแอปเทอร์มินัลเริ่มต้นใน Windows 11
ณ ตอนนี้ Windows Terminal อยู่ร่วมกับ Conhost รุ่นเก่าที่ดี ผู้ใช้สามารถเลือกได้ว่าแอปใดที่จะใช้เป็นแอปเทอร์มินัลเริ่มต้น
ในอดีต เป็นเรื่องง่ายที่จะพิจารณาว่ากระบวนการเทอร์มินัลใดที่เชื่อมต่อกับแอปพลิเคชันเชลล์/คอนโซล เบื้องหลังมักเป็น Conhost ดังนั้น Microsoft จึงสร้าง Windows API เพื่อรายงานกระบวนการที่สร้างกระบวนการ conhost เป็นกระบวนการเทอร์มินัล และรายงานหน้าต่างของแอปพลิเคชันเชลล์เป็นหน้าต่างคอนโซล แม้ว่าทั้งหมดนี้ไม่ถูกต้องทางเทคนิค แต่ก็ค่อนข้างสะดวกสบายในเวลาเดียวกัน
อย่างไรก็ตาม ไม่มีการใช้ฟังก์ชันอำนวยความสะดวกดังกล่าวสำหรับ Windows Terminal และหากตั้งค่า Windows Terminal เป็นเทอร์มินัลเริ่มต้น เราไม่สามารถอนุมานได้จากแผนผังกระบวนการที่กระบวนการเทอร์มินัลกำลังสื่อสารกับกระบวนการเชลล์ของเรา
การใช้ Process Explorer ฉันสังเกตว่ากระบวนการ Windows Terminal มีตัวจัดการกระบวนการเชลล์ที่เปิดอยู่ สมมติว่านี่เป็นกรณีที่ฉันพยายามเขียนโค้ดที่แจกแจงหมายเลขอ้างอิงที่เปิดอยู่ทั้งหมดเพื่อค้นหาหมายเลขอ้างอิงกระบวนการที่ถูกต้อง สิ่งนี้จำเป็นต้องเกี่ยวข้องกับ API ที่ไม่มีเอกสารบางส่วน ฉันแสดงความคิดเห็นสองสามข้อในโค้ดที่อธิบายคร่าวๆ ว่าทั้งหมดนี้ทำงานอย่างไร
ในแต่ละไฟล์จะมีโค้ดที่ไม่เกี่ยวข้องซึ่งทำให้หน้าต่างค่อยๆ จางหายไป ฉันพบว่ามันเป็นวิธีที่น่าประทับใจในการพิสูจน์ว่าพบกระบวนการที่ถูกต้องแล้ว
นี่เป็นคำอธิบายโดยย่อเกี่ยวกับวิธีการนำการค้นหาไปใช้ในซอร์สโค้ด
NtQuerySystemInformation
API ถูกใช้เพื่อรับสแนปช็อตของหมายเลขอ้างอิงที่เปิดอยู่ทั้งหมดในกระบวนการที่กำลังทำงานอยู่ทั้งหมด (นี่ไม่ใช่เอกสารอย่างเป็นทางการ)