كيف تعمل توافقية تطبيقات ويندوز ── إبقاء التطبيقات القديمة حيّة بوضع التوافق والـ shims وCompatibility Administrator

· · Windows, وضع التوافق, Shims, توافق التطبيقات, Compatibility Administrator, إعادة استخدام الأصول القديمة, تطوير ويندوز, الأنظمة القائمة

«تطبيق أعمال عمره عشر سنوات اختفت شيفرته المصدرية لا يبدأ على حاسوب ويندوز 11 جديد. أشّرتُ «ويندوز إكس بي» في علامة تبويب التوافق بحوار الخصائص فعمل فوراً. — ماذا يحدث فعلياً؟ هل يجوز الاستمرار بالاعتماد على هذا؟» هذا استشارة نسمعها كثيراً.

عندما يجعل مربّع تأشير واحد شيئاً يعمل، من الطبيعي أن تشعر بالقلق. الهوية الحقيقية لوضع التوافق، الذي يبدو سحراً، مجموعة قطع شيفرة صغيرة تُسمّى shims تجلس بين التطبيق وواجهة ويندوز وتعيد «كذبة». ويندوز نفسه يستخدم هذا الترقيع على نطاق واسع ليُبقي تطبيقات أجيال كثيرة تعمل، ويكشف جزءاً من الآلية للمستخدمين والمسؤولين.

يُستخدم دون فهم الآلية فتصبح إطالة العمر «يجب ألا نلمسه لأننا لا نعرف لماذا يعمل» غير مستقرة. افهم الآلية وتستطيع أن تقرّر، بأسباب، إلى أيّ مدى تعتمد عليه بأمان، وما الذي سيكسره، ومتى ينبغي إعادة الكتابة.

فهم الآلية يغيّر جودة إطالة العمراستخدام وضع التوافق دون فهم الآلية يؤدّي إلى إطالة عمر غير مستقرة لا تجرؤ على لمسها؛ فهم الآلية يتيح قراراً مسبّباً إلى أي مدى تعتمد عليه وما الذي سيكسره ومتى تعيد الكتابةاستخدام دون فهم الآليةإطالة عمر غير مستقرة لا تجرؤ على لمسهااستخدام بعد فهم الآليةقرارات بأسبابإلى أي مدى تعتمد عليهما الذي سيكسرهمتى ينبغي إعادة الكتابة

الشكل 1: حتى لإطالة العمر نفسها تختلف الجودة بين قلق الجهل بالآلية وقرار مبني على فهمها.

موجَّه إلى موظّفي تقنية المعلومات في المنشآت الصغيرة والمتوسطة وإلى مطوّري تطبيقات ويندوز الذين يرعون تطبيقات أعمال قديمة، يرتّب هذا المقال من مصادر مايكروسوفت ليرن الأوّلية آلية الـ shim التي هي الهوية الحقيقية لوضع التوافق، وما تستطيعه الـ shims التمثيلية، وكيف تُطبَّق تنظيمياً بـ Compatibility Administrator، والحدود التي لا ينقذها shim، وكيف تقرّر بين إطالة العمر والترحيل.

1. الخلاصة أوّلاً

  • الهوية الحقيقية لوضع التوافق هي الـ shims (طبقة توافق). إعدادات علامة تبويب التوافق تُكتَب إلى HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers، وتُطبَّق حزمة shims على تلك العملية عند البدء.12
  • الـ shim خطاف API في وضع المستخدم يعيد كتابة جدول عناوين الاستيراد (IAT). يعترض مسار استدعاء التطبيق لواجهات ويندوز ويعيد الإجابات نفسها التي كان ويندوز القديم يعيدها. لا يغيّر نظام التشغيل نفسه.3
  • ما يستطيعه shim هو نفس نطاق ما يصلحه تعديل شيفرة في التطبيق. لا يتجاوز آليات الأمن، ولا يصلح مشكلات وضع النواة (برامج تشغيل الأجهزة).3
  • مايكروسوفت تشحن عدداً كبيراً من الـ shims الجاهزة — كذب الإصدار، إعادة تعيين مسارات الملفات، تزييف السجلّ، تزييف فحوص المسؤول، وغير ذلك. تستطيع تطبيقها على ملفات EXE فردية من Compatibility Administrator.4
  • ويندوز نفسه يستخدم الـ shims افتراضياً. تُطابَق قاعدة التوافق القياسية للنظام (.sdb) عند كلّ إطلاق، وPCA (Program Compatibility Assistant) يستطيع أيضاً كشف مشكلة وتطبيق إعداد توافق تلقائياً.15
  • «الإجابة كأنّه ويندوز أقدم» صارت الافتراضي. من ويندوز 8.1 فصاعداً لا يعيد GetVersionEx إصدار نظام لم يعلنه التطبيق في بيانه. وضع التوافق امتداد لتلك الآلية.67
  • الـ shims لا تعمل على تطبيقات 16 بت ولا على اعتماد برامج تشغيل النواة ولا على الوصول المباشر للعتاد. خصوصاً تطبيقات 16 بت لا تعمل أصلاً على ويندوز 64 بت.8
  • للتطبيقات التي «تتطلّب مسؤولاً لكنّها لا تحتاجه فعلاً» RunAsInvoker هي الخطوة القياسية. __COMPAT_LAYER=RunAsInvoker يكبت طلب الرفع ويترك التطبيق يعمل بامتيازات عادية.9
  • العمل تحت shim يعني أنّك تستطيع إطالة العمر الآن، لكن المسار الحقيقي «تشغيله بلا shim». إن قرّرت إطالة العمر فسجّل أيّ shims تجعله يعمل وأدر ذلك كمادّة لقرار إعادة الكتابة.

2. الصورة الكبيرة لتوافق التطبيقات — طبقات التوافق الخلفي التي يملكها ويندوز أصلاً

قبل الحديث عن الـ shims، هذه قائمة بالآليات التي يملكها ويندوز أصلاً للتطبيقات القديمة. حتى عندما يقول الناس «بدأ يعمل في وضع التوافق»، ما ينقذ التطبيق فعلاً طبقة من هذه، أو مزيج من عدّة طبقات.

الطبقة ماذا تفعل الهدف النموذجي
Shims (وضع التوافق) تعترض استدعاءات الـ API وتزيّف الاستجابات نفسها التي كان ويندوز القديم يعطيها تطبيقات كُتبت لنظام أقدم عموماً
افتراضية UAC (ملفات / سجلّ) تحوّل الكتابات إلى HKLM\Software أو Program Files التي بلا صلاحية إلى VirtualStore لكلّ مستخدم تطبيقات 32 بت كُتبت بافتراض امتيازات المسؤول
WOW64 تشغّل تطبيقات 32 بت كما هي على ويندوز 64 بت (توفّر عروض 32 بت للسجلّ ونظام الملفات) تطبيقات 32 بت عموماً
افتراضية DPI تجعل تطبيقاً غير واعٍ بـ DPI يرسم عند 96 DPI وتعرضه بتمديد الصورة النقطية تطبيقات قديمة على شاشات عالية الـ DPI

افتراضية UAC إجراء انتقالي يسري على عمليات تفاعلية 32 بت بلا بيان، ومايكروسوفت نفسها تقول إنّها «تقنية مؤقّتة ننوي إزالتها من إصدار مستقبلي لويندوز».10 الضرر الحقيقي لتحويل Wow6432Node وVirtualStore وكيفية التعامل معه مفصّل في «Registry 32-bit/64-bit Redirection and Virtualization Pitfalls»؛ هذا المقال يبقي الـ shims في المركز ويذكر الطبقات الأخرى بالقدر اللازم فقط.

