السلام عليكم,
سنبدأ هنا بإذن الله بسلسة لبرمجة VXD .
إن نضام INTEL المحروس Protected Mode يعمل على 4 حلقات RINGS من 0 إلى 3 وحلقة 0 لها جميع الإمتيازات وهذه تنخفض كلما اتجهنا نحو 3 وأن جميع برامجنا تعمل في هده الحلقة الأخيرة ذات الإمتيازات القليلة ونضام التشغيل يعمل في الحلقة 0 . والرغبة من هذا أن لا يختلط النضام ببقية البرامج حتى لا تتمكن من العبث فيه وحتى يبقى هو سيد المواقف فهذه الحراسة التي نتكلم عنها في Protected Mode بخلاصة ,علما أن برنامجا ما في حلقة ما لا يمكنه أن يرى ما يقع في حلقة ذات امتيازات أكبر منه أو على الأقل مباشرة.
إن برامج VxD تعتبر كصلة وصل بين البرنامج وأدوات الكمبيوتر كالشاشة أو الكايبورد مثلا .بما أن نضام الوندوز هو متعدد المهام Multi Task فهو يمنع على البرامج أن تتصل مباشرة مع الأدوات لأنه ستقع فوضى بين البرامج فتصوروا أن برنامجين يكتبان على الشاشة في نفس الوقت. ولهذا فأهمية VXD هي أن يعطي للبرامج أداة خيالية ويجعل البرامج تتعامل معها وكأنها تتعامل مع الأداة مباشرة وهكذا يكون الكل مسرورا.وحين نجعل العلاقة بين VXD وأدوات الكمبيوتر هذا الأمر قد يفزعنا ويخيفنا وكثيرا ما نقول مالي وما الأدواة فهذا شيء لا يهمني وكثيرا من الناس يهربون عن هذا النوع من البرمجة لسماع هذا. ولكن اسمحوا لي أن أقول لكم أنه يمكن أن نبرمج VXD ولا تكون له أي علاقة مع أي أداة للكمبيوتر وقد نعتبره ببساطة كبرنامج عادي لكنه يشتغل في حلقة كل الإمتيازات وهذا قد يعطي أفكارا وبرامج جديدة بالنسبة للذين لا يحبوا القيود.
فكأمثلة للبرامج يمكن أن نصنع برامج تقرأ أو تكتب على الفلوبي أو القرص الصلب Sector by sector يمكن أن نحمي ملفا ما من فتحه أو حذفه أو عمل كلمة سر عليه وكما يمكن أن نتحكم في كل ما يرسل أو يستقبل على النت مثلا واللائحة طويلة.
والتواصل مع VXD يتم على 3 أشكال:
Services وهذا يعني أن بعض VXD تمنح بعض الخدمات التي يمكن للآخرين استعمالها وهذا يمكن أن نعتبره مثل الدوال التي تمنحها بعض DLL .
Control Messages إن النضام يرسل لجميع VXD في الذاكرة رسائل عندما تستدعي الضرورة لذلك وقد نعتبر هذا مثل الرسائل التي ترسلها وندوز للبرامج فمثلا النضام يرسل رسالة DEVICE_INIT حين يحمل VXD ويبدأ Initialization ورسالة CREATE_VM حين نفتح نافذة دوس جديدة SYSTEM_EXIT حين تنتهي الوندوز وغيرها ويمكن أن نتعرف على مجموعها في ملف المساعدة ل DDK .
CALLBACK وهي دوال يمكن ل VXD الآخرين استدعاءها مثل إذا عملنا HOOK لشيء ما كمثال.
ويجب أن نعرف أن هناك نوعان من VXD : Static and Dynamic .
Static يتحمل في بداية تشغيل الكمبيوترويبقى حتى النهاية.
Dynamic يمكن أن نحمله أي وقت نريد وإزالته من الذاكرة حين لا تكون لنا به حاجة.
وفي أمثلتنا سنستعمل هذا النوع الأخير لأنه عملي ولا يتطلب كل مرة نريد تجربته إعادة التشغيل وليس بينهم فرق كبير عدا في التحميل و Initialization.ولتحميل VXD إلى الذاكرة هناك عدة طرق مختلفة : يمكن أن نضعه في مجلد السيستم للوندوز ونضيف اسمه في خانة 386Enh في ملف System.ini كما يمكن أن نستعمل الرجستر أو نعطيه اسم موجود في VMM32 ونضعه في نفس المجلد وغالبا ما نستعمل اسم ebios لأن هذا VXD قد لا يضر عدم وجوده.على العموم الآن لا تهمنا هذه الطرق فكثير من الأحيان تستعمل هذه حتى نخفي ملفنا وخاصة إذا كان فيروسا مثلا.في أمثلتنا سنحمله ونزيله يدويا ولهذا يجب أن نبرمج برنامجا ليعمل هذا. ولتحميل VXD نستعمل API التالية :CreateFile وهذه تستعمل لأغراض كثيرة ومن بينها تحميل Dynamic VXD إلى الذاكرة وهي تتطلب Parameter كثير لكن يمكن أن نستعملها كما يلي وتقريبا في جميع الحالات :
HANDLE hvxd=CreateFile(\\.\VxdName,0,0,0,0,FILE_FLAG_DELETE_ON_CLOSE,0)
Hvxd سيكون هو هاندل ل VXD الذي حملناه ويمكننا استعمال هذا للتواصل معه وإذا لم يكن هناك أي خطء.
VxdName هو اسم VXD الذي نريد تحميله ويجب إضافة BackSlash وبما أن في س++ الباك سلاش له عمل خاص فسنكتبه كما يلي \\\\.\\VxdName
كل Parameters الأخرى يمكن أن لا نستعملها أما البارامتر FILE_FLAG_DELETE_ON_CLOSE هذا سيفيدنا لأنه سيمكن من إزالة VXD من الذاكرة حين نغلق الهاندل الخاص به وهذه ستكون طريقتنا لإزالة برنامجنا سنغلق الهاندل باستعمال API التالية : CloseHandle(hvxd)
وفي الملف المرفق قد وضعت برنامجا يقوم بهذا.
والآن سندخل في الموضوع وسنبدأ بمثال أضن أن الكل يبتدأ به وهو إضهار MessageBox .
ولأجل هذا سنتتبع الخطوات التالية :
نذهب إلى NumegaDriverStudio à VtoolsD à QuickVxd
ستضهر لنا نافذة فيها عدة خانات :
في خانة DeviceParameters في خانة DeviceName نعطيه اسم ل VXD الذي نريده وأعطيت CHIK في الملف المرفق. خانة س++ ستكون مختارة ونختار أيضا Dynamically Loadable لأن برنامجنا سيكون ديناميكي كما قلنا سابقا.
في خانة Windows 95 Control Messages هنا نختار الرسائل التي نريد لبرنامجنا أن يعالجها نختار SYS_DYNAMICDEVICE_INT و SYS_DYNAMIC_DEVICE_EXIT ماذا يعني هذا أننا أو أن برنامج NumegaStudio سيهيء لنا هياكل لدوال ستستقبل هذين الرسالتين فكما قلنا DEVICE_INT هي عند تحميل البرنامج وهنا فيه SYS_DYNAMIC لأن البرنامج ديناميكي والرسالة الأخرى وكما يدل عليها اسمها حين يتم إزالة البرنامج.
في خانة Output Files نختار المجلد أو المسار الذي سنضع فيه الملفات التي سيعطيها لنا ثم ننقر Generate .
نلاحض أنه عندنا الآن ملف cpp ملف h وملف make نفتح فيجوال س++ ونختار Open Work space ونحرس أن نختار MAK في لائحة الملفات التي نريد فتحها بعد هذا سيطلب منا أن نختار مشروع إلى آخره ننقر كل مرة بالقبول وبعد هذا سيضهر المشروع ولكن فارغ من الملفات وسنعمل ما يلي:
في الفجوال س++ نقوم ب : Project à add to project à files ونختار الملف cpp والملف h لينضافا إلى مشروعنا وفيه سنرى أنه عندنا هيكل للدالة OnSysDynamicDeviceInit() وهي الدالة التي ستشتغل عند تحميل VXD والأخرى OnSysDynamicDeviceExit() التي ستشتغل عند النهاية. ما نريد من برنامجنا هو أن يعطينا MessageBox عند البداية والنهاية ولهذا يجب علينا أن نكتب الكود الخاص بهذا في هذين الدالتين وللتذكير فهما الدالتان التي سبق واخترناهم عند بداية صنع هيكل VXD .
كل ما يلزمنا الآن هو كيف نبرمج MessageBox.
نفتح ملف المساعدة الذي في مجلد VtoolsD وفي قائمة Index نكتب shell_message فهذا هو Service الذي سنستعمله ليعطينا MessageBox وهي كالتالي:
EVENTHANDLE __stdcall dSHELL_Message(
VMHANDLE hVM,
DWORD Flags,
CONST CHAR * Message,
CONST CHAR * Caption,
CONST VOID * Callback,
CONST VOID * Refdata,
PSHELLMessage_THUNK pThunk
);
Hvm هو هاندل ل Virtual Machine أو System machine وهذا سنحصل عليه باستعمال الخدمة :
VMHANDLE hand=Get_Sys_VM_Handle(); هذا يعطينا system virtual machine وكما يمكن أن نستعمل Get_Cur_VM_Handle لنحصل على الآلة الخيالية الحالية
flags هي نوع MessageBox الذي نريده وهي نفس الأنواع في برامج الوندوز
Message هي الرسالة التي نريد إضهارها
Caption هي عنوان MessageBox
Callback هي الدالة التي نحتاجها إذا أردنا أن نعالج رد المستعمل على MessageBox وسنأخذها صفر لأنه لا يهمنا الرد.
RefData هي معطيات إضافية يمكن أرسالها إلى دالة Callback سنأخذه 0 لأنه لم نستعمل الدالة السابقة.
الأخير لا أعرفه فهو ليس في الأصل وربما هو إضافة من Numega لأن في DDK فإن هذه الخدمة لها 6 بارامتر وعلى العموم هي تعمل ب 0 .
بعد ما نكتب دوالنا ونبني البرنامج وإذا تم الكل بخير فسنحصل على ملف VXD
لكي نشغله نشغل البرنامج VxdLoader المرفق هنا ننقر على OpenLoad ونختار ملفنا وبعد هذا ستضهر لنا MessageBox الأولى الموجودة في Initialiazation .يمكن أن نستعمل البرنامج VxdViewer الذي يكون مع VtoolsD هذا البرنامج يضهر كل VXDفي الذاكرة لنتأكد أن ملفنا موجود بين البقية وحين نريد إزالته ننقر Unload وهنا تضهر MessageBox الثانية. لا نستعمل Send IOPARAM سنرى فائدته فيما بعد.
لكي نتمكن من Debugg لبرنامجنا يمكن أن نضيف السطر _asm int 3 ; في السطر الذي نريد أن نتوقف عنده وفي Softice نكتب ما يلي : I3HERE ON هذا يعني التوقف عند كل int 3 .
في انتضار كل الآراء والإقتراحات وسأكون إن شاء الله في الخدمة إدا كان فيه أي سؤال.
إلى اللقاء.
