周遊程序
// 初始化Process清單
void InitProcessList()
{
// 建立程序快照
HANDLE hProcessSnap = ;
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,);
if (hProcessSnap == INVALID_HANDLE_VALUE)
{
OutputDebugString(L"建立程序快照失敗");
return;
}
// 建立結構體用來儲存程序資訊
PROCESSENTRY32 process = {sizeof(PROCESSENTRY32)};
// 擷取第一個程序
Process32First(hProcessSnap, &process);
do
{
// 使用OpenProcess時必須保證本程式是管理者身份運作,并且擁有seDebug權限
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, process.th32ProcessID);
if (hProcess == INVALID_HANDLE_VALUE)
{
OutputDebugString(L"擷取程序詳細資訊失敗,");
}
BOOL Is32 = FALSE;
IsWow64Process(hProcess, &Is32);
CString szTemp; // 格式化資訊
// 程序名
process.szExeFile;
// PID
szTemp.Format(L"%d", process.th32ProcessID);
// 運作平台
szTemp.Format(L"%d位程式", Is32 ? : );
// 運作平台
szTemp.Format(L"%d", process.th32ParentProcessID);
// 程序路徑
DWORD dwSize = MAX_PATH;
WCHAR szName[MAX_PATH] = {};
BOOL bRet= QueryFullProcessImageName(hProcess, , szName, &dwSize);
} while (Process32Next(hProcessSnap,&process));
}
周遊線程
// 初始化Thread清單
void InitThreadList(DWORD PID)
{
// 建立線程快照
HANDLE hThreadSnap = ;
hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, );
if (hThreadSnap == INVALID_HANDLE_VALUE) return;
// 用來儲存線程資訊
THREADENTRY32 stcTe32 = { sizeof(THREADENTRY32) };
// 擷取第一個線程
Thread32First(hThreadSnap, &stcTe32);
CString szTemp;
do
{
// 篩選指定程序下的線程,插入到線程清單控件中
if (stcTe32.th32OwnerProcessID == PID)
{
// 目前線程ID
szTemp.Format(L"%d", stcTe32.th32ThreadID);
// 所屬程序ID
szTemp.Format(L"%d", stcTe32.th32OwnerProcessID);
// 線程優先級
szTemp.Format(L"%d", stcTe32.tpBasePri);
}
} while (Thread32Next(hThreadSnap, &stcTe32));
}
周遊DLL子產品
// 初始化DLL清單
void InitModuleList(DWORD PID)
{
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, PID);
if (hProcess == INVALID_HANDLE_VALUE || !hProcess)return;
DWORD dwBuffSize = ;
BOOL bRet = EnumProcessModulesEx(hProcess, NULL, , &dwBuffSize, LIST_MODULES_ALL);
HMODULE * pModuleHandlerArr = (HMODULE*) new char[dwBuffSize];
bRet = EnumProcessModulesEx(hProcess, pModuleHandlerArr, dwBuffSize, &dwBuffSize, LIST_MODULES_ALL);
// 子產品名稱
TCHAR szModuleName[MAX_PATH];
// 儲存子產品資訊
MODULEINFO stcModuleInfo = { };
// 周遊子產品清單
int nCount = dwBuffSize / sizeof(HMODULE);
for (int i = ; i < nCount; ++i)
{
// 根據程序句柄和子產品句柄,擷取子產品資訊
GetModuleInformation(hProcess, pModuleHandlerArr[i], &stcModuleInfo, sizeof(stcModuleInfo));
// 根據程序句柄和子產品句柄,擷取子產品的路徑(包括子產品名)
GetModuleFileNameEx(hProcess, pModuleHandlerArr[i], szModuleName, MAX_PATH);
// 基址
CString szTemp;
szTemp.Format(L"%08X", stcModuleInfo.lpBaseOfDll);
// 入口點
szTemp.Format(L"%08X", stcModuleInfo.EntryPoint);
// 記憶體大小
szTemp.Format(L"%d", stcModuleInfo.SizeOfImage);
// 子產品路徑
szModuleName;
}
// 釋放數組
delete[] pModuleHandlerArr;
pModuleHandlerArr = nullptr;
}
周遊視窗清單
// 初始化視窗清單
void InitWindowList()
{
EnumWindows(&CProcessManage::EnumWindowsProc, NULL);
}
// 視窗函數回調
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
static int nCount = ;
// 擷取視窗名
WCHAR szWindowName[MAXBYTE]={}, szClassName[MAXBYTE]={};
::GetWindowText(hwnd,szWindowName, MAXBYTE);
// 擷取視窗類名
::GetClassName(hwnd, szClassName,MAXBYTE);
// 判斷視窗是否隐藏
BOOL bIsShow = ::IsWindowVisible(hwnd);
CString szTemp = szWindowName;
if (bIsShow && !szTemp.IsEmpty())
{
// 視窗名稱
szWindowName;
// 類名
szClassName;
}
return TRUE;
}