أين تجلس افتراضية UACافتراضية UAC إجراء انتقالي للعمليات التفاعلية 32 بت بلا بيان؛ تحوّل الكتابات إلى VirtualStore لكل مستخدم، لكن مايكروسوفت نفسها تقول إنها تقنية مؤقتة يُقصد إزالتها من ويندوز مستقبليعملية تفاعلية 32 بت بلا بيانتُطبَّق افتراضية UACتُحوَّل إلى VirtualStore لكل مستخدمتقنية مؤقتة يُقصد إزالتها لاحقاً

الشكل 2: افتراضية UAC إجراء انتقالي لعمليات 32 بت بلا بيان، ولا يمكن الاعتماد عليها دائماً.

ملاحظة جانبية عن افتراضية DPI: تطبيقاً لم يعلن وعي DPI يُعامَل كأنّه يرسم عند 96 DPI (100٪)، وويندوز يمدّد الصورة النقطية للعرض. لذلك تبدو التطبيقات القديمة «ضبابية» على شاشة عالية الـ DPI، و«تجاوز سلوك تحجيم DPI العالي» في علامة التوافق هو المفتاح الذي يغيّر سلوك هذه الافتراضية.11

كيف تعمل افتراضية DPIتطبيق لم يعلن وعي DPI يُعامل كأنه يرسم عند 96 DPI؛ ويندوز يمدد الصورة النقطية فتبدو ضبابية، وتجاوز إعدادات DPI العالي في علامة التوافق يبدّل سلوك هذه الافتراضيةيبدّل سلوك الافتراضيةتطبيق لا يعلن وعي DPIيُعامل كأنه يرسم عند 96 DPIتُمدَّد الصورة النقطية للعرضيبدو ضبابياً على شاشة عالية DPIتجاوز سلوك تحجيم DPI العالي

الشكل 3: تطبيق غير واعٍ بـ DPI يُعامَل كـ 96 DPI ويُمدَّد؛ تجاوز علامة التوافق هو مفتاح هذه الافتراضية.

3. ما هو الـ Shim حقّاً — اعتراض بين الواجهات بإعادة كتابة الـ IAT

3.1. «المترجم» الذي يقف بين التطبيق ونظام التشغيل

تنفيذي ويندوز (صيغة PE) يستدعي واجهات في مكتبات DLL خارجية عبر جدول عناوين الاستيراد (IAT). عندما يستدعي التطبيق GetVersionEx فإنّه يقفز فقط إلى العنوان المكتوب في الـ IAT. آلية الـ shim تستغل ذلك. عند التحميل تعيد كتابة مدخل الـ IAT للواجهة المستهدفة إلى عنوان شيفرة الـ shim وتُدخل نفسها بين التطبيق وويندوز. الواجهات المحصولة ديناميكياً عبر GetProcAddress تُعالَج بخطف GetProcAddress نفسه.3

بعد الاعتراض قد يعيد shim رقم إصدار قديماً على «ما إصدار نظام التشغيل الحالي؟»، أو يعيد تعيين وصول ملف إلى موضع غير قابل للكتابة إلى موضع آخر، ثم يستدعي الواجهة الحقيقية إن لزم. من وجهة نظر التطبيق كأنّه «يعمل على ويندوز قديم»؛ من وجهة نظر النظام كأنّ «تطبيقاً حسن السلوك يعمل» — الـ shim هو المترجم بينهما.

مسار اعتراض Shim لاستدعاء APIاستدعاء API من التطبيق يمر عبر IAT؛ إعادة كتابة مدخل IAT إلى الـ shim عند التحميل تتيح الاعتراض وتزييف الاستجابة نفسها التي كان ويندوز القديم يعطيها ثم استدعاء الواجهة الحقيقية إن لزماستدعاء APIيُعاد كتابته إلى الـ shim عند التحميلإن لزمتُعالَج بخطفالتطبيقمدخل IATShim (مترجم)واجهة ويندوز الحقيقيةيزيّف الاستجابة نفسها التي كان ويندوز القديم يعطيهااستدعاءات عبر GetProcAddress

الشكل 4: يعترض الـ shim بين التطبيق وواجهة ويندوز. ما يُعاد كتابته هو IAT جانب التطبيق؛ النظام نفسه لا يتغيّر.

ثلاث خصائص مهمّة تتبع هذا التصميم.3

  1. الـ shim يعمل كشيفرة جانب التطبيق. ليس جزءاً من النظام، لذا يخضع لقيود الأمن نفسها التي يخضع لها التطبيق. لا يستطيع shim تجاوز آليات أمن النظام، ولا تحتاج إلى تخفيف إعدادات الأمن لاستخدام shim.
  2. ما يصلحه shim يصلحه أيضاً تعديل شيفرة في التطبيق. الـ shim بديل لحالات «لا شيفرة / لا نستطيع الإصلاح»؛ ليس أقوى من تعديل الشيفرة.
  3. وضع المستخدم فقط. مشكلات التوافق في برامج تشغيل الأجهزة التي تعمل في وضع النواة لا يصلحها shim.

3.2. قاعدة بيانات الـ Shim (.sdb) والمطابقة

جدول التقابل «أيّ shim يُطبَّق على أيّ EXE» هو قاعدة بيانات الـ shim، ملف ثنائي بامتداد .sdb. تُسجَّل تنفيذيات التطبيق المستهدف في القاعدة بصفات مثل اسم الملف والحجم والمجموع الاختباري والإصدار (صفات المطابقة)، وتُطابَق عند بدء العملية. العلاجات تشمل Appfix (shim) الذي يحقن خطاف API، وApphelp الذي يعرض رسالة «لهذا التطبيق مشكلة توافق». حزمة من عدّة shims وأعلام هي طبقة توافق (وضع التوافق).1

يسهل تفويته: هذه المطابقة لا تجري فقط على تطبيقات ضُبط لها وضع التوافق، بل عند كلّ إطلاق عملية. ويندوز يشحن قاعدة قياسية للنظام بإصلاحات لآلاف التطبيقات المعروفة (الملفات تحت %WINDIR%\AppPatch)، وعلى حاسوبك اليوم يكاد يكون تطبيق قديم ما يبدأ وshim ملحق به دون أن ينتبه أحد. إصلاحات التوافق التي تقدّمها مايكروسوفت تُشحَن كجزء من ويندوز وتُحدَّث عبر Windows Update.3

مطابقة قاعدة بيانات الـ shim عند بدء العمليةكل إطلاق عملية يُطابق مع قاعدة الـ shim؛ إن طابق تسجيل صفات المطابقة يحقن Appfix شيمًا أو يعرض Apphelp رسالة وإلا تبدأ العملية كما هينعمنعملاحزمة shims وأعلامبدء العمليةمطابقة مع .sdbاسم الملف والحجم وغيرهاتسجيل؟Appfix: حقن shimApphelp: رسالةابدأ كما هيطبقة توافق

الشكل 5: المطابقة تجري عند كلّ إطلاق عملية، لا على التطبيقات المضبوط لها وضع التوافق فقط.

3.3. PCA — الآلية التي تطبّق الـ Shims تلقائياً

