السلام عليكم ورحمة الله وبركاته
أريد السؤال عن كيفية أستخدام ملفات dll عن طريق الاسمبلى فى عمل مهمة ما
أقصد اننى أريد عمل برنامج يعرض صور من ال webcam عن طريق الدخول على ملفات التشغيل (Drviers) الخاصه بال webcam وأستخدامها فى البرنامج
شكرا
السلام عليكم ورحمة الله وبركاته
أريد السؤال عن كيفية أستخدام ملفات dll عن طريق الاسمبلى فى عمل مهمة ما
أقصد اننى أريد عمل برنامج يعرض صور من ال webcam عن طريق الدخول على ملفات التشغيل (Drviers) الخاصه بال webcam وأستخدامها فى البرنامج
شكرا
السلام عليكم,
للتعامل مع ملفات DLL الأمر ليس صعبا كما قد نتصوره . فنفترض أن ملف DLL التالي Sample.dll يصدر لنا دالة
DWORD Func(Param1,Param2)
نفترض أن كل البارامترات هي من نوع DWORD فلكي نستعمل هذه الدالة التي هي في ملف DLL ستكون الطريقة كما يلي .
نحمل ملف DLL .
نبحث عن عنوان الدالة التي نريدها.
ندفع البارامترات على الستاك
نستدعي عنوان الدالة.
نفرأ البارامتر المرجوع في الرجستر EAX .
بعد الإنتهاء من DLL نفرغها من الذاكرة.
وبالكود سيكون على الشكل التالي :
.data
TheDll DB "Path\Sample.dll",0
Path هو المسار الموجود فيه DLL وقد نستغني عن هذا إذا كانت موجودة في نفس مسار البرنامج أو في مسار السيستم
TheFunc DB "Func",0
handle DW ?
.code
invoke LoadLibrary,addr TheDll
mov eax,handle
invoke GetProcAddress,handle,addr TheFunc
هنا سيكون عندنا عنوان الدالة في الرجستر EAX
Push Param2
Push Param1
call eax هنا يتم استدعاء الدالة Func
بعد هذا سيكون عندنا ما ترجعه الدالة في الرجستر EAX .
بعد ما ننتهي من DLL نفرغها من الذاكرة :
invoke FreeLibrary,handle
هذا بالنسبة لملفات DLL أما فيما يخص الدرايفرات فهناك طريقة أخرى ولهذا الغرض نستعمل الدالة
BOOL DeviceIoControl( HANDLE hDevice, // handle to device of interest DWORD dwIoControlCode, // control code of operation to perform LPVOID lpInBuffer, // pointer to buffer to supply input data DWORD nInBufferSize, // size, in bytes, of input buffer LPVOID lpOutBuffer, // pointer to buffer to receive output data DWORD nOutBufferSize, // size, in bytes, of output buffer LPDWORD lpBytesReturned, // pointer to variable to receive byte count LPOVERLAPPED lpOverlapped // pointer to structure for asynchronous operation );
هذا بعد تحميل الدرايفر المقصود كما نحمل ملف عادي بواسطة CreateFile وهنا يجب الكثير من الحذر لأن أي خطء بسيط قد نوقف به تشغيل النظام مما سيتوجب إعادة تشغيل الكمبيوتر.ولهذا يجب معرفة ما نريد استدعاؤه داخل الدرايفر كما يجب معرفة ما يطلبه منا من معطيات وكذلك ما وكيف سيعطينا معطياته.
إلى اللقاء.
شكرا على الرد وسوف أجرب هذه الطرق
هذا الموضوع مغلق.