เหตุใดจึงไม่มีรหัสกระบวนการ Windows ที่แปลก


160

มีหลายวิธีในการตรวจสอบ ID กระบวนการใน Windows

ตัวอย่างเช่นการใช้คำสั่ง PowerShell:

ps | select Id, ProcessName  | Sort Id | ft -AutoSize

เราเห็นผลลัพธ์ต่อไปนี้:

  Id ProcessName         
  -- -----------         
   0 Idle                
   4 System              
 264 svchost             
 388 smss                
 476 csrss               
 536 wininit             
 580 winlogon                      
 620 services            
 628 lsass                          
 728 svchost             
 828 dwm                                     
1060 chrome              
1080 rundll32            
1148 vmms                                        
1620 spoolsv                                                
2912 taskhostex          
3020 explorer       
...     

ID กระบวนการทั้งหมดเป็นเลขคู่และนอกจากนี้ยังเป็นทวีคูณของ 4ทั้งหมด

ไม่มีรหัสกระบวนการที่แปลกใน Windows รุ่นใด ๆ ที่ใช้ Windows NT

อะไรคือสาเหตุของสิ่งนี้?


6
อาจเป็นเรื่องที่น่าสนใจ: รายละเอียดบางอย่างเกี่ยวกับ linux - justskins.com/forums/why-are-process-ids-204416.html
เดฟ

13
แน่นอนว่าไม่มีเลย มันแปลกมาก
AndreKR

คำตอบ:


168

"ทำไมไม่มีรหัสกระบวนการ Windows แปลก ๆ "

รหัสเดียวกันที่จัดสรรการจัดการเคอร์เนลจะใช้ในการจัดสรรกระบวนการและรหัสเธรด เนื่องจากหมายเลขอ้างอิงเคอร์เนลมีหลายสี่จึงเป็นกระบวนการและรหัสเธรด


ทำไมโพรเซสและ ID เธรดทวีคูณของสี่

บนระบบปฏิบัติการที่ใช้ Windows NT โพรเซสและเธรด ID จะเกิดขึ้นเสมอกันเป็นสี่เท่า นี่เป็นเรื่องบังเอิญหรือ

ใช่มันเป็นเรื่องบังเอิญและคุณไม่ควรเชื่อถือเพราะไม่ใช่ส่วนหนึ่งของสัญญาการเขียนโปรแกรม ตัวอย่างเช่นกระบวนการ Windows 95 และ ID เธรดไม่ได้เพิ่มทวีคูณของสี่เสมอ (โดยการเปรียบเทียบเหตุผลที่เคอร์เนลจัดการนั้นเป็นผลคูณของสี่นั้นเป็นส่วนหนึ่งของข้อมูลจำเพาะและจะรับประกันได้ในอนาคตอันใกล้)

ID กระบวนการและเธรดเป็นทวีคูณของสี่เป็นผลข้างเคียงของการใช้รหัสซ้ำ รหัสเดียวกันที่จัดสรรการจัดการเคอร์เนลจะใช้ในการจัดสรรกระบวนการและรหัสเธรด เนื่องจากหมายเลขอ้างอิงเคอร์เนลมีหลายสี่จึงเป็นกระบวนการและรหัสเธรด นี่เป็นรายละเอียดการใช้งานดังนั้นอย่าเขียนโค้ดที่ต้องอาศัย ฉันแค่บอกให้คุณตอบสนองความอยากรู้ของคุณ

แหล่งที่มาทำไม ID กระบวนการและเธรดทวีคูณของสี่


ทำไมเคอร์เนล HANDLEs จึงเป็นผลคูณของสี่เสมอ?

ไม่เป็นที่รู้จักกันดีคือเคอร์เนลสองบิตด้านล่างนั้นเป็นศูนย์เสมอ กล่าวอีกนัยหนึ่งค่าตัวเลขของพวกเขาจะเป็นผลคูณของ 4 เสมอโปรดทราบว่านี่ใช้กับเคอร์เนล HANDLE เท่านั้น มันใช้ไม่ได้กับมือจับหลอกหรือมือจับชนิดอื่น ๆ (มือจับ USER, ด้ามจับ GDI, มือจับมัลติมีเดีย ... ) มือจับเคอร์เนลเป็นสิ่งที่คุณสามารถส่งผ่านไปยังฟังก์ชั่น CloseHandle