مسار آخر يمكن أن يُطبَّق فيه shim دون قصد المسؤول هو PCA (Program Compatibility Assistant). يراقب PCA تنفيذ التطبيق، وعندما يكشف علامات مشكلة توافق معروفة يقترح على المستخدم تطبيق إصلاح أو، في بعض الحالات، يطبّق إعداد توافق تلقائياً. مثلاً تطبيق ينهار باستدعاء شيفرة داخل DLL محرَّرة يُسنَد إليه PINDLL، وتطبيق يفشل في الكتابة إلى ملف ويندوز محمي يُسنَد إليه WRPMITIGATION.5

كيف يطبّق PCA إعداد توافق تلقائياًيراقب PCA تنفيذ التطبيق وعندما يكشف علامات مشكلة توافق معروفة يقترح تطبيق إصلاح على المستخدم أو في بعض الحالات يطبّق إعداد توافق تلقائياًنعمتُعالَج باقتراحبعض الحالاتلاتنفيذ التطبيقPCA يراقبعلامات مشكلة معروفة؟أي حالة؟اقتراح تطبيق إصلاحتطبيق إعداد توافق تلقائياًشغّل كما هومثال: PINDLL أو WRPMITIGATION

الشكل 6: يراقب PCA تنفيذ التطبيق، وعندما يكشف علامات مشكلة معروفة يقترح إصلاحاً أو يطبّقه تلقائياً.

هوية «لم أضبط شيئاً، لكن في لحظة كان مربّع وضع التوافق مؤشَّراً» هي في حالات كثيرة هذا. ليست عطلاً ولا نقراً خاطئاً؛ إنّه ويندوز يتصرّف كما صُمّم.

4. ما تستطيعه الـ Shims التمثيلية

من الـ shims الجاهزة التي تنشرها مايكروسوفت، هذا اختيار يظهر كثيراً فعلاً عند إطالة عمر تطبيق أعمال.4

الـ Shim ما يستطيعه (ملخّص)
WinXPSP3VersionLie وعائلة VersionLie إعادة إصدار أقدم محدّد لاستعلامات إصدار النظام (تزييف الإصدار)
CorrectFilePaths إعادة تعيين الوصول إلى مسار ملف غير قابل للكتابة أو غير موجود إلى موضع آخر
VirtualRegistry تحويل أو تزييف قراءات وكتابات السجلّ (بما فيه تزييف الإصدار وتزييف مفاتيح غير موجودة)
ForceAdminAccess إعادة True مؤقّتاً لفحص «هل أنت عضو مجموعة المسؤولين؟»
RunAsAdmin / RunAsHighest / RunAsInvoker إعطاء من الخارج مستوى تنفيذ يعادل requireAdministrator / highestAvailable / asInvoker في البيان
WRPMitigation تزييف نجاح الكتابات إلى ملفات النظام المحمية ومفاتيح السجلّ كي يتابع التطبيق
EmulateGetDiskFreeSpace الإبلاغ عن مساحة القرص الحرّة بحدّ أقصى 2 جيجابايت (لتطبيقات تفيض على الأقراص الكبيرة)
GlobalMemoryStatusLie تزييف قيم حالة الذاكرة المبلَّغ عنها (لتطبيقات تفشل في فحص ذاكرة عند البدء)
LoadLibraryRedirect تحميل مكتبة DLL الحالية لويندوز بدل مكتبة نظام قديمة يشحنها التطبيق

بالنظر إلى القائمة، معظم الـ shims «كذبة تعيد الإجابة التي يتوقّعها التطبيق القديم». القرص 2 جيجابايت كحدّ أقصى، النظام إكس بي، أنت مسؤول — تعيد داخل تلك العملية فقط رؤية العالم في عصر ولادة التطبيق.

تزييف الإصدار صار «سلوكاً افتراضياً رسمياً»

تزييف الإصدار ليس خدعة خاصّة. من ويندوز 8.1 فصاعداً تعتمد القيمة التي يعيدها GetVersionEx على بيان التطبيق. تطبيق بلا إعلان <supportedOS> في قسم <compatibility> من البيان يُعطى دائماً ما يعادل ويندوز 8 (6.2)، مهما كان النظام الفعلي. عند وجود إعلان تُعاد القيمة حتى أعلى نظام معلَن (مثلاً إن أعلنت حتى معرّف ويندوز 8.1 تحصل على 6.3 حتى على ويندوز 11).67

إذن «إصدار ويندوز الذي يراه التطبيق» يُقرَّر في هذه المراحل المتراكبة.

  1. تُعاد القيمة حتى النظام المعلَن في البيان (6.2 إن لم يكن إعلان)
  2. إن طُبِّق وضع التوافق (shim من عائلة VersionLie) يُعاد إصدار النظام المختار6
كيف يُقرَّر إصدار النظام الذي يراه التطبيقالقيمة التي يعيدها GetVersionEx تُقرَّر بوجود إعلان supportedOS في البيان؛ بلا إعلان يُعاد 6.2 المعادل لويندوز 8 ومع إعلان تُعاد القيمة حتى أعلى نظام معلن وإن طُبّق shim من عائلة VersionLie تُكتب فوقها بإصدار النظام المختارلانعمنعملااستعلام GetVersionExهل يوجد إعلان supportedOS؟يُعاد معادل ويندوز 8 (6.2)القيمة حتى أعلى نظام معلنهل طُبّق shim من عائلة VersionLie؟قيمة النظام المختارة في وضع التوافقتُعاد القيمة كما هي

الشكل 7: إصدار ويندوز الذي يراه التطبيق يُقرَّر بمراحل متراكبة من البيان ومن الـ shims.

إن كان تطبيق داخلي «يتفرّع حسب إصدار النظام، وبشكل مربك يُحكَم عليه بأنّه 8 رغم أنّ هذا ويندوز 11»، اشتبه أوّلاً في إعلان supportedOS في البيان. بالعكس، تطبيقاً قديماً يرفض البدء بناء على فحص إصدار يمكن، باحتمال عالٍ، تمريره بـ shim من عائلة VersionLie. في حالات كثيرة ينظر إلى رقم الإصدار فقط، والسلوك الفعلي سليم على نظام أحدث.

عَرَضان بسبب الإصدار وكيفية التعاملإن حُكم على تطبيق داخلي بأنه 8 رغم أن هذا ويندوز 11 فاشتبه في إعلان supportedOS في البيان؛ تطبيقاً قديماً يرفض البدء بفحص إصدار يمكن تمريره غالباً بـ VersionLieحُكم عليه بأنه 8 رغم أن هذا ويندوز 11اشتبه في إعلان supportedOSرفض البدء بفحص إصدارجرّب التمرير بـ VersionLieالسلوك الفعلي غالباً سليم على نظام أحدث

الشكل 8: عندما يكون الحكم قديماً اشتبه في البيان؛ عندما يُرفض البدء اشتبه في VersionLie.

5. ماذا يفعل مربّع وضع التوافق

إعدادات خصائص → علامة تبويب التوافق تُخزَّن في مفتاح السجلّ AppCompatFlags\Layers. إعدادات توافق تطبيقات DXGI ونحوها تستخدم المفتاح نفسه مكاناً لتحديد طبقة توافق.2 لننظر فعلاً.

reg query "HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"

لـ EXE ضبطت عليه «ويندوز إكس بي (حزمة الخدمة 3)» و«تشغيل هذا البرنامج كمسؤول» و«تجاوز سلوك تحجيم DPI العالي» في علامة التوافق سترى قيمة مثل التالية.

HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
    C:\LegacyApp\Gyomu.exe    REG_SZ    ~ WINXPSP3 RUNASADMIN HIGHDPIAWARE

تقابلات تمثيلية بين عناصر المربّع والقيم (مؤكَّدة على ويندوز 11؛ أسماء العناصر والقيم قد تتغيّر حسب إصدار النظام).

