كيفية تصحيح Thunks مسطح

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

133722
تمت أرشفة هذه المقالة. وتظهر "كما هي" ولن يتم تحديثها بعد الآن.
الموجز
تصحيح الأخطاء التي تم إنشاؤها بواسطة برنامج التحويل البرمجي thunk thunks مسطح يمكن أن يكون من الصعب لأن آلية thunk شديد التعقيد أدوات تصحيح الأخطاء قادرة على تتبع خلال thunks صعوبة في استخدام. تقدم هذه المقالة استراتيجية الكلي للتصحيح thunks مسطح عدة معينة التصحيح وتقنيات دليل استكشاف الأخطاء وإصلاحها يشرح كيفية إصلاح العديد من مشكلات thunking الشائعة.
معلومات أخرى

قيود على ما يمكن هدف DLL

قبل الشروع في تصحيح thunks ، ضع في الاعتبار توجد بعض القيود على ما هو هدف يمكن القيام DLL داخل thunk. وهذا بسبب تطبيق يستند إلى Win16 استدعاء DLL المستندة إلى Win32 غير عملية المستندة إلى Win32; كذلك، تطبيق يستند إلى Win32 DLL المستندة إلى Win16 استدعاء عملية غير المستندة إلى Win16. حدود معينة الشائعة تتضمن:

  • لا يمكن إنشاء مؤشرات الترابط داخل thunk من تطبيق يستند إلى Win16 DLL المستندة إلى Win32.
  • يجب أن التعليمات البرمجية داخل DLLs المستندة إلى Win32 استدعاؤها بواسطة thunks تتطلب مساحة مكدس صغيرة بسبب العمليات المستندة إلى Win16 الاستدعاء مكدسات أصغر بكثير عن تطبيقات Win32.
  • يجب أن لا thunk DLLs المستندة إلى Win16 التي تحتوي على إجراءات خدمة المقاطعة (ISRs) إلى المستندة إلى Win32 DLLs أثناء معالجة المقاطعات.
  • لا يجب أن التطبيقات المستندة إلى Win32 تمرير مؤشرات إلى البيانات الموجودة في بنية تخزين العناصر كمعلمات thunks أو استدعاء DLLs المستندة إلى Win16 التبديل مكدسات.

لماذا التصحيح Thunks مسطح يمكن أن يكون

تصحيح thunks مسطح يكون من الصعب جزئياً لأنه آلية thunk مسطح جزءًا معقدة من Windows kernel. المكالمات أصول التعقيد الخاصة به من الحقائق فإنه يجب تحويل استدعاءات دالة في التعليمات البرمجية المترجمة إلى 32-بت متوافق مع الرموز ذات 16 بت والعكس. لأن رمز 32 بت يستخدم أنواع بيانات مختلفة تسجيل CPU مجموعات من الرموز ذات 16 بت، آلية thunk مسطح يجب ترجمة معلمات الدوال التبديل مكدسات و ترجمة قيم الإرجاع. تم تحسين سرعة حيث يجب أن يسمح رمز Win32 preemptive استدعاء التعليمات البرمجية Win16 غير preemptive. يجعل برنامج التحويل البرمجي thunk thunks مسطح إنشاء أسهل بكثير من يدوياً وخطوات إنشائها ولكن غير موثوقة.

تصحيح thunks مسطح غير صعبة فقط لأن آلية نفسه معقدة، ولكن أيضاً لأن أدوات تصحيح الأخطاء الضرورية من الصعب الرئيسي. مستوى التطبيق debuggers مثل لا تتبع المصحح Microsoft Visual C++ و WinDBG خلال thunks لأن تتكون من التعليمات البرمجية كل من 32 بت و 16-بت كما يؤدي إلى المطالبة أو حرره Win16Mutex في النظام. لتتبع خلال thunk ، تحتاج إلى استخدام مصحح أخطاء مستوى النظام مثل WDEB386.EXE. يتم عيوب الرئيسية لاستخدام WDEB386.EXE تحتاج إلى معرفته لغة التجميع Intel x 86 معرفة كيف تعمل المعالجات الصغيرة Intel x 86 وتذكر العديد مصحح الأخطاء الأوامر.