ความพร้อมใช้งานของสองบิตด้านล่างถูกฝังในไฟล์ส่วนหัว ntdef.h:

//
// Low order two bits of a handle are ignored by the system and available
// for use by application code as tag bits.  The remaining bits are opaque
// and used to store a serial number and table index.
//

#define OBJ_HANDLE_TAGBITS  0x00000003L

อย่างน้อยบิตล่างของเคอร์เนล HANDLEs จะเป็นศูนย์เสมอจะถูกระบุโดยฟังก์ชัน GetQueuedCompletionStatus ซึ่งระบุว่าคุณสามารถตั้งค่าบิตด้านล่างของตัวจัดการเหตุการณ์เพื่อยับยั้งการแจ้งเตือนพอร์ตที่เสร็จสมบูรณ์ เพื่อให้สามารถใช้งานได้บิตด้านล่างจะต้องเป็นศูนย์

ข้อมูลนี้ไม่เป็นประโยชน์สำหรับนักเขียนแอปพลิเคชันส่วนใหญ่ซึ่งควรใช้ HANDLE ต่อไปเป็นค่าทึบแสง ผู้ที่สนใจแท็กบิตคือผู้ที่ใช้ไลบรารี่ระดับต่ำหรือห่อวัตถุเคอร์เนลภายในกรอบที่ใหญ่ขึ้น

แหล่งที่มาทำไมเคอร์เนล HANDLE มักจะเป็นสี่เท่าเสมอ


อ่านเพิ่มเติม



3
คำพูดหนึ่งกล่าวว่า"คุณไม่ควรเชื่อถือเพราะมันไม่ได้เป็นส่วนหนึ่งของสัญญาการเขียนโปรแกรม"แต่จากนั้นคำสั่งถัดไปที่อ้างว่า ntdef.h บอกว่าบิตนั้น"พร้อมใช้งานโดยรหัสแอปพลิเคชันเป็นแท็กบิต" เอกสารในไฟล์ส่วนหัวสาธารณะนั้นใกล้เคียงกับ"สัญญาการเขียนโปรแกรม"ตามที่คุณจะได้รับดังนั้นการอ้างสิทธิ์ครั้งแรกไม่ถูกต้อง
BlueRaja - Danny Pflughoeft

2
@ BlueLaja, "ไม่เป็นที่รู้จักกันดีว่าเคอร์เนล HANDLEsสองบิตด้านล่างจะเป็นศูนย์เสมอในคำอื่น ๆ ค่าตัวเลขของพวกเขามักจะเป็นหลายเท่าของ 4 " รหัสใน ntdef.h ใช้กับการจัดการชนิดอื่นเช่นกัน (USER จัดการ, GDI จัดการ, จัดการมัลติมีเดีย ... )
DavidPostill

37
@BlueRaja: เคอร์เนลจับเป็นหลายในสี่และนั่นเป็นสัญญาดังนั้นคุณสามารถพึ่งพาได้ รหัสกระบวนการ (ซึ่งไม่ได้เช่นเดียวกับกระบวนการจัดการ) แทนเกิดขึ้นจะเป็นหลายสี่ แต่นั่นเป็นเพียงรายละเอียดการดำเนินงานเพื่อให้คุณไม่ควรพึ่งพามัน
Matteo Italia

6
@ BlueRaja ฉันคิดว่าเรย์มอนด์จะบอกคุณว่าใครก็ตามที่เขียนเอกสารดูโลกผ่านแว่นตาสีเคอร์เนลและดังนั้นจึงเรียกเฉพาะที่จับเคอร์เนลและไม่จับชนิดอื่น ๆ
CodesInChaos

1
@ Mehrdad: ดี USER และ GDI จัดการไม่ปกติเรียกว่า "เคอร์เนล" จัดการ (แม้ว่าพวกเขาจะถูกสร้างขึ้นโดยส่วนประกอบที่ทำงานในโหมดเคอร์เนลที่เรียกว่า)
Matteo Italia
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.