عنصر علامة التوافق القيمة المكتوبة (مثال) ما هي فعلياً
وضع التوافق: ويندوز إكس بي (حزمة الخدمة 3) WINXPSP3 طبقة توافق تجمع تزييف الإصدار وعدّة shims أخرى
وضع الألوان المخفَّض (8 بت / 256 لوناً) 256COLOR تخفيف لوضع الألوان القديم
التشغيل بدقة شاشة 640 × 480 640X480 التشغيل بدقة منخفضة
تعطيل تحسينات ملء الشاشة DISABLEDXMAXIMIZEDWINDOWEDMODE تعطيل تحسينات الرسم عند ملء الشاشة
تجاوز سلوك تحجيم DPI العالي (التطبيق) HIGHDPIAWARE إيقاف افتراضية DPI (تمديد الصورة النقطية)11
تشغيل هذا البرنامج كمسؤول RUNASADMIN طلب رفع عند البدء

ثلاث نقاط تُحفَظ.

  • «تشغيل هذا البرنامج كمسؤول» يُكتَب في المكان نفسه. وضع التوافق وعلم الرفع يعيشان معاً في مفتاح Layers نفسه، ومن هناك يولد الالتباس «ضبطت وضع التوافق فجاء الرفع / اختفى». النظر إلى القيمة مباشرة يفصل الاثنين.
  • ما يُكتَب في HKCU هو «إعداد ذلك المستخدم». إن ضبطته من «تغيير الإعدادات لجميع المستخدمين» في العلامة يُكتَب إلى المفتاح الذي يحمل الاسم نفسه في جانب HKLM ويسري على جميع المستخدمين. عند التوزيع بالتصوير انتبه إلى أيّ جانب تكتب.
  • المربّع مدخل إلى الطبقات الجاهزة فقط. العلامة تتيح اختيار طبقات تمثيلية فقط؛ لا تستطيع اختيار shims فردية وتركيبها. ذلك ما يفعله Compatibility Administrator في الفصل التالي.
المسار من إعداد علامة التوافق إلى السريانإعدادات علامة التوافق تُخزَّن كمسار EXE وقيمة في مفتاح Layers لـ AppCompatFlags؛ في المرة التالية التي يبدأ فيها ذلك الـ EXE يقرأ المحمّل القيمة ويطبّق طبقة التوافق المقابلة على العمليةضبط في علامة التوافقتخزين مسار EXE والقيمة في مفتاح Layersبدء EXE التاليالمحمّل يقرأ القيمةتطبيق طبقة التوافق على العمليةHKCU لذلك المستخدم فقطHKLM يسري على جميع المستخدمين

الشكل 9: المربّع في الواقع كتابة إلى مفتاح Layers، والتطبيق يحدث عند البدء التالي.

6. Compatibility Administrator عملياً — بناء قاعدة .sdb مخصّصة وتوزيعها

6.1. كيف تحصل عليه، والتحفّظات

Compatibility Administrator أداة مضمَّنة في Windows ADK (Windows Assessment and Deployment Kit).12 بعد التثبيت توجد النسختان 32 بت و64 بت، ويجب استخدام نسخة 32 بت لتطبيقات 32 بت ونسخة 64 بت لتطبيقات 64 بت.13

هناك تحفّظ مهمّ آخر. إن بدأت Compatibility Administrator مرفوعاً (كمسؤول) واختبرت، فإنّ افتراضية UAC والتحويل لا يتصرّفان كما يتصرّفان لمستخدم حقيقي، وقد تحكم خطأً أنّ «الأمر أُصلح». أكّد دائماً أثر الإصلاح بنفس الحساب والامتيازات التي للمستخدم الفعلي.4

تحفّظان عند استخدام Compatibility Administratorاستخدم نسخة 32 بت لتطبيقات 32 بت ونسخة 64 بت لتطبيقات 64 بت، وأكّد أثر الإصلاح بنفس حساب وامتيازات المستخدم الفعلي لا في حالة رفعتطبيق 32 بتاستخدم نسخة 32 بتتطبيق 64 بتاستخدم نسخة 64 بتاختبار في حالة رفعقد تحكم خطأً على إصلاحاختبار بامتيازات المستخدم الفعليأكّد الأثر

الشكل 10: اختيار نسخة 32 بت أو 64 بت، والتأكيد بنفس امتيازات المستخدم الفعلي، هما تحفّظا المدخل.

6.2. إجراء بناء قاعدة توافق مخصّصة

المخطّط كالتالي.14

  1. في الجزء الأيسر من Compatibility Administrator أنشئ قاعدة جديدة تحت «Custom Databases» واختر «Create New» → «Application Fix»
  2. أدخل اسم التطبيق واسم البائع وحدّد ملف الـ EXE المستهدف
  3. اختر وضع التوافق (الطبقة) المراد تطبيقه — تجربة حزمة مثل «توافق ويندوز إكس بي» أوّلاً هي الطريق القصير
  4. إن لزم أضف إصلاحات توافق فردية (shims) — تستطيع تضييقها إلى مجموعة دنيا مثل VersionLie فقط أو CorrectFilePaths فقط
  5. أكّد شروط المطابقة (حجم الملف والمجموع الاختباري والإصدار وما إليه) واحفظ

شروط المطابقة مفتاح «طبّق هذا على هذا الـ EXE فقط». الشروط الأساسية الافتراضية تكفي عادة، لكنّنا نوصي بترك شرط يستطيع تحديد إصدار التطبيق. ذلك يمنع حادث استمرار كذبة قديمة على إصدار جديد عندما يشحن البائع لاحقاً طبعة مصلحة.1415

إجراء بناء قاعدة توافق مخصّصةأنشئ Application Fix في قاعدة جديدة وحدّد اسم التطبيق والـ EXE المستهدف وجرّب حزمة وضع توافق أولاً ثم ضيّق إلى shims فردية إن لزم وأكّد شروط المطابقة واحفظإنشاء قاعدة جديدةاختيار Application Fixتحديد اسم التطبيق والـ EXE المستهدفتجربة حزمة وضع توافقإن لزم التضييق إلى shims فرديةتأكيد شروط المطابقة والحفظترك شرط يحدّد الإصدار

الشكل 11: لـ Application Fix جرّب حزمة وضع توافق أوّلاً، ضيّق إلى مجموعة دنيا، وقيّد الهدف بشروط المطابقة.

اختبر ملف الـ .sdb الذي أنشأته على آلة تحقّق أوّلاً. متى عمل كما قُصد تُنشره على المنظّمة.

6.3. التوزيع بـ sdbinst

الأمر الذي يطبّق .sdb مخصّصاً على كلّ حاسوب هو sdbinst.exe (يتطلّب امتيازات مسؤول).15

:: Install (-q is silent with no confirmation)
sdbinst -q "C:\Deploy\MyCorpFixes.sdb"

:: Uninstall (by file)
sdbinst -q -u "C:\Deploy\MyCorpFixes.sdb"

:: Uninstall (by database GUID)
sdbinst -q -u -g {database GUID}

كاستراتيجية نشر تنظيمي توصي مايكروسوفت بالدمج في قاعدة مخصّصة واحدة على مستوى الشركة (أو القسم) وإدارتها مركزياً، بدل شحن .sdb منفصل مع مثبّت كلّ تطبيق. كلّما كثرت الإصلاحات سهُل تحديث قاعدة واحدة وإعادة توزيعها أكثر من توزيع قواعد سطر واحد كثيرة. للقاعدة المخصّصة GUID خاص، وتثبيت إصدار جديد بنفس الـ GUID يستبدل الإصدار القديم تلقائياً، فتبقى عمليات التحديث بسيطة أيضاً. ضع التوزيع نفسه على مسار قائم يستطيع التشغيل بامتيازات مسؤول، مثل التعبئة كـ MSI أو سكربت بدء تشغيل.15