خطط أفضل المراد استخدامه

استراتيجية أفضل للتصحيح thunks هي لتقسيم conquer لأنه من السهل نسبيًا و يحل معظم المشاكل قبل أن تحتاج إلى تتبع خلال التعليمات البرمجية لغة التجميع في مصحح أخطاء مستوى النظام. يتم مؤلف thunks مسطح من DLL المستندة إلى Win32 DLL المستندة إلى Win16 بحيث يمكن اختبار كل من هذه في عزل قبل اختبار معاً. إنشاء تطبيق يستند إلى Win16 لاختبار DLL المستندة إلى Win16 ثم إنشاء تطبيق يستند إلى Win32 لاختبار DLL المستندة إلى Win32. يؤدي القيام بذلك يسمح لك استخدام مجموعة متنوعة من أدوات التصحيح للتحقق من أن كل جانب يعمل بشكل صحيح.

قائمة التحقق المبدئي - قبل التحويل البرمجي مع المحول البرمجي Thunk

بمجرد تم التحقق من أن كل جانب يعمل بشكل صحيح حان الوقت لوضع الاثنين معاً لاختبار thunk نفسه. قبل التحويل البرمجي thunk مع برنامج التحويل البرمجي thunk ، تأكد من اختيار الأولي من العناصر التالية:
  1. في البرنامج النصي الخاص thunk تأكد من أن كل دالة العدد الصحيح وأنواع المعلمات. وتأكد أيضًا من أن أنواع المعلمات التي يدعمها برنامج التحويل البرمجي thunk. إذا لم تكن ، يجب تغيير المعلمة ما لتمرير البيانات مع نوع معتمدة.
  2. إذا قمت بتمرير أي بنيات كمعلمات تأكد من استخدام نفس بنية حزم في الخاص بك يعمل بنظام Win32 DLL المستندة إلى Win16 DLL و thunk البرنامج النصي. تعيين بنية الحزم في سطر الأوامر البرمجي C++/C و في سطر الأوامر thunk برنامج التحويل البرمجي. لاحظ أن رمز تبديل الحزم المترجم thunk الصغيرة للجانب 16-بت و الكبيرة للجانب 32-بت.
  3. تأكد من أن وظائف تقوم thunking إلى تصدير بشكل صحيح واستخدام PASCAL استدعاء اصطلاح إذا تكون 16 بت أو _stdcall إذا تكون 32-بت. لا يعتمد برنامج التحويل البرمجي thunk _cdecl و __fastcall استدعاء اصطلاحات.
  4. تأكد من أن DLL الخاص بك يعمل بنظام Win32 يستدعي ThunkConnect32() في كل مرة يتم استدعاء الدالة DllMain() به. وبالمثل, تأكد من وجود DLL المستندة إلى Win16 المصدرة DllEntryPoint() دالة ، منفصلة عن به LibMain() التي تستدعي ThunkConnect16() ثم تقوم بإرجاع TRUE إذا نجح ThunkConnect16().

    ملاحظة: يمكنك بالفعل استدعاء XXX_ThunkConnect16() و XXX_ThunkConnect32() حيث تكون XXX الرمز تعريف مع رمز التبديل -t المترجم thunk. تستخدم التعليمة البرمجية التي تم إنشاؤها بواسطة برنامج التحويل البرمجي thunk هذه الرموز لإنشاء الجداول التي تستدعي ThunkConnect16() و ThunkConnect32.
  5. تأكد من أن القيمة المحددة في المترجم thunk رمز التبديل -t سطر الأوامر هو نفسه Win32 و DLLs thunk Win16. يجب أيضاً تتوافق مع القيمة البادئة المكالمات ThunkConnect في DLLs Win16 و المستندة إلى Win32 (راجع الملاحظة في الخطوة 4).
  6. تحقق من DLL المستندة إلى Win16 على DLLEntryPoint تصدير بواسطة الكلمة الأساسية RESIDENTNAME في ملف تعريف (.DEF) الوحدة النمطية الخاصة به. دون الكلمة الأساسية RESIDENTNAME يفشل استدعاء ThunkConnect32/ThunkConnect16 ثم لن يتم تحميل مكتبات الارتباط الحيوي (DLL).
  7. تحقق من DLL 16-بت على XXX_ThunkData16 تصدير بواسطة الكلمة الأساسية RESIDENTNAME في ملف تعريف (.DEF) الوحدة النمطية الخاصة به.
  8. تحقق من makefile الخاص بك يستند إلى Win16 DLL الخاص وضع أن المحول البرمجي المورد هو علامة DLL 4.0. إذا تم وضع علامة أقل من 4.0 ، فإنه لن يتم تحميل وسيفشل thunk.
  9. إذا ترجع الدالة thunk 32-بت إلى 16-بت مؤشر ، تأكد من أن النوع الأساسي هو نفس الحجم على 16-بت و 32-بت جانبي thunk. في حالة اختلاف حجم النوع الأساسي ثم المترجم thunk مشكلات رسالة خطأ توضح ، "لا يمكن إرجاع المؤشرات إلى أنواع غير متطابقة." إحدى الطرق للعمل على حل هذه المشكلة لإرجاع مرجع إلى نوع بيانات مختلف ولكن متوافقاً. على سبيل المثال، لا يمكن إرجاع thunk مؤشر إلى Int لأن Int وحدتي بايت على الجانب 16-بت ولكن وحدات البايت الأربع على الجانب 32-بت. تغيير نوع الإرجاع الخاص thunk من مؤشر إلى Int إلى مؤشر طويلة في البرنامج النصي thunk "و" التعليمات البرمجية المصدر من DLLs Win16 و المستندة إلى Win32.

    إذا قمت بكتابة thunk 16 بت إلى 32-بت الذي يرجع إلى مؤشر, أن المحول البرمجي thunk مشكلات توضح رسالة الخطأ, ""أنواع المؤشر قد لا يتم إرجاع." لا يسمح برنامج التحويل البرمجي thunk thunks 16 بت إلى 32-بت لإرجاع أنواع المؤشرات لأن بمجرد أرجع thunk من دالة 32-بت, المؤشر لا تشير إلى البيانات في مساحة عنوان العملية المستندة إلى Win32 الصحيح. وهذا بسبب استخدام عناوين النطاق نفس مساحات العناوين لكافة العمليات المستندة إلى Win32 وتكون تبديل من سياق preemptively.
  10. في حالة تقارير linker خطأ "unresolved الخارجية" كان الرمز هو اسم دالة تم تدقيق بشكل متناسق خلال كافة التعليمات البرمجية المصدر "و" ملفات تعريف الوحدة النمطية "و" البرنامج النصي thunk تأكد من أن كافة تواجدات النموذج الأولي الخاص به متناسقة. على الجانب Win32 يجب تعريف الدالة thunk مع نوع __stdcall; على الجانب Win16 يجب تعريف الدالة مع نوع PASCAL. في مشاريع C++ ، تأكد من تقوم بتعريف كل من وجهي الدالة thunk وتعريف مع محدد ربط "C" extern بالإضافة إلى __stdcall أو نوع PASCAL.

