باستخدام V- جدول Thunks إلى مكالمات إجراءات السلسلة

StackOverflow https://stackoverflow.com/questions/1090755

  •  11-09-2019
  •  | 
  •  

سؤال

كنت أقرأ بعض المقالات على الشبكة فيما يتعلق بالأصمدة Vtable وقرأت في مكان ما يمكن استخدامه على المكالمات لإجراءات الخطاف / السلسلة.

هل هو قابل للتحقيق؟

لا أحد يعرف كيف يعمل ذلك، كما أنني غير قادر على إيجاد مورد جيد يشرح للأصماد. أي اقتراحات لذلك؟

هل كانت مفيدة؟

المحلول

تنفيذ Thunk الخام في أسلوب Table Table Thunks هو منتجع آخر. كل ما تحتاجه لإنجازه يمكن أن يتحقق على الأرجح مع وظيفة التفاف، وسوف يكون أقل إيلاما بكثير.

بشكل عام، thunk يفعل ما يلي:

  1. إصلاح معلمات الإدخال (على سبيل المثال، تحويل إلى تنسيق مختلف)
  2. اتصل بالتنفيذ الحقيقي
  3. تنظيف الخطوة 1 / إصلاح معلمات الإخراج

لرؤية مثال على كيفية عمله، دعنا ننتقل إلى صديقنا الطيب ريموند تشن ومناقشته من الضابط بدقة:

http://blogs.msdn.com/oldnewghing/archive/2004/02/06/68695.aspx.

وكان thunk اعتاد على النحو التالي:

[thunk]:CSample::QueryInterface`adjustor{4}':
  sub     DWORD PTR [esp+4], 4 ; this -= sizeof(lpVtbl)
  jmp     CSample::QueryInterface

كما يصف، لديك فئة تنفذ نفس الأساليب من خلال واجهات متعددة، لذلك لديها جداول V متعددة. (إذا كنت لا تعرف COM، كل ما تحتاج إلى معرفته هو أنه يعمل مع جداول V مباشرة، لذلك يجب أن يحتوي مؤشر إلى واجهة محددة على مؤشرات الوظائف لجميع طرق تلك الواجهة مرتب.)

إذا قمت بتنفيذ واجهتين مع طرق مختلفة في فتحة معينة، فأنت بحاجة إلى جداول V متعددة. ولكن، تكتب فقط الطرق المتداخلة مرة واحدة، بحيث تحتاج الطريقة إلى أن تكون قادرة على العمل مع كل من المؤشرات "هذه". للقيام بذلك، يولد برنامج التحويل البرمجي طريقة تقوم بالإصلاح الضروري ويستدعي التنفيذ الأصلي.

لذلك، هذا Thunk يفعل الخطوات التالية:

  1. إصلاح معلمات الإدخال، وهي مؤشر "هذا" مخفي، في السطر الأول.
  2. اتصل بالتنفيذ الحقيقي في السطر الثاني.
  3. تنظيف: لا شيء مطلوب (انظر أدناه)

هذا هو المكان jmp التعليمات تأتي. عادة، إذا كنت ترغب في استدعاء الوظيفة باستخدام call, ، سيعود إليك، وستحتاج إلى ret العودة إلى المتصل الخاص بك. نظرا لعدم وجود نظف للقيام به، يقوم برنامج التحويل البرمجي بالتحسين حيث يتحرك التنفيذ مباشرة إلى التنفيذ الحقيقي ودعا بيان عائد التنفيذ الحقيقي للعودة إلى لك المتصل. هذه ليست سوى تحسين، وليس جزءا أساسيا من thunking. على سبيل المثال، ستحول Thunks 16/22 بت معلمات الإدخال / الإخراج بين 16 و 32 بتسيا، لذلك لا يمكن تخطي خطوة التنظيف؛ من المفترض ان call, ، ليس jmp.

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

بصراحة، يبدو أنك تسأل عن تحسين الأداء، ومعظم الوقت (1) المترجم هو أفضل في تحسين مما يعتقدون و (2) لن يعطيك كبيرا من التحسن كما تعتقد.

نصائح أخرى

حسنا، تقرأ أن Thunks هي حل، والآن أنت تبحث عن مشكلة في حلها؟

Byunks، عموما، هي مهام قصيرة "إعادة التوجيه" التي توفر تعديلات صغيرة عادة - التعديلات الصغار.

شرح قطع Vtable جيدا ويكيبيديا في اللحظة. يستخدمون النمط المشترك: توليد وظيفة صغيرة لتجنب الحساب / العمل الإضافي في وقت التشغيل.

أماكن أخرى رأيتها / مستعملة Thunks:

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

تأخير تحميل DLLS: thunk يتأكد من تحميل DLL في المرة الأولى التي يتم استدعاء أي وظيفة.

مكالمات واجهة Traping COM: توفر Thunks نقطة حقن للتشخيص، والقفز إلى الطريقة الفعلية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top