کار با Process ها در API

24 12 2008

سلام، شاید براتون پیش اومده باشه که ویروسی Task Manager شما رو غیر فعال کرده باشه و حتی اجازه دسترسی به Registry ویندوز رو هم ازتون گرفته باشه که نتونین از طریق Registry اونو مجدد فعال کنید. ایده ی این نمونه برنامه هم از این نشعت می گیره که، چند روز پیش ویروسی سیستمم رو آلوده کرد و همانطور که بالا بهش اشاره کردم Task Manager مو هم غیر فعال . مجبور شدم از نرم افزار Process Explorer استفاده کنم تا Process ویروس رو KILL کنم. نهایتا تصمیم گرفتم تا خودم برنامه ای مانند این نرم افزار یا حداقل Task Manager ویندوز بنویسم تا در مواقع ضروری بتونم ازش استفاده کنم ( چون اعتقاد دارم هر برنامه نویس باید خودش نیاز های نرم افزاریشو رفع کنه ).

نمونه در �ال اجرا

نمونه در حال اجرا

بریم سر اصل مطلب و به توضیح نحوه کار نرم افزار بپردازیم، روند کار بدین صورته که ابتدا باید ProcessID تمامی process های در حال اجرا بر روی سیستم رو با استفاده از تابع EnumProcesses بدست بیاریم این تابع یک آرایه از نوع DWORD رو گرفته و پس از اجرا ID ی پروسس های در حال اجرا رو درون آرایه قرار میده.

//------/ Buffer
DWORD dwProcessIDs[1024];
//------/ Enumerate all system processes
EnumProcesses(dwProcessIDs, sizeof(dwProcessIDs), &dwNeeded);

خوب پس از استخراج id  ی هر process، باید Handle پروسس رو با استفاده از id اون بدست بیاریم این کار رو با استفاده از تابع OpenProcess انجام میدیم، وظیفه این تابع برگرداندن Handle یک process با استفاده از id اونه.

//-----/ Open process by process id and get the process handle
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
FALSE, dwProcessIDs[i]);

در ادامه برای اینکه بتونیم نام process مورد نظرمون رو بدست بیاریم به دو تابع دیگه نیاز داریم که یکی برای بدست آوردن Module Handle و دیگری برای گرفتن نام پروسس مورد نظر هستش، که این توابع به ترتیب عبارتند از EnumProcessModules که با گرفتن Process Handle ، میتونه Module Handle رو بر گردونه و دیگری با گرفتن Module Handle نام پروسس رو برمی گردونه.

//-----/ Enumerate each process module
//-----/ then we able to retrieve module name Like EXPLORER.EXE
EnumProcessModules(hProcess, &hModule, sizeof(hModule), &dwCbNeeded);
//-----/ Get module name by process handle and module handle
GetModuleBaseName(hProcess, hModule, szProcessName, sizeof(szProcessName) / sizeof(TCHAR));

خوب در ادامه برای اینکه بتونیم اطلاعاتی در مورد میزان استفاده process از حافظه رو بدست بیاریم باید از تابع GetProcessMemoryInfo این تابع با استفاده از Process Handle ی که در دست داریم یک Struct رو با نام PROCESS_MEMORY_COUNTERS پر می کنه که حاوی اطلاعات مختلفی در رابطه با میزان استفاده process از حافظه است.

//-----/ Process memory information
PROCESS_MEMORY_COUNTERS pmc;
//-----/ Get process memory usage information
//-----/ We need just memory usage by getting PeakWorkingSetSize field of struct
//-----/ ATTENTION : All size fields in the structure calculate as Byte
GetProcessMemoryInfo(hProcess, &pmc, sizeof(pmc));

از اونجایی که ما فقط می خواهیم Memory Usage رو در لیستمون نشون بدیم فقط از فیلد PeakWorkingSetSize این struct استفاده می کنیم.

در پست های بعدی در دارستای تکمیل این نرم افزار نحوه بدست آوردن آدرس یک ماژول و تعداد Handle ها ، Kill و Terminate کردن یک پروسس رو براتون توضیح میدم. پس منتظر پست های بعدی باشید. طبق معمول توضیحات کاملتر همراه با سورس نرم افزار هستش که می تونه بیشتر در یادگیری مطلب کمکتون کنه.

نکته : همراه سورس برنامه دو فایل در پوشه lib وجود داره در صورت کامپایل اون دو فایل رو با استفاده از Drag & Drop به پروژه تون اضافه کنید

برای دانلود سورس کامل برنامه اینجا را کلیک کنید.


کارها

Information

2 responses

19 03 2009
نیوشا