الدليل trouble-Shooting - بعد التحويل البرمجي مع المحول البرمجي Thunk

بعد التحقق من preliminaries إنشاء thunk DLLs الخاصة بك ثم حاول تشغيلها. إذا أنها تعمل يجب متابعة في الاختبار أخرى للتأكد من أنها حرك متصل بها. في حالة عدم تشغيلها استخدام دليل استكشاف الأخطاء وإصلاحها التالية لتحديد سبب المشكلة وإصلاحها.

فشل ThunkConnect16() في Win16 أو ThunkConnect32() في الجانب Win32:

  1. تشغيل التصحيح إصدارات نظام DLLs. تحتوي إصدارات تصحيح الأخطاء من KERNEL32.DLL KRNL386.EXE على العديد من رسائل التشخيص معرفة لماذا لم تتم تهيئة thunk. لتشغيل إصدارات تصحيح الأخطاء نظام DLLs استخدم رمز "تبديل إلى تصحيح DLLs" في قائمة "ابدأ" ضمن أدوات SDK Win32. استخدام "التبديل إلى تصحيح بدون DLLs" للعودة إلى الإصدار المباع.
  2. تأكد من أن DLL المستندة إلى Win16 استدعاء ThunkConnect16() DLL المستندة إلى Win32 قام استدعاء ThunkConnect32() المطابق. إذا كان أحد هذه مفقود ثم الآخر ستفشل وسيفشل thunk DLLs تحميل.
  3. ضع نقاط التوقف في DLL Win32 DllMain() ثم في DllEntryPoint() DLL Win16 و LibMain() تحميل وظائف لمشاهدة DLLs الذي لا.
