Post date: Nov 28, 2013 1:12:36 AM
سلام
در این پست، برنامهای برای نمایش و توقف processهای در حال اجرا در ویندوز بررسی میشود. برنامه این است:
#include <conio.h>
#include <string>
#include <iostream>
#include <vector>
#include <map>
#include <iomanip>
using namespace std;
#undef UNICODE
#define UNICODE
#include <windows.h>
#include <psapi.h>
#pragma comment(lib,"psapi.lib")
void ToLower(wstring& wstr)
{ unsigned len = wstr.length();
for(unsigned i = 0; i < len; i++)
{
if(L'A' <= wstr[i] && wstr[i] <= L'Z')
wstr[i] = wstr[i] + L'a' - L'A';
}
}inline bool Priv(bool enable_privilege = true)
{ char* privilege_name = "SeDebugPrivilege";
HANDLE current_process = GetCurrentProcess();
HANDLE process_token;
if(!OpenProcessToken(current_process,
TOKEN_ADJUST_PRIVILEGES,
&process_token))
{
return false;
}
TOKEN_PRIVILEGES tp;
LUID luid;
if
(
!LookupPrivilegeValueA
(
0, // lookup privilege on local system
privilege_name,
&luid
)
)
{
CloseHandle(process_token);
return false;
}
tp.PrivilegeCount = 1;
tp.Privileges -> Luid = luid;
if(enable_privilege)
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
else
tp.Privileges[0].Attributes = 0;
if
(
!AdjustTokenPrivileges
(
process_token,
0,
&tp,
sizeof(TOKEN_PRIVILEGES),
0,
0
)
)
{
CloseHandle(process_token);
return false;
}
CloseHandle(process_token);
return true;
}inline void Suicide()
{ HANDLE current_process = GetCurrentProcess();
unsigned long exit_code;
if(!GetExitCodeProcess(current_process,&exit_code))
exit_code = 0;
ExitProcess(exit_code);
}class Processes
{ unsigned number_of_processes;
vector<wstring> names;
vector<unsigned long> ids;
void Add(unsigned long process_id)
{
wchar_t name[MAX_PATH] = L"";
void* han = OpenProcess
(
PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
FALSE,
process_id
);
if(han == 0)
{
names.push_back(L"Access Denied");
return;
}
HINSTANCE hmod;
unsigned long number_of_bytes_filled;
int res = EnumProcessModules
(
han,
&hmod,
sizeof hmod,
&number_of_bytes_filled
);
if(res == 0)
{
names.push_back(L"Name was not retrieved");
return;
}
GetModuleBaseNameW(han,hmod,name,sizeof name);
for(unsigned i = 0; name[i]; i++)
name[i] = tolower(name[i]);
names.push_back(name);
CloseHandle(han);
}
void Fill()
{
unsigned long process_id_array[1024];
unsigned long number_of_bytes_filled;
int success = EnumProcesses
(
process_id_array,
sizeof process_id_array,
&number_of_bytes_filled
);
if(success == 0)
return;
number_of_processes =
number_of_bytes_filled / sizeof(unsigned long);
for(unsigned i = 0; i < number_of_processes; i++)
{
Add(process_id_array[i]);
ids.push_back(process_id_array[i]);
}
}
public: void ArrangeById()
{
typedef multimap<unsigned long,wstring> MAP;
typedef MAP::iterator ITERATOR;
typedef pair<unsigned long,wstring> PAIR;
MAP m;
ITERATOR it;
for(unsigned i = 0; i < number_of_processes; i++)
m.insert(PAIR(ids[i],names[i]));
names.clear();
ids.clear();
for(it = m.begin(); it != m.end(); it++)
{
ids.push_back(it -> first);
names.push_back(it -> second);
}
}
void ArrangeByName()
{
typedef multimap<wstring,unsigned long> MAP;
typedef MAP::iterator ITERATOR;
typedef pair<wstring,unsigned long> PAIR;
MAP m;
ITERATOR it;
for(unsigned i = 0; i < number_of_processes; i++)
m.insert(PAIR(names[i],ids[i]));
names.clear();
ids.clear();
for(it = m.begin(); it != m.end(); it++)
{
names.push_back(it -> first);
ids.push_back(it -> second);
}
}
void Update()
{
names.clear();
ids.clear();
Fill();
}
unsigned GetNumber()
{
return number_of_processes;
}
void KillProcess(unsigned i) // kill process by number
{
unsigned long id = this[0][i];
void* han = OpenProcess
(
PROCESS_ALL_ACCESS,
FALSE,
id
);
if(han == 0)
return;
unsigned long d;
if(GetExitCodeProcess(han,&d) == 0)
d = 0;
if(TerminateProcess(han,d) == 0)
{
//print_error("void operator -=(unsigned i)");
return;
}
CloseHandle(han);
Update();
}
void KillProcess(wstring name) // kill process by name
{
for(unsigned i = 0; i < number_of_processes; i++)
if(this[0](i) == name)
KillProcess(i);
}
unsigned operator ~() // number_of_processes
{
return number_of_processes;
}
void operator +() // updates the names & ids of processes
{
Update();
}
void operator -() // arrange by name
{
ArrangeByName();
}
void operator !() // arrange by id
{
ArrangeById();
}
void operator -=(unsigned i) // kill process by number
{
KillProcess(i);
}
void operator -=(wstring name) // kill process by name
{
KillProcess(name);
}
wstring operator()(unsigned i) // get name by number
{
if(i < GetNumber())
return names[i];
else
return L"";
}
unsigned operator[](unsigned i) // get id by number
{
if(i < GetNumber())
return ids[i];
else
return -1;
}
unsigned NumberOfProcsWithName(wstring name)
{
ToLower(name);
unsigned ret = 0;
unsigned size = names.size();
for(unsigned i = 0; i < size; i++)
{
if(names[i] == name)
ret++;
}
return ret;
}
Processes() // constructor creates the list of processes
{
Priv();
Fill();
}
};int main()
{ Priv(true); // obtain privilege
Processes pr;
unsigned n = ~pr; // number of processes
-pr; // arrange by name
for(unsigned i = 0; i < n; i++)
{
wcout<< setw(2) << i << L": "; // number
wcout<< setw(4) << pr[i] << L" : "; // id
wcout<< pr(i) << L"\n"; // name
}
pr.KillProcess(L"fdm.exe");
Priv(false); // lose privilege
_getch();
Suicide(); // end program
_getch();
}Output:
0: 0 : Access Denied
1: 4 : Access Denied
2: 4168 : Access Denied
3: 5760 : bds.exe
4: 2084 : cappswk.exe
5: 2548 : cappswk.exe
6: 2628 : cappswk.exe
7: 700 : caprpcsk.exe
8: 1548 : cisvc.exe
9: 3764 : conhost.exe
10: 1504 : conhost.exe
11: 3064 : conhost.exe
12: 6104 : console.exe
13: 368 : csrss.exe
14: 424 : csrss.exe
15: 604 : dwm.exe
16: 1012 : explorer.exe
17: 4328 : explorer.exe
18: 3808 : iexplore.exe
19: 4600 : iexplore.exe
20: 1616 : inetinfo.exe
21: 2564 : internettimev3.exe
22: 540 : lsass.exe
23: 548 : lsm.exe
24: 1772 : mdm.exe
25: 1812 : mqsvc.exe
26: 2884 : mqtgsvc.exe
27: 4828 : msbuild.exe
28: 5920 : msbuild.exe
29: 2960 : nfsclnt.exe
30: 5548 : officelivesignin.exe
31: 2640 : onenotem.exe
32: 416 : psxss.exe
33: 2464 : seaport.exe
34: 2152 : searchindexer.exe
35: 532 : services.exe
36: 2504 : sidebar.exe
37: 260 : smss.exe
38: 2016 : smsvchost.exe
39: 3140 : smsvchost.exe
40: 2604 : snmp.exe
41: 1352 : spoolsv.exe
42: 1852 : sqlservr.exe
43: 2740 : sqlwriter.exe
44: 640 : svchost.exe
45: 716 : svchost.exe
46: 812 : svchost.exe
47: 868 : svchost.exe
48: 896 : svchost.exe
49: 1092 : svchost.exe
50: 1192 : svchost.exe
51: 1388 : svchost.exe
52: 1528 : svchost.exe
53: 1596 : svchost.exe
54: 1700 : svchost.exe
55: 1724 : svchost.exe
56: 2772 : svchost.exe
57: 2848 : svchost.exe
58: 4240 : svchost.exe
59: 5380 : svchost.exe
60: 3736 : svchost.exe
61: 1952 : taskhost.exe
62: 2572 : tcpsvcs.exe
63: 2804 : ulcdrsvr.exe
64: 3856 : vcexpress.exe
65: 4088 : vcpkgsrv.exe
66: 2456 : wfwiz.exe
67: 4864 : windowslivewriter.exe
68: 440 : wininit.exe
69: 492 : winlogon.exe
70: 5044 : winword.exe
71: 1748 : wlcomm.exe
72: 4456 : wlmail.exe
73: 1348 : wltuser.exe
74: 4324 : wordpad.exe
75: 3796 : wuauclt.exe
این لیست همه پروسههایی است که در کامپیوتر من در حال اجرا هستند. در پایان برنامه، پرسه fdm.exe در صورتی که در حال اجرا باشد متوقف میشود. البته همان طور که در لیست میبینید این پروسه در کامپیوتر من در حال اجرا نیست.
این برنامه میتواند به نوشتن خیلی از برنامههای مفید در مورد آمار گیری و توقف پروسهها در ویندوز کمک کند.