سؤال لماذا لا توجد معرفات عملية غريبة Windows؟


هناك العديد من الطرق لفحص معرفات العملية في 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       
...     

جميع معرفات العملية هي أرقام حتى ، بالإضافة إلى أنها كلها مضاعفات 4.

لا توجد معرفات عملية فردية على أي إصدار من Windows يستند إلى Windows NT.

ما هو سبب هذا؟


158
2017-07-06 08:21


الأصل


ربما مثيرة للاهتمام: بعض detaila حول لينكس - justskins.com/forums/why-are-process-ids-204416.html - Dave
في الواقع لا يوجد أي. هذا غريب. - AndreKR


الأجوبة:


"لماذا لا توجد معرفات غريبة لعملية Windows؟"

يتم استخدام نفس التعليمات البرمجية التي تقوم بتخصيص مقابض kernel أيضًا   تخصيص العملية ومعرفات الموضوع. منذ مقابض النواة متعددة   من أربعة ، وكذلك هي معرفات العملية وموضوع.


لماذا العملية ومعرفات موضوع مضاعفات أربعة؟

على أنظمة التشغيل المستندة إلى Windows NT ، تحدث معرفات سلسلة العمليات   دائما أن تكون مضاعفا لأربعة. هل هذه مجرد صدفة؟

نعم ، إنها مجرد مصادفة ، ويجب ألا تعتمد عليها لأنها موجودة   ليس جزءا من عقد البرمجة. على سبيل المثال ، عملية Windows 95   ومعرفات سلاسل الاتصال لم تكن دائمًا مضاعفات أربعة. (على سبيل المقارنة ، و   السبب أن مقابض النواة هي دائما مضاعفات أربعة هي جزء من   المواصفات وسيتم ضمانها في المستقبل المنظور.)

تعد معرفات العمليات ومجموعات مؤشرات الترابط مضاعفات أربعة كأثر جانبي للرمز   إعادة استخدام. يتم استخدام نفس التعليمات البرمجية التي تقوم بتخصيص مقابض kernel أيضًا   تخصيص العملية ومعرفات الموضوع. منذ مقابض النواة متعددة   من أربعة ، وكذلك هي معرفات العملية وموضوع. هذا هو التنفيذ   التفاصيل ، لذلك لا تكتب رمزًا يعتمد عليه. أنا فقط أخبرك   إرضاء فضولك

مصدر لماذا العملية ومعرفات موضوع مضاعفات أربعة؟


لماذا النواة HANDLEs دائما مضاعفا لأربعة؟

ليس من المعروف جيدا أن الجزء السفلي الثاني من معالجات النواة   دائما صفر وبعبارة أخرى ، فإن قيمتها الرقمية هي دائمًا متعددة   4. لاحظ أن هذا ينطبق فقط على معالجات النواة ؛ لا ينطبق   إلى pseudo-handles أو إلى أي نوع آخر من التعامل (USER يعالج GDI   مقابض ، مقابض الوسائط المتعددة ...) مقابض Kernel هي أشياء يمكنك تمريرها   إلى الدالة 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

على الأقل الجزء السفلي من معالجات kernel هو صفر دائمًا   ضمنيًا بواسطة الدالة GetQueuedCompletionStatus ، والتي تشير إلى   يمكنك تعيين الجزء السفلي من مؤشر الحدث لمنع   إشعار منفذ الانتهاء. من أجل هذا العمل ، والقاع   يجب أن تكون البتة صفراً.

هذه المعلومات ليست مفيدة لمعظم كتاب التطبيق ، والتي   يجب متابعة معالجة HANDLEs كقيم معتمة. الناس الذين   سيكون مهتما في العلامة بت هي تلك التي تنفذ   مكتبات فئة منخفضة المستوى أو يتم التفاف كائنات kernel داخل   إطار أكبر.

مصدر لماذا النواة HANDLEs دائما مضاعفا لأربعة؟


قراءة متعمقة



166
2017-07-06 09:13



اقتبس واحد يقول "يجب ألا تعتمد عليه لأنه ليس جزءًا من عقد البرمجة". ولكن بعد ذلك المطالبات القادمة ntdef.h يقول البتات "متوفرة للاستخدام بواسطة رمز التطبيق كبت للعلامة".  الوثائق في ملف رأس عمومي تقترب من a "عقد برمجة" كما يمكنك الحصول عليه ، لذا فإن الادعاء الأول غير صحيح. - BlueRaja - Danny Pflughoeft
BlueRaja ، "ليست معروفة جيدا هو أن الجزء السفلي من اثنين من النواة HANDLEs دائما صفر ؛ بعبارة أخرى ، القيمة الرقمية الخاصة بهم دوماً مضاعفات 4."التعليمات البرمجية في ntdef.h تنطبق على أنواع أخرى من المقابض أيضاً (مقابض USER ، مقابض GDI ، مقابض الوسائط المتعددة ...) - DavidPostill♦
BlueRaja: مقابض kernel متعددة من أربعة وهذا تعاقدي ، بحيث يمكنك الاعتماد عليها ؛ معرفات العملية (و هو ليس مثل مقابض العملية) ، بدلا من ذلك ، يحدث أن تكون متعددة من أربعة ، ولكن هذا مجرد تفاصيل التنفيذ ، لذلك لا ينبغي الاعتماد عليها. - Matteo Italia
BlueRaja أعتقد أن ريموند سيخبرك أن كل من كتب الوثائق بدا في العالم من خلاله نظارات النواة الملونة وبالتالي الإشارة فقط إلى مقابض kernel وليس أنواع أخرى من المقابض. - CodesInChaos
Mehrdad: حسناً ، لا تُعرف مقابض GDI الخاصة بـ USER عادةً بمقابض "kernel" (على الرغم من أنها يتم إنشاؤها بواسطة مكونات قيد التشغيل في وضع kernel المزعوم). - Matteo Italia