إذا كان الاستدعاءات ThunkConnect16() ThunkConnect32() تعمل بشكل صحيح ولكن لا يزال غير thunk ، حان الوقت لتبسيط thunk الخاص بك. التي يمكن فعلياً الهجوم ذلك بطريقتين. عليك أولاً بدء تشغيل بواسطة إزالة المعلمات من thunk واحداً تلو الآخر ترجمة فإنه. أو، ثانياً، إنشاء thunk بسيط يعمل ثم إنشاء حتى تفشل باتباع الخطوات التالية:
  1. إنشاء thunk بسيطة وتنفيذها فقط إلى التأكد من وجود آلية thunk إعداد بشكل صحيح. اختياراً جيداً thunk بسيطة دالة مع أية قيمة الإرجاع و أية معلمات. إذا لم يعمل thunk بسيطة حتى تشغيل من خلال قائمة المبدئي أعلاه تأكد من أن لديك الأشياء إعداد بشكل صحيح. ثم تابع الخطوة 2.
  2. تأكد من الهدف DLL ثم يمكن العثور على أية DLL يعتمد على وإعادة تحميل. إذا كان مفقوداً أو يمكن المُحمل من العثور عليه thunk لن يعمل.
  3. تأكد من عدم القيام DLL شيء ما يتعذر في سياق thunk الهدف الخاص بك.
