PDA

View Full Version : سوال: مانیتور کردن تغییرات سیستم



saate777
سه شنبه 17 شهریور 1388, 12:41 عصر
سلام
بعضی از برنامه ها به محض اینکه یه اتفاقی می افته یه واکنشی نسون میدن مثلا تا به اینترنت وصل میشیم آنتی ویروس متوجه میشه و خودشو آپدیت می کنه و... البته من این سوال رو فقط در مورد خاص اینترنت نمی پرسم و هدفم کلی تره
حالا سوال اینه که چه طور این برنامه ها میتونن این کارو بکنن؟ برای واضح شدن مطلب مثلا یه نفر یه قطعه کد بده که تا یه فایل پاک شد و یا هر تغییر این چنینی دیگه یه پیغام چاپ کنه!
البته واضحه که میشه هر چند ثانیه یکبار چک کرد و هر وقت که این اتفاق افتاد پیغام رو چاپ کنه ولی واضحه این روش چک کردن هر چند وقت اصلا جالب نیست و من نمی خام از این روش استفاده کنم!!( چون اگر بازه زمانی چک کردن رو کوچیک بگیریم اون وقت پردازشگر دائما مشغول چک کردنه _ اگر بزرگ بگیریم اون وقت مثلا در مثال آنتی ویروس ما به اینترنت وصل میشیم سیستم یه ربع بعد چک میکنه ببینه کانکن هست یا نه؟)
یکی می گفت مثلا یه برنامه جدا بنویسی که وطیفش مانیتور کردن این تغییر باشه ! خوب حالا خود اون باید چه جوری متوجه بشه تغییری رخ داده بدون اینکه دائما چک کنه!
مرسی

deopen
سه شنبه 17 شهریور 1388, 13:38 عصر
شما باید از API ها استفاده کنی , برای مثال برنامه زیر وجود یا عدم وجود test.txt در درایو C را چک میکند.


#include <windows.h>
#include <iostream>
using std::cout;

#include "Shlwapi.h"

#include<conio.h>

#pragma comment (lib, "shlwapi")

int main()
{
char bffr[ ] = "C:\\test.txt";
char *ptr;
ptr=bffr;

int result=0;

result=PathFileExistsA(ptr);

cout<<(result?"File Is Valid":"File Is inValid");

getch();

return 0;

}
و برای مانیتور کردن هم باید از حلقه و sleep استفاده کنی که به نظر معقول می آید .

برنامه زیر به مدت 1 دقیقه فایل test را مانیتور میکند.


#include <windows.h>
#include <iostream>
using std::cout;

#include "Shlwapi.h"

#pragma comment (lib, "shlwapi")

void clrscr()
{
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
COORD coord = {0, 0};
DWORD count;

CONSOLE_SCREEN_BUFFER_INFO csbi;
GetConsoleScreenBufferInfo(hStdOut, &csbi);

FillConsoleOutputCharacter(hStdOut, ' ', csbi.dwSize.X * csbi.dwSize.Y, coord, &count);

SetConsoleCursorPosition(hStdOut, coord);
}

int main()
{
char bffr[ ] = "C:\\test.txt";
char *ptr;
ptr=bffr;

int result=0;

for(int i=0;i<60;i++,Sleep(1000),clrscr()) {

result=PathFileExistsA(ptr);

cout<<(result?"File Is Valid":"File Is inValid");

}

return 0;

}

saate777
سه شنبه 17 شهریور 1388, 14:49 عصر
با تشکر از شما دوست گرامی:لبخند:
الگوریتم شما به این صورته که با اون API هر 1 ثانیه یکبار وجود فایل رو چک میکنید اگه خوب دقت میکردید متوجه میشدید که من گفته بودم بدون استفاده از این روش مساله رو حل کنیم

بازم میگم این روش خیلی جالب نیست ! شما زمان دوبار چک کردن متوالی رو 1 ثانیه گذاشتید و یه تابع عملا هر 1 ثانیه یکبار فراخونی میشه حالا فرض کنید تموم نرم افزار های دنیا بخوان از این شیوه برای کارهای مشابه مثل وضعیت اتصال به اینترنت یا ... استفاده کنن اون وقت روی یه سیستم در هر ثانیه چندین تابع فراخونی میشه( برای هر برنامه حداقل یکی ) و این یعنی بالا بردن سربار اضافی و بعد :عصبانی:
خوب اگه بخواهیم فاصله دوبار چک کردنو زیاد بگیریم دقت پایین می آد با توجه به این حرف ها میشه گفت احتمالا از این روش چک کردن مداوم استفاده نمیشه بلکه راه حل یه چیز دیگست؟؟اما چی؟؟...:متفکر:

Saeed_m_Farid
سه شنبه 17 شهریور 1388, 15:07 عصر
با تشکر از شما دوست گرامی:لبخند:
... احتمالا از این روش چک کردن مداوم استفاده نمیشه بلکه راه حل یه چیز دیگست؟؟اما چی؟؟...:متفکر:
بله، یه راه دیگه هست و اونهم API های مرتبط با Hooking در سیستم عامل هستند، که جناب محمد شمس مقاله ای بسیار مفید در این زمینه تو شماره سوم مجله صفحه 89 تالیف کردند. میتونید کاملاً به این مقاله اعتماد کنید.
این مقاله PDF (http://www.codebreakers-journal.com/downloads/cbj/2004/CBJ_1_2_2004_HolyFather_Hooking_Windows_API.pdf)ه م میتونه خیلی کمکتون کنه ...
این کد (http://www.codeproject.com/KB/system/hooksys.aspx)رو هم ببینید بد نیست.
موفق باشید.