
مصحح نواة يشبه SoftICE لنظام Windows 11
BugChecker هو مصحح أخطاء kernel ومستخدم يشبه SoftICE لنظام Windows 11 (ويدعم أيضًا Windows XP: فهو يدعم إصدارات Windows من XP إلى 11، لكل من x86 وx64). لا يتطلب BugChecker جهازًا ثانيًا متصلًا بالنظام الذي يتم تصحيحه، كما هو الحال في WinDbg وKD. تستفيد هذه النسخة من BugChecker (على عكس النسخة الأصلية التي تم تطويرها قبل 20 عامًا) من واجهة برمجة التطبيقات الداخلية غير الموثقة KD في NTOSKRNL. تسمح واجهة برمجة التطبيقات KD لـ WinDbg/KD بإجراء استدعاءات مثل قراءة/كتابة الذاكرة الظاهرية، قراءة/كتابة السجلات، وضع نقطة توقف في عنوان، إلخ.
على النقيض من ذلك، كان BugChecker الأصلي، مثل SoftICE، "يستولي" على النظام عن طريق ربط العديد من واجهات برمجة التطبيقات kernel (سواء المصدرة أو الخاصة)، والتحكم في APIC، وإرسال IPIs، إلخ. هذا النهج يزيد من التعقيد بشكل هائل (ويقلل من استقرار النظام)، حيث يجب أن يكون التنفيذ متوافقًا مع جميع الإصدارات والإصدارات الفرعية المدعومة من Windows (على مستوى توقيع الوظيفة) بالإضافة إلى جميع تكوينات الأجهزة المدعومة الممكنة. علاوة على ذلك، بعد 20 عامًا، يجعل PatchGuard هذا الحل مستحيلًا.
على النقيض من ذلك، تقدم هذه النسخة من BugChecker نفسها للجهاز الذي يتم تصحيحه كنظام ثانٍ يقوم بتشغيل مصحح أخطاء kernel خارجي، عن طريق اعتراض استدعاءات KdSendPacket وKdReceivePacket في kernel، ولكن في الواقع، كل شيء يحدث على نفس الجهاز. عادةً ما يتم تحقيق ذلك عن طريق استبدال KDCOM.DLL (وهي الوحدة التي تنفذ اتصال الكابل التسلسلي لواجهة برمجة التطبيقات KD في Windows) وبدء تشغيل النظام في وضع تصحيح أخطاء kernel. هذا النهج (المستوحى من VirtualKD) يقلل من التعقيد ويزيد من الاستقرار والتوافق (وقابلية النقل، على سبيل المثال، إلى ARM - والنمطية، حيث يتم تنفيذ قدرات مصحح الأخطاء منخفضة المستوى خلف KdXxxPacket ويمكن استبدالها بتنفيذ مخصص). علاوة على ذلك، فإن وجود مصحح أخطاء kernel في وقت التمهيد (وإن كان "مزيفًا") يجعل Windows يعطل PatchGuard.
في الوقت الحالي، يتطلب BugChecker لوحة مفاتيح PS/2 للإدخال ومخزن إطارات خطي لكتابة مخرجاته. يرجى ملاحظة أن لوحة المفاتيح المدمجة في العديد من أجهزة الكمبيوتر المحمولة الحديثة لا تزال PS/2.
عرض توضيحي لـ BugChecker على Windows 11 22H2، داخل VirtualBox 7.0.4. تمت كتابة شرط نقطة توقف JavaScript يغير تدفق التنفيذ في خيط وضع المستخدم.
BugChecker يعمل في بيئة مقيدة للغاية: Raspberry Pi 4 (ذاكرة 4 جيجابايت)، عبر QEMU على Windows XP (ذاكرة 512 ميجابايت). يتم استخدام نقطة توقف لتسجيل جميع استدعاءات SYSENTER من وضع المستخدم إلى kernel. يتم تخزين فهرس الخدمة في مصفوفة JavaScript.
تشغيل BugChecker مباشرة على الأجهزة الحقيقية، على كمبيوتر HP Pavilion Dv2000، وهو كمبيوتر قديم بلوحة مفاتيح PS/2. نظام التشغيل هو Windows 7 Home 32 بت.
تأكد من تعطيل التمهيد الآمن عند تثبيت واستخدام BugChecker. يمكنك عادةً إعادة تمكينه لاحقًا. إذا كنت تستخدم VMware أو VirtualBox، يمكن تعطيل التمهيد الآمن في إعدادات الجهاز الظاهري.
ضع في اعتبارك أيضًا تمكين قائمة التمهيد القديمة، إذا كنت تستخدم Windows 8 أو 10 أو 11، باستخدام الأمر: bcdedit /set "{current}" bootmenupolicy legacy. يسمح ذلك بتجربة أكثر سلاسة أثناء التمهيد، من خلال السماح بتحديد خيار تمهيد BugChecker ثم تعطيل فرض توقيع برنامج التشغيل في نفس الوقت.
الخطوة الأولى هي بدء تشغيل Symbol Loader:

إذا لزم الأمر، قم بتعطيل برامج تشغيل العرض، بالنقر فوق الزر "Disable Display Drvs". يمكن أيضًا القيام بنفس الشيء في إدارة أجهزة Windows. بعد تعطيل برامج تشغيل العرض، تظل معطلة حتى بعد إعادة تشغيل النظام. يمكن إعادة تمكينها في أي وقت لاحق عند عدم استخدام BugChecker.
النقطة هنا هي أن BugChecker يحتاج إلى مخزن إطارات خطي بتنسيق 32 بت لكل بكسل، لرسم واجهته. عند تعطيل برامج تشغيل العرض، يقوم Windows بإلغاء تسريع الأجهزة لرسم واجهة المستخدم الخاصة به ويعود إلى وضع التوافق VGA. إذا كنت تعمل على أجهزة حقيقية أو VMware، فيجب عليك تعطيل برامج تشغيل العرض. إذا كنت تعمل على VirtualBox، فيجب عليك تعطيل برامج تشغيل العرض أو تعيين إعداد vm_screen في BugChecker.dat، كما هو موضح أدناه. إذا كنت تعمل على QEMU، فلن تحتاج إلى تعطيل برامج تشغيل العرض ولكن تأكد من تحديد جهاز العرض "-vga std".
لاحظ أن وضع التوافق VGA قد يحد من دقة الشاشة القصوى. VMware مقيد بدقة قصوى تبلغ 1152x864. QEMU مع جهاز العرض "-vga std" لا يعاني من هذا القيد.
ومن المثير للاهتمام، إذا تم تثبيت BugChecker على نظام يحتوي على أكثر من بطاقة رسوميات واحدة، فمن الممكن تعطيل برامج تشغيل العرض لبطاقة رسوميات واحدة فقط، والتي ستكون البطاقة المتصلة بالشاشة التي ستعرض واجهة مستخدم BugChecker. ستحتفظ البطاقة الثانية (المعينة كشاشة رئيسية) بجميع ميزات تسريع 2D و 3D الخاصة بها، بما في ذلك دعم OpenGL و DirectX (ملاحظة: تم اختباره على VMware، مع Windows 11 وشاشة DisplayLink).
ثم انقر فوق "Start Driver"، ثم فوق "Auto Detect" وأخيراً فوق "Save". يجب أن يكون "Auto Detect" قادراً على تحديد العرض والارتفاع والعنوان الفعلي وطول الخطوة للمخزن المؤقت للإطارات تلقائياً. ومع ذلك، يمكنك تحديد هذه الإعدادات يدويًا (لا تنس النقر فوق "Save" عند الانتهاء). إذا كان "Stride" يساوي 0، فسيتم حسابه على أنه "Width" * 4 تلقائياً عند بدء تشغيل برنامج التشغيل. يمكن الحصول على "Address" (أي العنوان الفعلي للمخزن المؤقت للإطارات) في إدارة أجهزة Windows، من خلال النقر على "Properties" لجهاز العرض، ضمن علامة التبويب "Resources".
ثم انقر فوق "Callback" في قسم "KDCOM Hook Method"، ثم فوق "Copy/Replace Kdcom" وأخيراً يمكنك إعادة تشغيل النظام.
يجب القيام بهذه العملية مرة واحدة فقط ويمكن إعادة تمكين برامج تشغيل العرض، إذا لزم الأمر. عند استخدام BugChecker، يجب تعطيل برامج تشغيل العرض مرة أخرى، إذا كان ذلك مطلوبًا بواسطة التكوين الخاص بك.
يسمح إعداد vm_screen في BugChecker.dat بفتح واجهة مستخدم مصحح أخطاء BugChecker في VirtualBox دون تحديد دقة الشاشة مسبقًا في Symbol Loader ودون تعطيل برامج تشغيل العرض.
الفكرة هي الكتابة مباشرة إلى منافذ الإدخال/الإخراج ومخزن الأوامر لجهاز العرض الظاهري من أجل الحصول على دقة الشاشة الحالية وإخطار المشرف الفائق بأي تحديث في المخزن المؤقت للإطارات.
هذا الحل مستوحى من برنامج تشغيل X.org xf86-video-vmware.
يعمل هذا الحل فقط لأجهزة VirtualBox الافتراضية وبتحرير ملف BugChecker.dat يدويًا:

هذه ميزة تجريبية. في المستقبل، سيتم إضافة هذا الإعداد تلقائيًا بواسطة Symbol Loader.
يتم اختيار اسم الأمر وبناء الجملة ليكون قريبًا قدر الإمكان من تلك الخاصة بـ SoftICE الأصلي لـ NT:
ملاحظة: يجب تثبيت WDK في موقعه الافتراضي، أي X:\WinDDK، حيث X هو محرك الأقراص الذي تم حفظ ملفات مصدر BugChecker فيه.
يتوفر دليل خطوة بخطوة لبناء برنامج تشغيل kernel هنا.