بمجرد لديك thunk مبسطة يعمل ولكن thunk الحقيقي لم تعمل ، اتبع الخطوات التالية:
  1. إضافة معلمات thunk بسيطة واحد في وقت لتحديد إذا كان يسبب معلمة الفشل. إذا كان أحد تأكد من أن المعلمة هو نوع الأيمن التصريح عن الدالة و تعريف باستخدام نفس رقم وأنواع المعلمات في كلا DLLs وفي المترجم thunk تعريف الدالة PASCAL أو _stdcall.
  2. إذا كان الهدف الخاص بك DLL DLL المستندة إلى Win16 لا يمكن الوصول إلى البيانات الخاصة به عمومية أو ثابتة تأكد من تصدير الدالة بشكل صحيح. إذا استخدمت رمز التبديل /GD مع Visual C++ ، يجب أن تقوم بتعريف ثم بتعريف الدالة بواسطة الكلمة الأساسية __export في التعليمات البرمجية المصدر لـ DLL المستندة إلى Win16. فقط سرد اسم الدالة في ملف تعريف (.DEF) الوحدة النمطية الخاص DLL غير كافية لأنه المحول البرمجي لا معالجة الملف .DEF لذا فإنه لن بإنشاء في prolog وتتطلب رمز epilog تصدير دالات.
  3. إذا استدعاءات LocalAlloc() في الخاص بك الهدف المستندة إلى Win16 DLL السبب حماية عام (GP) الأخطاء، تأكد من أن يتم تصدير الدالة كما هو موضح في الخطوة 2.
  4. إذا تلقيت خطأ GP في KERNEL32 فقط بعد الهدف الخاص بك يستند إلى Win16 بإرجاع ، تأكد من أن تعريف الدالة الهدف وأن تعريف أنه PASCAL. لا يمكن استخدام اصطلاح استدعاء C. على الرغم من الشائع في رمز C أو C++ ولكن احتمال في لغة التجميع تأكد من أن الدالة الهدف لم تعديل تسجيلات DS أو SS BP SI أو DI.
  5. إذا تلقيت خطأ GP في thunk 32-بت الخاص بك DLL أو KERNEL32 مباشرة بعد إرجاع الخاص بك يعمل بنظام Win32 الدالة الهدف تأكد من تعريف دالة الهدف كـ _stdcall لم تعديل تسجيلات DS ES ، FS ، SS ، EBP ، EBX ، ESI أو EDI. يجب أن لا يؤدي رمز C أو C++ التسجيلات إلى تعديل ولكن يجب فيها رمز لغة التجميع بعناية.
  6. إذا كان المستند الخاص بك Win16 إلى الهدف بإرجاع إلى موقع غير صالح تأكد من تعريف وتقوم تعريف أنه FAR. هذا مهم بشكل خاص DLLs طراز صغير; الدالات في DLL متوسطة وطراز كبيرة FAR بشكل افتراضي.
  7. في حالة مواجهة خطأ GP في دالة المستندة إلى Win16 عند الوصول إلى أكثر من 64 كيلو بايت من البيانات من مؤشر تمريره كمعلمة (أي، مؤشر thunked) ، تحتاج إلى تخصيص صفيف محددات المتجانبة كما هو موضح في المقالة التالية في "قاعدة المعارف لـ Microsoft:
    132005DOCERR: لم يكتمل وثائق AllocSelector & FreeSelector
    على الجانب Win16 مؤشرات thunked دوماً تتكون من محدد واحد مع حد 64 ك وهذا يعني أنه لا يمكن استخدامها كـ مؤشرات كبير جداً. نطاق الأصلي بأكمله البيانات عناوين المؤشر قابلة الوصول المستندة إلى Win16 الهدف DLL - ولكن فقط في حالة يقوم بإنشاء صفيف محددات المتجانبة مرجع له وكنت تستخدم متغيرات المؤشر كبير جداً للوصول إلى البيانات.
  8. تأكد من استخدام مؤشر thunked فقط في السياق thunk. يتم تحرير محددات تخصيص من قبل برنامج التحويل البرمجي thunk للاستخدام بواسطة المستندة إلى Win16 أهداف بمجرد إرجاع thunk.
  9. وضع نقاط التوقف في بداية دالات الهدف الخاص بك للتأكد من وراء إليها. إذا كنت, و تم تصحيحه الجانب الهدف بشكل مستقل عن thunk يحدث الخطأ داخل الهدف ، ثم تكون فرص جيدة أن الهدف هو إجراء شيء ما يتم إنجازه في thunk أو الرجوع إلى ذاكرة غير موجود. الرجاء مراجعة الخطوتين 7 و 8.
سريع

تحذير: تمت ترجمة هذه المقالة تلقائيًا

خصائص

رقم الموضوع: 133722 - آخر مراجعة: 01/10/2015 11:00:13 - المراجعة: 2.3

  • Microsoft Platform Software Development Kit-January 2000 Edition
  • kbnosurvey kbarchive kbmt kbhowto kbkernbase kbprogramming KB133722 KbMtar
تعليقات