سؤال

كنت أحاول تشغيل بعض برامج التشغيل المشفرة لـ 32 بت Vista (x86) على 64 بت Win7 (AMD64) ولم يكن قيد التشغيل. بعد الكثير من التصحيح ، والضرب والتحريك ، قمت بالعمل على هذا الأخير ، لكنني لا أعرف سبب عمله. وهذا هو ما فعلته:

في العديد من الأماكن ، أشارت المؤشرات العازلة إلى مجموعة من الهياكل (مختلفة في أماكن مختلفة) ، وإلى زيادة لها ، في بعض الأماكن تم استخدام هذا النوع من البيان:

ptr = (PVOID)((PCHAR)ptr + offset);

وفي بعض الأماكن:

ptr = (PVOID)((ULONG)ptr + offset);

كان الثاني الذي كان يعيد القمامة ، لذلك قمت بتغييرها جميعًا إلى الأول. لكنني وجدت العديد من عينة برامج التشغيل على الشبكة بعد الثانية. أسئلتي:

  1. أين يتم تعريف هذه الماكرو (لم تساعد Google كثيرًا)؟
  2. أفهم أن جميع وحدات الماكرو P_ هي مؤشرات ، لماذا تم إلقاء مؤشر على Ulong؟ كيف يعمل هذا على 32 بت؟
  3. من الواضح أن PCHAR يغير العرض وفقًا للبيئة. هل تعرف أي مكان للعثور على وثائق لهذا؟
هل كانت مفيدة؟

المحلول

  1. يجب تعريفها في Winnt.h (فهي في SDK ؛ ليس لديك DDK في متناول اليد)
  2. أولونج غير موقعة طويلة. على نظام 32 بت ، هذا هو حجم المؤشر. لذلك يمكن تحويل المؤشر ذهابًا وإيابًا إلى Ulong دون خسارة - ولكن ليس كذلك على نظام 64 بت (حيث سيؤدي إلقاء القيمة إلى اقتطاعها). يلقي الناس إلى Ulong للحصول على حساب مؤشر البايت (على الرغم من أن هذا له سلوك غير محدد ، كما اكتشفت)
  3. المؤشر الحسابي يعمل دائمًا في وحدات من النوع الأساسي ، أي في chars for pchar ؛ هذا يعادل الحساب البايت
  4. يجب على أي كتاب C توضيح الدلالات الدقيقة للحساب المؤشر.

نصائح أخرى

السبب في فشل هذا الرمز في 64 بت هو أنه يلقي مؤشرات إلى Ulong. Ulong هي قيمة 32 بت بينما تكون المؤشرات على 64 بت قيم 64 بت. لذلك سوف تقطع المؤشر كلما استخدمت فريق Ulong.

يلقي PCHAR ، على افتراض أن PCHAR يتم تعريفه على أنه char * على ما يرام ، شريطة أن تكون القصد هو زيادة المؤشر بعدد صريح من البايتات.

كلا الماكرو لهما نفس النية ولكن واحدة منها فقط صالحة حيث تكون المؤشرات أكبر من 32 بت.

المؤشر الحسابي يعمل مثل هذا. اذا كنت تمتلك:

T *p;

وانت كذلك:

p + n;

(حيث يكون n رقمًا) ، ستتغير قيمة P n * sizeof(T).

لإعطاء مثال ملموس ، إذا كان لديك مؤشر إلى DWORD:

DWORD *pdw = &some_dword_in_memory;

وتضيف واحدة إليها:

pdw = pdw + 1;

ثم سوف تشير إلى DWORD التالية. سوف يزداد العنوان PDW نقاط إلى sizeof(DWORD), ، أي 4 بايت.

تستخدم وحدات الماكرو التي تذكرها لتلقي الإزاحة التي تنطبق عليها العنوان أنها مضروبة في كميات مختلفة. لا يتم ذلك عادة إلا في رمز منخفض المستوى والذي تم تمريره بايت (أو char أو void) عازلة ولكن يعرف البيانات الموجودة بداخلها هو نوع آخر.

ULONG تم تعريفه في Windef.h في Windows SDK وهو دائمًا 32 بت ، لذلك عندما تقوم بإلقاء مؤشر 64 بت في ULONG يمكنك اقتطاع المؤشر إلى 32 بت.

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