المسار من إنشاء .sdb مخصّص إلى توزيعهأنشئ قاعدة توافق مخصّصة في Compatibility Administrator واختبرها على آلة تحقّق وطبقها على كل حاسوب بـ sdbinst وعند التحديث ثبّت إصداراً جديداً بنفس الـ GUID فيُستبدل القديم تلقائياًالإنشاء في Compatibility Administratorالاختبار على آلة تحقّقالتطبيق على كل حاسوب بـ sdbinstتثبيت إصدار جديد بنفس الـ GUIDيُستبدل الإصدار القديم تلقائياًالتسجيل في البرامج والميزات

الشكل 12: يُنشر .sdb مخصّص عبر الإنشاء والتحقّق وتوزيع sdbinst، وتُدار التحديثات بالـ GUID.

قاعدة مخصّصة مثبَّتة تُسجَّل كعنصر في «البرامج والميزات (التطبيقات المثبَّتة)»، لذا تستطيع أيضاً تأكيد الجرد والإزالة من هناك. أيّ حواسيب تحمل أيّ .sdb معلومة تنتمي إلى دفتر إدارة الأصول.

7. الحالات التي لا تعمل فيها، والحدود

الـ shims ليست رصاصة فضّية. بالتصميم لا تعمل في الحالات التالية.

  • مشكلات وضع النواة. الـ shim يعمل داخل عملية وضع مستخدم، لذا لا يُصلح عدم توافق برنامج تشغيل جهاز. إن كان برنامج تشغيل جهاز قياس قديم أو قفل USB أو طابعة لا يدعم ويندوز 11، فلن يحلّ شيء تطبّقه على جانب التطبيق. الشيفرة التي تعمل في النواة، مثل أجزاء من برمجيات مكافحة الفيروسات، سواء.3
  • تطبيقات 16 بت. ويندوز 64 بت لا يدعم تشغيل تطبيقات 16 بت. للمقابض 32 بتّاً صالحاً على ويندوز 64 بت ولا يمكن اقتطاعها لتمريرها إلى تطبيق 16 بت، لذا يفشل البدء بـ ERROR_BAD_EXE_FORMAT.8 حتى عندما يكون التطبيق نفسه 32 بت توجد حزم من ذلك العصر كعب المثبّت فيها 16 بت، وتظهر كـ «التطبيق كان سيعمل، لكنّنا لا نستطيع تثبيته».
  • الوصول المباشر للعتاد. تطبيقات صناعية تفترض أنّها تستطيع لمس منافذ الإدخال/الإخراج أو الذاكرة المادية مباشرة غير مسموح لها بذلك من وضع المستخدم على ويندوز الحديث أصلاً، وذلك خارج نطاق ما يستطيع shim تزييفه.
  • تجاوز آليات الأمن. لأنّ الـ shim يعمل تحت قيود الأمن نفسها التي للتطبيق، لا يستطيع جعل «شيء لا تستطيعه لانعدام الامتياز» ممكناً. ForceAdminAccess وWRPMitigation فقط يزيّفان نجاح فحص أو كتابة كي يتابع التطبيق؛ ليسا إعادة كتابة مورد محمي فعلاً.34
  • تطبيقات تفحص سلامتها بنفسها. تطبيقات بحماية نسخ قديمة أو كشف عبث قد تعامل خطاف الـ API نفسه كشذوذ وتتوقف.
حالات لا يعمل فيها الـ shimالـ shim يعمل داخل عملية وضع مستخدم لذا لا يعمل على مشكلات برامج تشغيل النواة ولا تطبيقات 16 بت ولا الوصول المباشر للعتاد ولا تجاوز آليات الأمنلا يعمللا يعمللا يعمللا يعملShim (يعمل في وضع المستخدم)برنامج تشغيل النواةتطبيق 16 بتوصول مباشر للعتادتجاوز آليات الأمنعلى 64 بت يفشل البدء نفسهيزيّف النجاح فقط كي يتابع التطبيق

الشكل 13: الـ shim وضع مستخدم فقط ولا يصل إلى النواة ولا تطبيقات 16 بت ولا الوصول المباشر للعتاد ولا تجاوز الأمن.

والحدّ الجوهري المشترك لكلّ shim أنّه ترقيع. الـ shim كذبة مفصّلة لاستخدام معيّن لواجهة معيّنة، وإن تغيّر تنفيذ جانب النظام ينهار الافتراض. الـ shims التي تقدّمها مايكروسوفت تُصان كجزء من ويندوز عبر Windows Update،3 لكن رعاية الأكاذيب التي طبّقتها بقاعدة مخصّصة عمل منظّمتك. احسب، ككلفة إطالة العمر، عملية تحقّق من «قائمة التطبيقات المُبقاة حيّة بالـ shims» عند كلّ تحديث ميزات.

الـ shims كترقيع ومن المسؤول عن صيانتهاالـ shim كذبة مفصّلة لاستخدام واجهة معيّن وينهار الافتراض إن تغيّر تنفيذ جانب النظام؛ shims مايكروسوفت تُصان عبر Windows Update أما رعاية أكاذيب القاعدة المخصّصة فعمل المنظّمة والتحقّق عند كل تحديث ميزات كلفة إطالة العمرShim = كذبة ترقيعيةتغيير النظام يكسرهاShims مايكروسوفتعبر Windows Updateأكاذيب القاعدة المخصّصةالمنظّمة ترعاهاالتحقّق عند كل تحديث كلفة إطالة العمر

الشكل 14: مسؤولية صيانة كذبة الـ shim منقسمة بين المجموعة التي تقدّمها مايكروسوفت والمجموعة المخصّصة لمنظّمتك.

8. القيمة العملية لـ RunAsInvoker — إسكات طلب الرفع فقط

بين الـ shims، الأكثر ظهوراً في عمل تقنية المعلومات اليومي هو RunAsInvoker.

بعض تطبيقات الأعمال القديمة تعلن requireAdministrator في البيان، أو تُكشَف خطأً كمثبّت من اسم الـ EXE أو محتواه، وتطلب رفع UAC في كلّ بدء. كثير منها مع ذلك يطلب المسؤول من قصور عصر إكس بي ولا يستخدم امتيازات المسؤول فعلاً. تطبيق Shim RunAsInvoker يكتب فوق كشف المثبّت والبيان معاً، ويبدأ التطبيق بالرمز الموروث من العملية الأم (= امتيازات مستخدم عادي).9

كيف يكبت RunAsInvoker طلب الرفعإعلان requireAdministrator في البيان أو الكشف الخطأ كمثبّت يسبّب طلب رفع UAC عند البدء لكن تطبيق RunAsInvoker يكتب فوق الاثنين ويبدأ التطبيق برمز العملية الأملانعمإعلان requireAdministratorهل طُبّق RunAsInvoker؟كُشف خطأً كمثبّتطلب رفع UAC عند كل بدءيبدأ برمز العملية الأمالعمل الذي يحتاج مسؤولاً حقاً يفشل داخل التطبيق

الشكل 15: RunAsInvoker يكتب فوق سبب طلب الرفع فقط؛ الامتيازات لا تزيد.

