枚举进程
全部代码//
bool CMy20130608Dlg::DebugPrivilege(const char *PName, BOOL bEnable)
{
bool bResult = TRUE;
HANDLE hToken;
TOKEN_PRIVILEGES TokenPrivileges;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken))
{
bResult = FALSE;
return bResult;
}
TokenPrivileges.PrivilegeCount = 1;
TokenPrivileges.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;
LookupPrivilegeValue(NULL, PName, &TokenPrivileges.Privileges[0].Luid);
AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL);
if (GetLastError() != ERROR_SUCCESS)
{
bResult = FALSE;
}
CloseHandle(hToken);
return bResult;
}
void CMy20130608Dlg::EnumProcess()
{
m_list.DeleteAllItems();
//提升权限
DebugPrivilege(SE_DEBUG_NAME, TRUE);
//CreateToolhelp32Snapshot函数通过获取进程信息为指定的进程、进程使用的堆[HEAP]、模块[MODULE]、线程建立一个快照.
//说到底,可以获取系统中正在运行的进程信息,线程信息,等
//参数一:用来指定“快照”中需要返回的对象,可以是TH32CS_SNAPPROCESS等
//参数二:一个进程ID号,用来指定要获取哪一个进程的快照,当获取系统进程列表或获取 当前进程快照时可以设为0
HANDLE hSnapshot = NULL;
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //创建系统快照
if(hSnapshot == INVALID_HANDLE_VALUE) return;
//进程中的模块
HMODULE hModules = NULL;
DWORD cbNeeded;
//进程的ID
CString strProcessID;
//进程的完整名称(包含路径)
char strProcessName[MAX_PATH] = {0};
PROCESSENTRY32 pe32 = {0};
pe32.dwSize = sizeof(PROCESSENTRY32);
if(Process32First(hSnapshot, &pe32))//process32First函数来获得第一个进程的句柄.
{
HANDLE hProcess = NULL;
do
{
//打开进程句柄
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, TRUE, pe32.th32ProcessID);
if ((pe32.th32ProcessID !=0 ) && (pe32.th32ProcessID != 4) && (pe32.th32ProcessID != 8))
{
//枚举进程的第一个模块其实就是自身
EnumProcessModules(hProcess, &hModules, sizeof(hModules), &cbNeeded);
//根据模块得到模块的名字
GetModuleFileNameEx(hProcess, hModules, strProcessName, sizeof(strProcessName));
m_list.InsertItem(0, pe32.szExeFile); //进程的名字
strProcessID.Format("%d",pe32.th32ProcessID);
m_list.SetItemText(0, 1, strProcessID);
m_list.SetItemText(0, 2, strProcessName);
}
}
//得到快照中下一个进程
while(Process32Next(hSnapshot, &pe32));
}
//降低权限
DebugPrivilege(SE_DEBUG_NAME, FALSE);
//关闭句柄
CloseHandle(hSnapshot);
}
void CMy20130608Dlg::OnButFlash()
{
// TODO: Add your control notification handler code here
EnumProcess();
}
//强制结束进程
void CMy20130608Dlg::OnButExit()
{
// TODO: Add your control notification handler code here
HANDLE hProcess = NULL;
CString strProcessID;
DWORD dwProcessID;
int nSelect=m_list.GetSelectionMark(); //得到选中的条目
if (nSelect<0)
{
return;
}
DebugPrivilege(SE_DEBUG_NAME, TRUE);
strProcessID=m_list.GetItemText(nSelect,1); //得到要结束进程的ID
dwProcessID=atoi(strProcessID);
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessID); //打开进程获得其句柄
TerminateProcess(hProcess, 0); //结束进程
CloseHandle(hProcess); //关闭打开的句柄
DebugPrivilege(SE_DEBUG_NAME, FALSE);
// 稍稍Sleep下,防止出错
Sleep(100);
EnumProcess();
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