سلام
شما میتونید برنامه ی بازی ماروپله رو برام میل کنید فقط باید با توابع باشه و اصلا
آرایه نداشته باشه اگه میتونید بهم میل کنید تا توضیحاتشو براتون میل کنم!

25 04 2009
mahsa

#include
#include»stdafx.h»
#include
#define Max 30
class Sparse;
class string;

class SparseNode
{
int row, col;
float value;
friend class Sparse;
};

class Sparse
{
int Row, Col, Terms;
SparseNode Data[Max];
public:
void ReadSparse( void );
void WriteSparse( void );
void WriteMatrix( void );
void AddSparse( Sparse a, Sparse b );
};

void Sparse :: ReadSparse( void )
{
int i=0;
cout<<«Lotfan Ettelaat Zir Ra Dar Mored Matrise Sparse Vared Konid:»;
cout<< «Tadade Satrha:»<> Row;
cout << «Tedade Sotoonha:»<> Col;

cout << » Tedade Anasore Gheyre Sefr : «<> Terms;
if( Terms > ( Row * Col ) || Terms < 0 )
cout << «*****EROR*******»<<endl;

while( i < Terms )
{
cout << » Shomarehye Satr Va Sotoone Onsore »
<< ( i + 1 )
<< «Ra Vared Konid :»<> Data[i].row>> Data[i].col;
if( Data[i].row > Row || Data[i].col > Col || Data[i].row < 1 || Data[i].col < 1 )
cout << «*****EROR*****»<<endl;
else
{
cout << «Lotfan Meghdar Onsor Ra Vared Konid : «<> Data[i].value;
i++;
}
}

}

void Sparse :: WriteSparse( void )
{
int i;
cout << » Moshakhkhasat Matris Be Soorate Zir Ast :»
<<endl<<» Tedade Satrha = »
<< Row
<<endl<<» Tedade Sotoonha = »
<< Col
<<endl<<«Tedade Anasore Gheyre Sefr = »
<< Terms
<< endl<<«Liste Anasor Gheyre Sefre Matris Be Sharhe Zir Ast :»<<endl;
<< «Satr\tSotoon\tMeghdar\n»;
for( i = 0; i < Terms; i++ )
cout << Data[i].row
<< «\t»
<< Data[i].col
<< «\t»
<< Data[i].value
<< endl;
}
/*********************************************************/
void Sparse :: WriteMatrix( void )
{
int i, j;
float Matrix[Max][Max] = {0};
cout <<endl<<«Matrix:»<<endl;
for( i = 0; i < Terms; i++ )
Matrix[Data[i].row-1][Data[i].col-1] = Data[i].value;
for( i = 0; i <= Col; i++ )
cout << «[» << ( i ) << «]\t»;
for( i = 0; i < Row; i++ )
{
cout << «\n\n»
<< «[» << ( i+1 ) << «]»;
for( j = 0; j < Col; j++ )
{
cout << «\t»
<< Matrix[i][j];
}
}
}
/*********************************************************/
void Sparse :: AddSparse( Sparse a, Sparse b )
{
int i, j, k;
i = j = k = 0;
if( a.Row != b.Row || a.Col != b.Col )
cout <<«*****EROR*****»<<endl;
Row = a.Row;
Col = a.Col;
while( i < a.Terms && j < b.Terms )
{
if( a.Data[i].row < b.Data[j].row || ( a.Data[i].row == b.Data[j].row && a.Data[i].col b.Data[j].row || ( a.Data[i].row == b.Data[j].row && a.Data[i].col > b.Data[j].col ) )
{
Data[k].row = b.Data[j].row;
Data[k].col = b.Data[j].col;
Data[k++].value = b.Data[j++].value;
}
else if( a.Data[i].value + b.Data[j].value )
{
Data[k].row = a.Data[i].row;
Data[k].col = a.Data[i].col;
Data[k++].value = a.Data[i++].value + b.Data[j++].value;
}
else
{
i++;
j++;
}
}
while( i < a.Terms )
{
Data[k].row = a.Data[i].row;
Data[k].col = a.Data[i].col;
Data[k++].value = a.Data[i++].value;
}
while( j < b.Terms )
{
Data[k].row = b.Data[j].row;
Data[k].col = b.Data[j].col;
Data[k++].value = b.Data[j++].value;
}
Terms = k;
}

int main()
{
Sparse a, b, c;
a.ReadSparse();
a.WriteSparse();

b.ReadSparse();
b.WriteSparse();
c.AddSparse(a,b);
cout << «\n\nAnswer Is : «;
c.WriteSparse();
getch();
return 0;

}

اشکال این برنامه چیه؟؟توروخدا کمک کنید

برای نیوشا پاسخی بگذارید لغو پاسخ