حتى دون بناء .sdb في Compatibility Administrator تستطيع تطبيق الطبقة نفسها مؤقّتاً بمتغيّر البيئة __COMPAT_LAYER.

:: Apply RunAsInvoker to child processes started from this command prompt
set __COMPAT_LAYER=RunAsInvoker
start "" "C:\LegacyApp\Gyomu.exe"
# In PowerShell
$env:__COMPAT_LAYER = 'RunAsInvoker'
Start-Process 'C:\LegacyApp\Gyomu.exe'

إن حوّلت هذين السطرين إلى ملف دفعي ووزّعته كاختصار، تستطيع تجنّب تسليم امتيازات المسؤول المحلّي لمستخدمين عاديين، ولا تُستدعى تقنية المعلومات في كلّ مرّة لكلمة مرور UAC. تقنية توافق تصلّب الدفاع، بما يتماشى مع أقلّ امتياز.

أثر توزيع دفعة RunAsInvokerتوزيع دفعة سطرين تضبط RunAsInvoker كاختصار يعني تجنّب تسليم امتيازات المسؤول للمستخدمين العاديين وعدم استدعاء تقنية المعلومات لكلمة مرور UAC وتشغيل يتبع أقل امتيازتوزيع دفعة سطرينتستطيع تجنّب تسليم امتيازات المسؤوللا تُستدعى تقنية المعلومات لأجل UACتشغيل يتبع أقل امتياز

الشكل 16: توزيع دفعة وحدها يستطيع تقليل تسليم امتيازات المسؤول والاستدعاء لأجل UAC معاً.

التحفّظات أيضاً، بوضوح.

  • الامتيازات لا تزيد. العمل الذي يحتاج امتيازات مسؤول حقاً (كتابات إلى HKLM، تحديثات تحت Program Files، وما إليه) سيخطئ داخل التطبيق، أو، إن تحقّقت الشروط، سيُحوَّل إلى VirtualStore بافتراضية UAC.10 إن «توقّف» حفظ الإعدادات فجأة فاشتبه في الافتراضية.
  • طريقة متغيّر البيئة تسري على العمليات الابن فقط. لتطبيق دائم، إعداد مباشر في مفتاح Layers (ليس لـ RUNASINVOKER عنصر في العلامة) أو توزيع عبر .sdb موثوق.
  • إصلاح وجهة الكتابة هو المسار الحقيقي. إن استطعت تغيير التطبيق فانقل ملف الإعدادات تحت %APPDATA% وأعلن asInvoker في البيان — ذلك الشكل الصحيح.9
التطبيق المؤقّت والدائم لـ RunAsInvokerالتطبيق عبر متغيّر COMPAT_LAYER يسري فقط على العمليات الابن التي تبدأ من هناك؛ للتطبيق الدائم استخدم إعداداً مباشراً في مفتاح Layers أو توزيعاً عبر .sdbضبط عبر متغيّر بيئةيسري على العمليات الابن فقطتطبيق مؤقّتضبط مباشر في مفتاح Layersتطبيق دائمتوزيع عبر sdb

الشكل 17: طريقة متغيّر البيئة تطبيق مؤقّت محدود بالعمليات الابن؛ جعله دائماً يتمّ بمفتاح Layers أو .sdb.

9. القرار بين إطالة العمر والترحيل — ماذا تفكّر بعد أن يعمل تحت Shim

لحظة عمله تحت shim راحة، لكن المهمّ ألا يتوقّف التفكير هناك. العمل تحت shim يعني فقط أنّه صادف وعاءً أعدّه ويندوز. محاور القرار، في جدول.

محور القرار شروط تميل إلى إطالة العمر (shim) شروط تميل إلى الترحيل / إعادة الكتابة
مدّة الاستخدام المتبقية مخطَّط للتقاعد مع العمل خلال 1–2 سنة مفترض الاستمرار 5 سنوات أو أكثر
الشيفرة المصدرية لا توجد (البائع ذهب، أو فُقدت) موجودة، أو يمكن استرداد الأصل
عمق الاعتماد مشكلة توافق واجهة وضع مستخدم فقط يعتمد على برنامج تشغيل أو 16 بت أو عتاد مخصّص
البدائل لا منتج معلّب ولا إصدار جديد منتج الوجهة والتقنية واضحان
الأثر عند الفشل يستطيع العمل السير بإجراء احتياطي العمل الجوهري يُصاب مباشرة
قدرة التحقّق تستطيع تأكيد السلوك عند كلّ تحديث ميزات لا مورد تحقّق، ويميل إلى التجميد

إن قرّرت إطالة العمر فأدخل النقاط الثلاث التالية في التشغيل كمجموعة.

  1. سجّل. أيّ EXE، أيّ shim/طبقة، ولماذا. اترك قيمة مفتاح Layers وGUID الـ .sdb في دفتر. «لا أحد يعرف لماذا يعمل» أكبر دين تتركه للشخص التالي. هذه نفس عقلية الحفظ المشروحة في «عندما ترث نظاماً بلا شيفرة مصدريّة ولا مواصفات».
  2. تحقّق. أدخل بدء العمليات الرئيسية للتطبيقات المُبقاة حيّة بالـ shims في بنود التحقّق لتحديث ميزات ويندوز. اربطه أيضاً بخطة استبدال النظام (Practical Options After Windows 10 End of Support).
  3. ضع مهلة. قرّر نهاية إطالة العمر — «حتى التحديث التالي للنظام الجوهري»، «حتى مارس 2028» — وأدر اعتبار الترحيل بالتوازي.
مجموعة التشغيل ذات النقاط الثلاث بعد قرار إطالة العمرسجّل في دفتر أي shim يجعله يعمل وتحقّق من سلوك التطبيقات المُبقاة حيّة بالـ shims عند كل تحديث ميزات وضع مهلة لنهاية إطالة العمر وأدر اعتبار الترحيل بالتوازيقرار إطالة العمرسجّل: أي shim يجعله يعمل في دفترتحقّق: أكّد السلوك عند كل تحديث ميزاتمهلة: قرّر نهاية إطالة العمرأدر اعتبار الترحيل بالتوازي

الشكل 18: تُدار إطالة العمر كمجموعة من ثلاث نقاط: تسجيل وتحقّق ومهلة، بما فيه اعتبار الترحيل بالتوازي.

في جانب الترحيل تتغيّر الخيارات القياسية مع تقنية التطبيق. لـ VB6 الاختيار الثلاثي لإعادة الكتابة الكاملة والتحويل التلقائي والترحيل المرحلي المنظَّم في «إلى متى ستستمرّ تطبيقات VB6 في العمل»؛ لاعتماد ActiveX/OCX جدول قرار الإبقاء / التغليف / الاستبدال في «كيف تتعامل مع ActiveX / OCX اليوم». الطريقة السليمة لوضع shim هي شراء وقت كي تسير فترة الاعتبار والتحضير لمشروع الترحيل ذلك بأمان.

خيارات جانب الترحيل وأين يجلس الـ shimخيارات الترحيل القياسية تتغيّر مع تقنية التطبيق؛ لـ VB6 الاختيار الثلاثي إعادة كتابة أو تحويل تلقائي أو ترحيل مرحلي ولاعتماد ActiveX جدول الإبقاء أو التغليف أو الاستبدال والـ shim يُوضع كشراء وقت لاعتبار مشروع الترحيل وتحضيرهVB6اعتماد ActiveXيشتري وقتاً للاعتبار والتحضيرما تقنية التطبيق؟إعادة كتابة أو تحويل تلقائي أو ترحيل مرحليإبقاء أو تغليف أو استبدالإطالة عمر عبر shim

