"ทำไมไม่มีรหัสกระบวนการ 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 มักจะเป็นสี่เท่าเสมอ
อ่านเพิ่มเติม