1. 程式人生 > 其它 >轉載-VC遍歷程序

轉載-VC遍歷程序

遍歷程序需要幾個API,和一個結構體

  1.建立程序快照

  2.遍歷首次程序

  3.繼續下次遍歷

  4.程序資訊結構體

API 分別是:

1.建立程序快照

HANDLE WINAPI CreateToolhelp32Snapshot(      程序快照API
  DWORD dwFlags,                       遍歷的標誌,表示你要遍歷什麼(程序,模組,堆...)
  DWORD th32ProcessID                   遍歷的程序ID,如果為0,則是當前程序,如果不為0,則是建立指定程序的快照進行遍歷
);
注意,建立程序快照需要包含標頭檔案  Tlhelp32.h

返回值:

  成功返回快照控制代碼

  失敗返回 INVALID_HANDLE_VALUE

2.遍歷首次程序. BOOL WINAPI Process32First( HANDLE hSnapshot,     程序快照控制代碼 LPPROCESSENTRY32 lppe     傳入程序資訊結構體,系統幫你填寫. ); 程序資訊結構體 複製程式碼 typedef struct tagPROCESSENTRY32 { DWORD dwSize;               程序資訊結構體大小,首次呼叫之前必須初始化 DWORD cntUsage;              引用程序的次數,引用次數為0時,則程序結束 DWORD th32ProcessID;           程序的ID ULONG_PTR th32DefaultHeapID;      程序預設堆的識別符號,除工具使用對我們沒用 DWORD th32ModuleID; 程序模組的識別符號 DWORD cntThreads;            程序啟動的執行執行緒數 DWORD th32ParentProcessID; 父程序ID LONG pcPriClassBase;          程序執行緒的基本優先順序 DWORD dwFlags;              保留 TCHAR szExeFile[MAX_PATH]; 程序的路徑 } PROCESSENTRY32; typedef PROCESSENTRY32
*PPROCESSENTRY32; 複製程式碼 對我們有用的就是 dwSize         初始化結構體的大小 th32ProcessId 程序ID szExeFile[MAX_PATH] 程序路徑 3.遍歷下一次程序 BOOL WINAPI Process32Next( HANDLE hSnapshot,   程序控制代碼 LPPROCESSENTRY32 lppe 程序資訊結構體 ); 相容程式碼 複製程式碼 #include <windows.h> #include <Tlhelp32.h> int main(int
argc, char* argv[]) { HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); if (INVALID_HANDLE_VALUE == hSnapshot) { return 0; } PROCESSENTRY32 pi; pi.dwSize = sizeof(PROCESSENTRY32); //第一次使用必須初始化成員 BOOL bRet = Process32First(hSnapshot,&pi); while (bRet) { /* 迴圈遍歷新增自己的額外程式碼 */ bRet = Process32Next(hSnapshot,&pi); } return 0; } 複製程式碼 自己寫的測試輸出程式碼. 複製程式碼 #include <stdio.h> #include <windows.h> #include <Tlhelp32.h> int main(int argc, char* argv[]) { HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); if (INVALID_HANDLE_VALUE == hSnapshot) { return 0; } PROCESSENTRY32 pi; pi.dwSize = sizeof(PROCESSENTRY32); //第一次使用必須初始化成員 BOOL bRet = Process32First(hSnapshot,&pi); while (bRet) { /* 迴圈遍歷新增自己的額外程式碼 */ printf("程序ID = %d ,程序路徑 = %s\r\n",pi.th32ProcessID,pi.szExeFile); bRet = Process32Next(hSnapshot,&pi); } return 0; } 複製程式碼 輸出內容 常用程式碼之根據程序名返回對應PID DWORD PsGetProcessIdByProcessName(LPTSTR ProcessName) { #ifdef UNICODE std::wstring ChekName; std::wstring tempChekName; #else std::string ChekName; std::string tempChekName; #endif tempChekName = ProcessName; HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (INVALID_HANDLE_VALUE == hSnapshot) { return FALSE; } PROCESSENTRY32 pi; pi.dwSize = sizeof(PROCESSENTRY32); //第一次使用必須初始化成員 BOOL bRet = Process32First(hSnapshot, &pi); transform(tempChekName.begin(), tempChekName.end(), tempChekName.begin(), ::tolower); while (bRet) { ChekName = pi.szExeFile; transform(ChekName.begin(), ChekName.end(), ChekName.begin(), ::tolower); //大寫轉小寫進行配置 if (ChekName.find(tempChekName) != ChekName.npos) { //找到了 return pi.th32ProcessID; } bRet = Process32Next(hSnapshot, &pi); } return FALSE; }    常用程式碼之根據PID 返回程序名 #ifdef UNICODE std::wstring PsGetProcessNameByProcessId(DWORD pid) { HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (INVALID_HANDLE_VALUE == hSnapshot) { return FALSE; } PROCESSENTRY32 pi; pi.dwSize = sizeof(PROCESSENTRY32); //第一次使用必須初始化成員 BOOL bRet = Process32First(hSnapshot, &pi); while (bRet) { //大寫轉小寫進行配置 if (pid == pi.th32ProcessID) { //找到了 return pi.szExeFile; } bRet = Process32Next(hSnapshot, &pi); } return FALSE; } #else std::string PsGetProcessNameByProcessId(DWORD pid) { HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (INVALID_HANDLE_VALUE == hSnapshot) { return FALSE; } PROCESSENTRY32 pi; pi.dwSize = sizeof(PROCESSENTRY32); //第一次使用必須初始化成員 BOOL bRet = Process32First(hSnapshot, &pi); while (bRet) { //大寫轉小寫進行配置 if (pid == pi.th32ProcessID) { //找到了 return pi.szExeFile; } bRet = Process32Next(hSnapshot, &pi); } return FALSE; } #endif    根據程序PID殺掉程序 BOOL PsKillProcess(LPTSTR KillProcessName) { //殺掉程序 /* 殺掉程序方式很多種 1.TerminateProcess 2.迴圈遍歷執行緒,結束執行緒 3.遍歷記憶體.設定記憶體可讀屬性為 不可訪問.讓其異常自己推出 4.呼叫NT函式ZwUnmapViewOfSection 取消它的對映 5.核心 中記憶體清零法 強殺程序 .... 思路很多.可以搞的地方也很多. */ DWORD dwPid = PsGetProcessIdByProcessName(KillProcessName); HANDLE hProcess = NULL; if (dwPid != 0) { hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid); if (hProcess != NULL) { TerminateProcess(hProcess,0); } } return 0; }