الشكل 19: تُقرَّر خيارات الترحيل القياسية بتقنية التطبيق، ويُوضَع الـ shim كشراء وقت لذلك الاعتبار.

10. الخلاصة

  • الهوية الحقيقية لوضع التوافق هي الـ shims. إعدادات علامة التوافق تُكتَب إلى مفتاح AppCompatFlags\Layers وتُحقَن في العملية عند البدء كخطاف API عبر إعادة كتابة الـ IAT.
  • الـ shims مجموعة «أكاذيب تعيد الإجابة التي يتوقّعها التطبيق القديم». تُوفَّر shims جاهزة لتزييف الإصدار وإعادة تعيين المسارات وتزييف السجلّ وتزييف فحوص المسؤول ونحوها.
  • ويندوز نفسه يستخدم عدداً كبيراً من الـ shims افتراضياً، وPCA يستطيع تطبيقها تلقائياً. الاعتماد على وضع التوافق نفسه اختيار معقول يركب آلية رسمية للنظام.
  • هناك حدّ مبدئي لوضع المستخدم فقط بلا تجاوز أمن، وبرامج تشغيل النواة وتطبيقات 16 بت والوصول المباشر للعتاد لا تُنقَذ.
  • النشر التنظيمي بناء .sdb مخصّص في Compatibility Administrator (Windows ADK) وتوزيعه بـ sdbinst. اختيار نسخة 32 بت/64 بت والاختبار بحساب المستخدم الفعلي وإدارة التحديثات بالـ GUID هي النقاط العملية.
  • التطبيقات التي «تتطلّب مسؤولاً لكنّها لا تحتاجه فعلاً» يمكن إنزالها إلى امتيازات عادية بـ __COMPAT_LAYER=RunAsInvoker. تقنية دفاعية تُسكت طلب الرفع بدل تسليم الامتيازات.
  • العمل تحت shim إطالة عمر لا حلّ. تسجيل ما يجعله يعمل والتحقّق عند كلّ تحديث ميزات ووضع مهلة كي يسير الترحيل بالتوازي — تلك المجموعة الثلاثية داخلة في قرار «الاعتماد على وضع التوافق».

في المرّة التالية التي يبدأ فيها تطبيق قديم يعمل بعد مربّع وضع التوافق، اسأل هذا من جديد. «بأيّ كذبة يعمل هذا التطبيق؟ إلى متى ستبقى تلك الكذبة تعمل؟» إن استطعت الإجابة فإطالة العمر استراتيجية محترمة.

مقالات ذات صلة

مجالات الاستشارة ذات الصلة

شركة كومورا سوفت ذ.م.م. تتولّى التحقيق في كيف تتصرّف تطبيقات أعمال قديمة بلا شيفرة مصدرية وتصميم إطالة عمرها (اختيار الـ shims ووضع التوافق، وبناء .sdb مخصّص ونشره)، وتحقّق توافق التطبيقات القائمة لترحيل ويندوز 11، وتخطيط إعادة كتابة أو ترحيل يسير بالتوازي مع إطالة العمر. الاستشارة من مرحلة «بدأ يعمل في وضع التوافق، لكن هل يجوز تركه هكذا؟» جائزة.

روابط مرجعيّة

  1. Microsoft Learn, Application Compatibility Database. أنّ بنية التوافق تدير المشكلات والعلاجات في قاعدة بصيغة .sdb، والمطابقة حسب صفات التنفيذي، وApphelp (عرض رسالة) وAppfix (خطاف API عبر shim)، وطبقة توافق (وضع) تجمع عدّة shims وأعلام.  2 3

  2. Microsoft Learn, DXGI overview. أنّ إعدادات توافق التطبيقات تُخزَّن في مفتاح السجلّ HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers (باستخدام إعدادات توافق DXGI كمثال).  2

  3. Microsoft Learn, Understanding and Using Compatibility Fixes. أنّ إصلاح التوافق (shim) يحوّل استدعاءات الـ API بإعادة كتابة الـ IAT (جدول عناوين الاستيراد)، وأنّ الربط الديناميكي يُعالَج بخطف GetProcAddress، وأنّ الـ shim يخضع لقيود الأمن نفسها التي للتطبيق ولا يتجاوز آليات أمن النظام، وأنّه وضع مستخدم فقط ولا يصلح مشكلات برامج التشغيل، وأنّ إصلاحاً ممكناً بـ shim ممكن أيضاً بتعديل شيفرة، وسيناريوهات استخدام مثل تطبيقات انتهى دعم بائعها، وأنّ إصلاحات التوافق التي تقدّمها مايكروسوفت تُشحَن كجزء من ويندوز وتُحدَّث عبر Windows Update.  2 3 4 5 6 7 8

  4. Microsoft Learn, Compatibility Fixes for Windows 10, Windows 8, Windows 7, and Windows Vista. قائمة ووصف لإصلاحات التوافق المعروفة بما فيها CorrectFilePaths وVirtualRegistry وForceAdminAccess وRunAsAdmin/RunAsHighest/RunAsInvoker وWRPMitigation وEmulateGetDiskFreeSpace وGlobalMemoryStatusLie وLoadLibraryRedirect وعائلة VersionLie؛ اختيار نسخة 32 بت/64 بت من Compatibility Administrator؛ وأنّ الاختبار في حالة رفع يعني أنّ الافتراضية والتحويل لا يتصرّفان كما يُتوقَّع، لذا ينبغي التحقّق بحساب المستخدم الفعلي.  2 3 4

  5. Microsoft Learn, Program Compatibility Assistant scenarios for Windows 8. أنّ PCA يراقب تنفيذ التطبيق ويكشف علامات مشكلة توافق معروفة ويقترح تطبيق إصلاح موصى به أو يطبّقه تلقائياً (PINDLL وDISABLEUSERCALLBACKEXCEPTION وVIRTUALIZEDELETE وWRPMITIGATION ونحوها)، وتطبيق إصلاح من علامة التوافق ومن Program Compatibility Troubleshooter.  2

  6. Microsoft Learn, GetVersionExW function. أنّ من ويندوز 8.1 فصاعداً تعتمد القيمة التي يعيدها GetVersionEx على البيان، وأنّ تطبيقاً غير مبيَّن لويندوز 8.1/10 يُعطى قيمة إصدار ويندوز 8 (6.2)، وأنّ عند تفعيل وضع التوافق يُبلَّغ إصدار النظام المختار.  2 3

  7. Microsoft Learn, Targeting your application for Windows. كيف تعلن معرّفات أنظمة مدعومة بعنصر supportedOS في قسم compatibility من بيان التطبيق، والسلوك عند غياب الإعلان، وأنّ تطبيقاً x86 32 بت تفاعلياً لا يتضمّن trustInfo يخضع لافتراضية ملفات UAC (تحويل الكتابة إلى VirtualStore).  2

  8. Microsoft Learn, Running 32-bit Applications. أنّ WOW64 طبقة محاكاة تشغّل تطبيقات 32 بت على ويندوز 64 بت وتعزل تصادمات الملفات والسجلّ، وأنّ ويندوز 64 بت لا يدعم تشغيل تطبيقات 16 بت، مع فشل البدء بـ ERROR_BAD_EXE_FORMAT بسبب عدد البتّات الصالحة في المقبض.  2

  9. Microsoft Learn, Using the RunAsInvoker Fix. أنّ إصلاح توافق RunAsInvoker يبدأ التطبيق بالرمز الموروث من العملية الأم، وأنّه يكتب فوق كشف المثبّت ومعالجة البيان، وأنّه يُطبَّق كعلم محمّل دون اعتراض واجهات، وأنّ عندما تستطيع إصلاح الشيفرة فالإصلاح الصحيح إعلان asInvoker في البيان.  2 3

  10. Microsoft Learn, Registry Virtualization. أنّ افتراضية السجلّ تقنية توافق تحوّل بشفافية الكتابات العامّة إلى HKLM\Software إلى VirtualStore لكلّ مستخدم، وأنّ العمليات التفاعلية 32 بت فقط في النطاق وتُعطَّل للعمليات التي تحدّد requestedExecutionLevel في البيان وللعمليات 64 بت، وأنّها موضوعة كتقنية مؤقّتة يُقصد إزالتها من ويندوز مستقبلي.  2

  11. Microsoft Learn, High DPI Desktop Application Development on Windows. أنّ تطبيقاً غير واعٍ بـ DPI يُعامَل كأنّه يرسم عند 96 DPI ثابت وعلى شاشة عالية الـ DPI يمدّد ويندوز الصورة النقطية فتبدو ضبابية، والفروق بين أوضاع وعي DPI (Unaware/System/Per-Monitor).  2

  12. Microsoft Learn, Download and install the Windows ADK. أنّ Windows ADK يتضمّن Compatibility Administrator وStandard User Analyzer، وكيف تفكّر في اختيار إصدار ADK وكيف تنزّله وثبّته. 

  13. Microsoft Learn, Compatibility Administrator User’s Guide. أنّ Compatibility Administrator يوفّر تطبيق إصلاحات التوافق وأوضاع التوافق ورسائل AppHelp وإنشاء قاعدة مخصّصة، وأنّ النسختين 32 بت و64 بت تُثبَّتان ويجب استخدام نسخة 32 بت لتطبيقات 32 بت ونسخة 64 بت لتطبيقات 64 بت. 

  14. Microsoft Learn, Creating a Custom Compatibility Fix in Compatibility Administrator. أنّ إصلاح التوافق (كان يُسمّى shim) قطعة شيفرة صغيرة تعترض استدعاء API؛ إجراء إنشاء Application Fix في قاعدة مخصّصة (تحديد اسم التطبيق والبائع والـ EXE المستهدف، اختيار وضع توافق، اختيار shims إضافية، ضبط شروط المطابقة)؛ وأنّ عليك ترك شروط تحدّد التطبيق بشكل صحيح مع تضييق معلومات المطابقة.  2

  15. Microsoft Learn, Compatibility Fix Database Management Strategies and Deployment. أنّ قاعدة تُدار مركزياً موصى بها كاستراتيجية إدارة قاعدة توافق مخصّصة، وأنّ إصلاح التوافق ينبغي أن يتضمّن فحص إصدار (شرط مطابقة) كي لا يُطبَّق على إصدار جديد، والتثبيت المحلّي بـ Sdbinst.exe (خيارات -q و-u و-g)، وأنّ تثبيت إصدار جديد بنفس GUID القاعدة يلغي تثبيت الإصدار القديم تلقائياً، وطرق التوزيع عبر MSI أو سكربت.  2 3

