0.windows CMD命令tasklist
- 我们都知道windows的cmd命令tasklist可以打印出系统当前所有进程的pid和内存使用
- 我们怎么用c++自己写一个程序实现这个功能?
1.clion下能使用的代码
#include <iostream>
#include <string>
#include <map>
#include <windows.h>
#include <TlHelp32.h>
bool TraverseProcesses(std::map<std::string,int> &_mapProcess)
{
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(pe32);
HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hProcessSnap == INVALID_HANDLE_VALUE) {
std::cout << "Create Toolhelp32Snapshot Error!" << std::endl;
return false;
}
BOOL bResult =Process32First(hProcessSnap, &pe32);
int num(0);
while(bResult)
{
std::string name = pe32.szExeFile;
int id = pe32.th32ProcessID;
std::cout << "[" << ++num << "]: "<< "--ProcessID:" << id;
std::cout<<"--Process Name:" << name<<std::endl;
_mapProcess.insert(std::pair<std::string, int>(name, id));
bResult = Process32Next(hProcessSnap,&pe32);
}
CloseHandle(hProcessSnap);
return true;
}
int main()
{
std::map<std::string,int> mapProcess;
DWORD start = ::GetTickCount();
TraverseProcesses(mapProcess);
DWORD end = ::GetTickCount();
std::cout<<"waste time(ms):"<<end-start<<std::endl;
return 0;
}
2.vs2008下能使用的代码
#include "stdafx.h"
#include <iostream>
#include <string>
#include <map>
#include <windows.h>
#include <TlHelp32.h>
bool TraverseProcesses(std::map<std::wstring,int> &_mapProcess)
{
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(pe32);
HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hProcessSnap == INVALID_HANDLE_VALUE) {
std::cout << "Create Toolhelp32Snapshot Error!" << std::endl;
return false;
}
BOOL bResult =Process32First(hProcessSnap, &pe32);
int num(0);
while(bResult)
{
std::wstring name = pe32.szExeFile;
int id = pe32.th32ProcessID;
std::cout << "[" << ++num << "]: "<< "--ProcessID:" << id;
std::wcout<<"--Process Name:" << name<<std::endl;
_mapProcess.insert(std::pair<std::wstring, int>(name, id));
bResult = Process32Next(hProcessSnap,&pe32);
}
CloseHandle(hProcessSnap);
return true;
}
int main()
{
std::map<std::wstring,int> mapProcess;
DWORD start = ::GetTickCount();
TraverseProcesses(mapProcess);
DWORD end = ::GetTickCount();
std::cout<<"waste time(ms):"<<end-start<<std::endl;
system("pause");
return 0;
}
3.vs2008下遍历进程+杀死进程完整程序
- 杀死进程,首先要将当前程序提权,有杀死别的程序的权限后,调用TerminateProcess函数杀死进程。
- 这个过程不一定成功,前提是要杀死的进程没有用hook钩子屏蔽系统的TerminateProcess函数生效,亲测微信可以被杀死。
#include "stdafx.h"
#include <iostream>
#include <string>
#include <map>
#include <windows.h>
#include <TlHelp32.h>
bool TraverseProcesses(std::map<std::wstring,int> &_mapProcess)
{
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(pe32);
HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hProcessSnap == INVALID_HANDLE_VALUE) {
std::cout << "Create Toolhelp32Snapshot Error!" << std::endl;
return false;
}
BOOL bResult =Process32First(hProcessSnap, &pe32);
int num(0);
while(bResult)
{
std::wstring name = pe32.szExeFile;
int id = pe32.th32ProcessID;
std::cout << "[" << ++num << "]: "<< "--ProcessID:" << id;
std::wcout<<"--Process Name:" << name<<std::endl;
_mapProcess.insert(std::pair<std::wstring, int>(name, id));
bResult = Process32Next(hProcessSnap,&pe32);
}
CloseHandle(hProcessSnap);
return true;
}
void EnableDebugPriv() {
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, NULL);
CloseHandle(hToken);
}
int KillProcess(int id)
{
HANDLE hProcess=NULL;
hProcess=OpenProcess(PROCESS_TERMINATE,FALSE,id);
if (hProcess==NULL) {
wprintf(L"\nOpen Process fAiled:%d\n",GetLastError());
return -1;
}
DWORD ret=TerminateProcess(hProcess,0);
if(ret==0) {
wprintf(L"%d",GetLastError());
}
return -1;
}
int main()
{
std::map<std::wstring,int> mapProcess;
DWORD start = ::GetTickCount();
TraverseProcesses(mapProcess);
DWORD end = ::GetTickCount();
std::cout<<"use time(ms):"<<end-start<<std::endl;
std::cout<<"please input pid of process you want to kill(use CTR+Z to end program):";
int pid;
while (std::cin>>pid)
{
if(KillProcess(pid) == -1)
{
std::cout<<"Kill process success."<<std::endl;
}
std::cout<<"Please input pid of process you want to kill:";
}
system("pause");
return 0;
}