枚举进程
全部代碼//
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();
?? ?
?? ?//提升權(quán)限
??? DebugPrivilege(SE_DEBUG_NAME, TRUE);
?? ?//CreateToolhelp32Snapshot函數(shù)通過(guò)獲取進(jìn)程信息為指定的進(jìn)程、進(jìn)程使用的堆[HEAP]、模塊[MODULE]、線程建立一個(gè)快照.
?? ?//說(shuō)到底,可以獲取系統(tǒng)中正在運(yùn)行的進(jìn)程信息,線程信息,等
?? ?//參數(shù)一:用來(lái)指定“快照”中需要返回的對(duì)象,可以是TH32CS_SNAPPROCESS等
?? ?//參數(shù)二:一個(gè)進(jìn)程ID號(hào),用來(lái)指定要獲取哪一個(gè)進(jìn)程的快照,當(dāng)獲取系統(tǒng)進(jìn)程列表或獲取 當(dāng)前進(jìn)程快照時(shí)可以設(shè)為0
?? ?HANDLE?? ??? ??? ?hSnapshot = NULL;
?? ?hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);??? //創(chuàng)建系統(tǒng)快照 ?
?? ?if(hSnapshot == INVALID_HANDLE_VALUE)? return;
?? ?
?? ?//進(jìn)程中的模塊
?? ?HMODULE?? ??? ??? ?hModules? = NULL;
??? ?DWORD?? ??? ??? ?cbNeeded;
?? ?//進(jìn)程的ID
??? ?CString?? ??? ??? ?strProcessID;
?? ?//進(jìn)程的完整名稱(chēng)(包含路徑)
??? ?char?? ??? ??? ?strProcessName[MAX_PATH] = {0};
?? ?PROCESSENTRY32?? ?pe32????? = {0};
?? ?pe32.dwSize = sizeof(PROCESSENTRY32);
?? ?if(Process32First(hSnapshot, &pe32))//process32First函數(shù)來(lái)獲得第一個(gè)進(jìn)程的句柄.
?? ?{
?? ??? ?HANDLE?? ??? ??? ?hProcess? = NULL;
?? ??? ?do
?? ??? ?{???? ?
?? ??? ??? ?//打開(kāi)進(jìn)程句柄
?? ??? ??? ?hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, TRUE, pe32.th32ProcessID);
?? ??? ??? ?if ((pe32.th32ProcessID !=0 ) && (pe32.th32ProcessID != 4) && (pe32.th32ProcessID != 8))
?? ??? ??? ?{
?? ??? ??? ??? ?//枚舉進(jìn)程的第一個(gè)模塊其實(shí)就是自身
?? ??? ??? ??? ?EnumProcessModules(hProcess, &hModules, sizeof(hModules), &cbNeeded);
?? ??? ??? ??? ?//根據(jù)模塊得到模塊的名字
?? ??? ??? ??? ?GetModuleFileNameEx(hProcess, hModules, strProcessName, sizeof(strProcessName));
?? ??? ??? ??? ?
?? ??? ??? ??? ?m_list.InsertItem(0, pe32.szExeFile);?????? //進(jìn)程的名字
?? ??? ??? ??? ?strProcessID.Format("%d",pe32.th32ProcessID); ?
?? ??? ??? ??? ?m_list.SetItemText(0, 1, strProcessID);???? ?
??????????????? m_list.SetItemText(0, 2, strProcessName);?? ?
?? ??? ??? ?}
?? ??? ?}
?? ??? ?//得到快照中下一個(gè)進(jìn)程
?? ??? ?while(Process32Next(hSnapshot, &pe32));??????? ?
?? ?}
?? ?
?? ?//降低權(quán)限
?? ?DebugPrivilege(SE_DEBUG_NAME, FALSE);
?? ?//關(guān)閉句柄
?? ?CloseHandle(hSnapshot);??????????????????? ?
}
void CMy20130608Dlg::OnButFlash()
{
?? ?// TODO: Add your control notification handler code here
?? ?EnumProcess();
}
//強(qiáng)制結(jié)束進(jìn)程
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);??????? //得到要結(jié)束進(jìn)程的ID
?? ?dwProcessID=atoi(strProcessID);???????????? ?
?? ?
?? ?hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessID);??? //打開(kāi)進(jìn)程獲得其句柄
?? ?TerminateProcess(hProcess, 0);?????? //結(jié)束進(jìn)程
?? ?CloseHandle(hProcess);????? //關(guān)閉打開(kāi)的句柄
?? ?DebugPrivilege(SE_DEBUG_NAME, FALSE);
?? ?// 稍稍Sleep下,防止出錯(cuò)
?? ?Sleep(100);
?? ?EnumProcess();
}
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();
?? ?
?? ?//提升權(quán)限
??? DebugPrivilege(SE_DEBUG_NAME, TRUE);
?? ?//CreateToolhelp32Snapshot函數(shù)通過(guò)獲取進(jìn)程信息為指定的進(jìn)程、進(jìn)程使用的堆[HEAP]、模塊[MODULE]、線程建立一個(gè)快照.
?? ?//說(shuō)到底,可以獲取系統(tǒng)中正在運(yùn)行的進(jìn)程信息,線程信息,等
?? ?//參數(shù)一:用來(lái)指定“快照”中需要返回的對(duì)象,可以是TH32CS_SNAPPROCESS等
?? ?//參數(shù)二:一個(gè)進(jìn)程ID號(hào),用來(lái)指定要獲取哪一個(gè)進(jìn)程的快照,當(dāng)獲取系統(tǒng)進(jìn)程列表或獲取 當(dāng)前進(jìn)程快照時(shí)可以設(shè)為0
?? ?HANDLE?? ??? ??? ?hSnapshot = NULL;
?? ?hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);??? //創(chuàng)建系統(tǒng)快照 ?
?? ?if(hSnapshot == INVALID_HANDLE_VALUE)? return;
?? ?
?? ?//進(jìn)程中的模塊
?? ?HMODULE?? ??? ??? ?hModules? = NULL;
??? ?DWORD?? ??? ??? ?cbNeeded;
?? ?//進(jìn)程的ID
??? ?CString?? ??? ??? ?strProcessID;
?? ?//進(jìn)程的完整名稱(chēng)(包含路徑)
??? ?char?? ??? ??? ?strProcessName[MAX_PATH] = {0};
?? ?PROCESSENTRY32?? ?pe32????? = {0};
?? ?pe32.dwSize = sizeof(PROCESSENTRY32);
?? ?if(Process32First(hSnapshot, &pe32))//process32First函數(shù)來(lái)獲得第一個(gè)進(jìn)程的句柄.
?? ?{
?? ??? ?HANDLE?? ??? ??? ?hProcess? = NULL;
?? ??? ?do
?? ??? ?{???? ?
?? ??? ??? ?//打開(kāi)進(jìn)程句柄
?? ??? ??? ?hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, TRUE, pe32.th32ProcessID);
?? ??? ??? ?if ((pe32.th32ProcessID !=0 ) && (pe32.th32ProcessID != 4) && (pe32.th32ProcessID != 8))
?? ??? ??? ?{
?? ??? ??? ??? ?//枚舉進(jìn)程的第一個(gè)模塊其實(shí)就是自身
?? ??? ??? ??? ?EnumProcessModules(hProcess, &hModules, sizeof(hModules), &cbNeeded);
?? ??? ??? ??? ?//根據(jù)模塊得到模塊的名字
?? ??? ??? ??? ?GetModuleFileNameEx(hProcess, hModules, strProcessName, sizeof(strProcessName));
?? ??? ??? ??? ?
?? ??? ??? ??? ?m_list.InsertItem(0, pe32.szExeFile);?????? //進(jìn)程的名字
?? ??? ??? ??? ?strProcessID.Format("%d",pe32.th32ProcessID); ?
?? ??? ??? ??? ?m_list.SetItemText(0, 1, strProcessID);???? ?
??????????????? m_list.SetItemText(0, 2, strProcessName);?? ?
?? ??? ??? ?}
?? ??? ?}
?? ??? ?//得到快照中下一個(gè)進(jìn)程
?? ??? ?while(Process32Next(hSnapshot, &pe32));??????? ?
?? ?}
?? ?
?? ?//降低權(quán)限
?? ?DebugPrivilege(SE_DEBUG_NAME, FALSE);
?? ?//關(guān)閉句柄
?? ?CloseHandle(hSnapshot);??????????????????? ?
}
void CMy20130608Dlg::OnButFlash()
{
?? ?// TODO: Add your control notification handler code here
?? ?EnumProcess();
}
//強(qiáng)制結(jié)束進(jìn)程
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);??????? //得到要結(jié)束進(jìn)程的ID
?? ?dwProcessID=atoi(strProcessID);???????????? ?
?? ?
?? ?hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessID);??? //打開(kāi)進(jìn)程獲得其句柄
?? ?TerminateProcess(hProcess, 0);?????? //結(jié)束進(jìn)程
?? ?CloseHandle(hProcess);????? //關(guān)閉打開(kāi)的句柄
?? ?DebugPrivilege(SE_DEBUG_NAME, FALSE);
?? ?// 稍稍Sleep下,防止出錯(cuò)
?? ?Sleep(100);
?? ?EnumProcess();
}
總結(jié)
- 上一篇: Wireshark网卡抓包工具简明教程
- 下一篇: 一分钟学会使用RichEdit控件