السلام عليكم ورحمة الله ,,,
في هذا المثال سنتعرف على كيفية إستخدام دوال التزامن وهي الدوال التي تبدأ ب Wait
وسنقوم بإستخدام الدالة WaitForMultipleObjects لمراقبة أكثر من حدث في النظام
المثال :
في هذا المثال سنراقب الأحداث المستخدمة في أقراص التخزين وبالتحديد سنراقب القرص d:
وسيقوم البرنامج بمراقبة ثلاث أحداث وهي
إذا قام المستخدم بتغيير إسم أي ملف في القرص d: سيتم إظهار رسالة تخبره بحدوث التغير
إذا قام المستخدم بتغيير مسار أي مجلد ستظهر رسالة
إذا قام المستخدم بالتغيير في حجم القرص , إما بحذف ملف أو إنشاء ملف جديد
سيتم إظهار رسالة , بهذا الشكل

-
هذة هي دالة المراقبة
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);
}-
وبهذا فإن الأفكار كثيرة في هذا المجال
فمثلاً لمعرفة الحدث , إما حذف ملف أو إنشاء ملف
تستطيع تخزين حجم القرص قبل عملية المراقبة , إذا زاد الحجم معنا ذلك إنشاء وإذا نقص معناة حذف
وتستطيع تحديد الملف الذي تم تغيير إسمة أو إنشائة عن طريق التاريخ ( تاريخ الإنشاء وتاريخ آخر تعديل )
وتلاحظ في مثالنا , عندما نقوم بحذف ملف تظهر أكثر من رسالة تدل على التغيير وبعد ذلك الحذف
والسبب : عندما تقوم بحذف ملف فإن النظام يقوم بنقل االملف إلى سلة المحذوفات ولذلك تظهر الرسالة الأولى
وبالتأكيد نفس هذة الطريقة تستخدم لمراقبة سجل النظام الريجستري لمعرفة أي تغيير
---------
المهم تجد مثالنا والشفرة المصدرية في الملف المرفق ,
وبالتوفيق ,,