الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف ينفد هدا الكود ؟

بدأه soufianosse في 20 مارس 2010 · 5 رد · 865 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

كتيرا ما اجد هده الصيغة في بعض الاكواد ولا افهمها

متال :

unsigned long addr = 0;

            addr = MAKELONG(i->LowOffset, i->HiOffset);

كيف ان متغير واحد من نوع Long نضع فيه قيمة عنصرين من Structure :mellow:

هو متغير عادي وليس مؤشر على Structure يعني يمكن ان يحمل قيمة واحدة هدا حسب معرفتي

وارجو تفسير هده الصيغة :huh:

#2

لايمكنك معرفة سوى أن الدالة المسماة MAKELONG أو على الأرجح 99% أنها Macro تقوم بعملية Bit-Manipulation. هذه توقعات لا أكثر,

لابد أن توفر الكود لمعرفة ماذا تفعل :)

و رجاءً اذكر أين وجدت هذا الكود, حتى نعرف ماهو سياق الكود, لأن هذا الكود يبدو كأنه لـ Paging System بسيط, يقوم بوضع الـ Frame Number في الـ Most Significant word و عنوان المتغير بالنسبة للـ Page في الـ Least Significant word, لإنتاج Physical Address.

كما قلت لك, يمكن أن يكون أي شيء غير ذلك,

تحياتي...

1
#3

الكود وجدته في احد الكتب التي تتكلم عن الـRootkit وهو عبارة عن كود للوصول الى الـInterrupt Descriptor Table واستعراضه

وكما قلت MAKELONG عبارة عن ماكرو يستقبل متغيرين معرف كالاتي

#define MAKELONG(a, b)

((unsigned long) (((unsigned short) (a)) | ((unsigned long) ((unsigned short) (b)))

<< 16))

لم افهم كيف يعمل هدا الماكرو

هدا مقطع الكود الموجود في الشرح

NTSTATUS DriverEntry(IN PDRIVER_OBJECT theDriverObject,

                     IN PUNICODE_STRING theRegistryPath )

{

      IDTINFO   idt_info;  // this structure is obtained by

                           // calling STORE IDT (sidt)

      IDTENTRY* idt_entries; // and then this pointer is

                             // obtained from idt_info

      unsigned long count;



      // load idt_info

      __asm sidt, idt_info
 idt_entries = (IDTENTRY*)

MAKELONG(idt_info.LowIDTbase,idt_info.HiIDTbase);

      for(count = 0;count <= MAX_IDT_ENTRIES;count++)

      {

            char _t[255];

            IDTENTRY *i = &idt_entries[count];

            unsigned long addr = 0;

            addr = MAKELONG(i->LowOffset, i->HiOffset);



            _snprintf(_t,

                      253,

                   "Interrupt %d: ISR 0x%08X", count, addr);

            DbgPrint(_t);

      }

      return STATUS_SUCCESS;

الكود مفهوم فقط دالك السطر الدي وضعت فوق وكيف يتعامل معه الماكرو MAKELONG

#4

تقوم بوضع أول 16 bit من a في في أول 16 bit داخل addr, و من ثم تضع الـ 16 البت الأخيرة من b في آخر 16 bit في المتغير addr على افتراض أن هذا الكود يعمل على Windows, و حجم long يساوي 32bit و حجم short int يساوي 16bit.

إذا لم تكن تعرف معنى الـ Shifting: >>

فتفضل:

=||= مقدمة حول معاملات الـ Bit لجميع المبرمجين =||=

=||= مقدمة حول معاملات الـ Bit لجميع المبرمجين 2 =||=

تحياتي...

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 20 مارس 2010 في 19:09

1
#5

الماكرو MakeLong يستخدم لدمج رقمين مساحة كل منهم 2 بايت برقم واحد مساحته 4 بايت، إذا كان احد الرقمين الذين يتم تمريرهم داخل الماكرو اكبر من 2 فإنه يتم اخذ اول 2 بايت من الرقم المدخل فقط و بعد هذا يتم دمج الرقمين بإستخدام المعامل or.

الماكرو يمكن كتابته بصيغه اسهل كالتالى (فقط لتسهيل قرائته)

ulong( ulong(ushort(a)) | ulong(ushort(b)) << 16 )

فى المثال المرفق

IDTENTRY *i = &idt_entries[count];

unsigned long addr = 0;

addr = MAKELONG(i->LowOffset, i->HiOffset);

كما ترى المتغير i و هو من نوع IDT Entry يحتوى على المتغيرين LowOffset و HiOffset و اللذان يمثلا رقم بمساحة 4 بايت لذا كل ما يقوم به فى الكود السابق هو دمج الرقمين الموجودين بـ i داخل متغير رقمى واحد و هو addr.

يمكنك الحصول على نفس تأثير الماكرو عن طريق الكود التالى

addr = *(unsigned long*) i;

فقط إن كان ترتيب HiOffset داخل الـ structure يسبق LowOffset.

و الله ولى التوفيق

1

مدونتي: C++ Tips and Tricks

#6

شكرا لكما فهمت الامر الان :happy:

مواضيع مشابهة