أحدث المقالات التي تشترك في نفس الوسوم. عمّق فهمك بمواضيع مرتبطة.

ترتبط هذه المقالة بشكل طبيعي بصفحات الخدمات التالية.

الأسئلة الشائعة

أسئلة شائعة حول موضوع هذه المقالة.

إذا بدأ التطبيق يعمل بعد أن أشّرت وضع التوافق، هل يجوز الاستمرار هكذا؟
لإبقاء العمل يسير على المدى القصير، نعم. وضع التوافق خطاف API في وضع المستخدم يُسمّى shim، وهو آلية رسمية يوفّرها نظام التشغيل. لكن الـ shim يبقى ترقيعاً لتشغيل التطبيق دون إصلاحه، وتحديث آخر للنظام قد يغيّر الافتراضات فيتعطّل من جديد. سجّل في دفتر أنّه يعمل تحت وضع التوافق، واجعل هذا السجل جزءاً من قرار إعادة الكتابة أو إطالة العمر عن قصد.
ماذا يفعل مربّع وضع التوافق فعلياً؟
عندما تحفظ الإعدادات في علامة تبويب التوافق بحوار الخصائص، يكتب ويندوز مسار الـ EXE المستهدف وقيمة مثل "WINXPSP3" أو "HIGHDPIAWARE" تحت المفتاح HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers. في المرّة التالية التي يبدأ فيها ذلك الـ EXE، يقرأ محمّل ويندوز القيمة ويطبّق طبقة التوافق المقابلة (حزمة shims) على العملية. وضع توافق ويندوز إكس بي مثلاً يزوّر إصدار نظام التشغيل بإرجاع قيمة قديمة من واجهات استعلام الإصدار. النظام نفسه لا يتغيّر؛ فقط تلك العملية تُعرَض عليها ويندوز أقدم مزعومة.
هل يمكن تشغيل تطبيقات عصر 16 بت تحت وضع التوافق على ويندوز 64 بت؟
لا. ويندوز 64 بت يشغّل تطبيقات 32 بت عبر WOW64، لكنّه لا يدعم تشغيل تطبيقات 16 بت، ومحاولة البدء تفشل بـ ERROR_BAD_EXE_FORMAT. هذا حدّ معماري لا يستطيع shim تجاوزه. الحزم القديمة التي كعب المثبّت فيها 16 بت تفشل للسبب نفسه. إن احتجتها حقاً فانظر خارج وضع التوافق — مثلاً آلة افتراضية تتضمّن ويندوز 32 بت.
هل يمكن تشغيل تطبيق «لن يبدأ إلا كمسؤول» تحت حساب مستخدم عادي؟
RunAsInvoker يستحق التجربة. إذا نفّذت set __COMPAT_LAYER=RunAsInvoker في موجّه الأوامر ثم بدأت التطبيق، تُكبت طلبات الرفع الآتية من بيان requireAdministrator أو من كشف المثبّت، ويبدأ التطبيق بنفس امتيازات المستدعي (مستخدم عادي). لتطبيق يطلب صلاحيات المسؤول ولا يستخدمها فعلاً، يكفي هذا لإخراج الرفع من التشغيل اليومي. الامتيازات لا تزيد، فالعمل الذي يحتاج صلاحيات مسؤول حقاً سيفشل داخل التطبيق. اعتمده فقط بعد التحقّق من السلوك.
من أين أحصل على Compatibility Administrator؟
مضمّن في Windows ADK (Windows Assessment and Deployment Kit). نزّل الـ ADK من موقع مايكروسوفت، وعند التثبيت اختر ميزات Application Compatibility Tools. تُثبَّت النسختان 32 بت و64 بت؛ يجب استخدام نسخة 32 بت لتطبيقات 32 بت ونسخة 64 بت لتطبيقات 64 بت. طبّق قاعدة توافق مخصّصة (.sdb) أنشأتها بتشغيل أمر sdbinst على كلّ حاسوب.

الملف الشخصي للمؤلف

صفحة الملف الشخصي لمؤلف المقالة.

غو كومورا

مؤسّس شركة كومورا سوفت ذ.م.م.

يركّز على تطوير برامج ويندوز، والاستشارات التقنية، والتحقيق في الأخطاء، ويتميّز في المشاريع التي تبقى فيها الأصول القديمة ناشطة، وفي تشخيص الأعطال التي يصعب تحديد سببها.

العودة إلى المدونة