كيفية استبدال استدعاءات وظائف WinAPI في مشروع MS VC++ بالتنفيذ الخاص بي (مجموعة الاسم والمعلمات متماثلة)؟

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

  •  09-06-2019
  •  | 
  •  

سؤال

أحتاج إلى استبدال جميع مكالمات WinAPI الخاصة بملف

  • إنشاء ملف،
  • إقرا الملف،
  • سيتفيليبوينتر,
  • CloseHandle

من خلال التنفيذ الخاص بي (الذي يستخدم قراءة الملفات ذات المستوى المنخفض عبر البلوتوث).الكود، حيث سيتم استبدال الوظائف، هو Video File Player وهو يعمل بالفعل مع ملفات الأقراص الصلبة العادية.من الضروري أيضًا أن يظل مشغل الفيديو قادرًا على تشغيل الملفات من محرك الأقراص الثابتة، إذا كان الملف الموجود في إدخال VideoPlayer عبارة عن ملف محرك أقراص ثابت عادي.

ما هي أفضل الممارسات لمثل هذه المهمة؟

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

المحلول

أقترح عليك اتباع الخطوات التالية:

  1. اكتب مجموعة من وظائف الغلاف، على سبيل المثال MyCreateFile وMyReadFile وما إلى ذلك، والتي تقوم في البداية باستدعاء واجهة برمجة التطبيقات المقابلة وتمرير نفس الوسائط بدون تعديل.
  2. استخدم محرر النصوص الخاص بك للبحث عن جميع الاستدعاءات إلى واجهات برمجة التطبيقات الأصلية، واستبدلها باستدعاءات لوظائف المجمّع الجديدة.
  3. اختبار أن التطبيق لا يزال يعمل بشكل صحيح.
  4. قم بتعديل وظائف المجمع لتناسب أغراضك الخاصة.

لاحظ أن CreateFile هو ماكرو يتم توسيعه إما إلى CreateFileW أو CreateFileA، اعتمادًا على ما إذا كان قد تم تعريف UNICODE أم لا.فكر في استخدام LPCTSTR و وظائف تشهار بحيث يمكن إنشاء التطبيق الخاص بك إما ANSI أو Unicode.

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

نصائح أخرى

يمكنك فقط كتابة وظائفك الجديدة في مساحة اسم مخصصة.على سبيل المثال

namespace Bluetooth
{
  void CreateFile(/*params*/);
  void etc...
}

ثم في الكود الخاص بك، الشيء الوحيد الذي يجب عليك تغييره هو:

if (::CreateFile(...))
{
}

ل

if (Bluetooth::CreateFile(...))
{
}

سهل!:)

إذا كنت تحاول اعتراض المكالمات إلى واجهات برمجة التطبيقات هذه من تطبيق آخر، ففكر في ذلك المنعطفات.

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

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

هذا أمر خطير، ولكن إذا كنت حذرا يمكنك جعله يعمل.تحقق أيضا انعطافات مايكروسوفت, ، والذي يفعل نفس الشيء ولكنه لا يتطلب منك العبث بالتصحيح الفعلي.

إذا كنت تريد حقًا اختطاف واجهة برمجة التطبيقات (API)، فانظر إلى syringe.dll (L-GPL).

لا أعتقد أن هذه أفضل ممارسة ولكنها يجب أن تعمل إذا قمت بوضعها في ملف تضمين مضمن في كل مكان تسمى الوظيفة التي تريد تغييرها:

#define CreateFile MyCreateFile

HRESULT MyCreateFile(whatever the params are);

يبدو تنفيذ MyCreateFile كما يلي:

#undef CreateFile
HRESULT MyCreateFile(NobodyCanRememberParamListsLikeThat params)
{
    if (InputIsNormalFile())
        CreateFile(params);
    else
        // do your thing
}

أنت تقوم بشكل أساسي بإجراء كل استدعاء لـ CreateFile على استدعاء MyCreateFile حيث يمكنك تحديد ما إذا كنت تريد استخدام التطبيق الخاص بك أو التطبيق الأصلي.

تنصل:أعتقد أن القيام بهذا أمر قبيح ولن أفعله.أفضل البحث واستبدال جميع الأحداث أو شيء من هذا القبيل.

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