JAAS

مثال لإستخدام دوال التزامن والمراقبة

3 ردود في هذا الموضوع

السلام عليكم ورحمة الله ,,,

في هذا المثال سنتعرف على كيفية إستخدام دوال التزامن وهي الدوال التي تبدأ ب Wait

وسنقوم بإستخدام الدالة WaitForMultipleObjects لمراقبة أكثر من حدث في النظام

المثال :

في هذا المثال سنراقب الأحداث المستخدمة في أقراص التخزين وبالتحديد سنراقب القرص d:

وسيقوم البرنامج بمراقبة ثلاث أحداث وهي

إذا قام المستخدم بتغيير إسم أي ملف في القرص d: سيتم إظهار رسالة تخبره بحدوث التغير

إذا قام المستخدم بتغيير مسار أي مجلد ستظهر رسالة

إذا قام المستخدم بالتغيير في حجم القرص , إما بحذف ملف أو إنشاء ملف جديد

سيتم إظهار رسالة , بهذا الشكل

spyDisk.gif

-

هذة هي دالة المراقبة

void SpyDir(void)
{

// بداية دالة المراقبة

DWORD dwWaitStatus;
HANDLE dwChangeHandles[3];


dwChangeHandles[0] = FindFirstChangeNotification(
   "D:\\",                  
   TRUE,                          
   FILE_NOTIFY_CHANGE_FILE_NAME); // مراقبة أي تغيير في أسماء الملفات
if (dwChangeHandles[0] == INVALID_HANDLE_VALUE)
   ExitProcess(GetLastError());


dwChangeHandles[1] = FindFirstChangeNotification(
   "D:\\",                  
   TRUE,                          
   FILE_NOTIFY_CHANGE_DIR_NAME); // مراقبة المجلدات والمسارات
if (dwChangeHandles[1] == INVALID_HANDLE_VALUE)
   ExitProcess(GetLastError());

dwChangeHandles[2] = FindFirstChangeNotification(
   "D:\\",                  
   TRUE,                          
   FILE_NOTIFY_CHANGE_SIZE);  // مراقبة حجم القرص
if (dwChangeHandles[2] == INVALID_HANDLE_VALUE)
   ExitProcess(GetLastError());







while (TRUE)
{


   dwWaitStatus = WaitForMultipleObjects(3, dwChangeHandles,
       FALSE, INFINITE);

if(dwWaitStatus==WAIT_FAILED)
 break;


   switch (dwWaitStatus)
   {
       case WAIT_OBJECT_0:
    MessageBox (NULL,"تم تغيير إسم الملف","SpyDir",MB_OK);
           if ( FindNextChangeNotification(
                   dwChangeHandles[0]) == FALSE )
               ExitProcess(GetLastError());
           break;

       case WAIT_OBJECT_0 + 1:


           ::MessageBox (NULL,"تم تغيير إسم المجلد أو مسارة","SpyDir",MB_OK);
           if (FindNextChangeNotification(
                   dwChangeHandles[1]) == FALSE)
               ExitProcess(GetLastError());
           break;

 case WAIT_OBJECT_0 + 2:


           ::MessageBox (NULL,"تم التغيير في حجم القرص","SpyDir",MB_OK);
 
           if (FindNextChangeNotification(
                   dwChangeHandles[2]) == FALSE)
               ExitProcess(GetLastError());
           break;
       default:
           ExitProcess(GetLastError());
   }
}


::MessageBox (NULL,"تم إنهاء المراقبة","SpyDir",MB_OK);

CloseHandle (dwChangeHandles[0]);
CloseHandle (dwChangeHandles[1]);
CloseHandle (dwChangeHandles[2]);

TerminateThread(GetCurrentThread (),0);
}

-

وبهذا فإن الأفكار كثيرة في هذا المجال

فمثلاً لمعرفة الحدث , إما حذف ملف أو إنشاء ملف

تستطيع تخزين حجم القرص قبل عملية المراقبة , إذا زاد الحجم معنا ذلك إنشاء وإذا نقص معناة حذف

وتستطيع تحديد الملف الذي تم تغيير إسمة أو إنشائة عن طريق التاريخ ( تاريخ الإنشاء وتاريخ آخر تعديل )

وتلاحظ في مثالنا , عندما نقوم بحذف ملف تظهر أكثر من رسالة تدل على التغيير وبعد ذلك الحذف

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

وبالتأكيد نفس هذة الطريقة تستخدم لمراقبة سجل النظام الريجستري لمعرفة أي تغيير

---------

المهم تجد مثالنا والشفرة المصدرية في الملف المرفق ,

وبالتوفيق ,,

SpyDir.zip

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

كيف يمكن مراقبة إن تم الكتابة على الملفات و هل هناك دوال اخرى لها نفس العمل،كيف يتم مراقبة المنافذ و التخكم فيها

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .