遍历进程线程服务任务

来源:互联网 发布:cd设计软件 编辑:程序博客网 时间:2024/06/04 23:32
/ 遍历系统服务信息
BOOL EnumServices()
{
LONG lRet = 0;
BOOL bRet = FALSE;
SC_HANDLE hSCM = NULL; // 服务数据库句柄
char *pBuf = NULL; // 缓冲区指针
DWORD dwBufSize = 0; // 传入的缓冲长度
DWORD dwBufNeed = 0; // 需要的缓冲长度
DWORD dwNumberOfService = 0; // 返回的服务个数
SERVERSINFO stcInfo; // 临时储存服务信息
ENUM_SERVICE_STATUS_PROCESS *pServiceInfo = NULL; // 服务信息
// 建立了一个到服务控制管理器的连接,并打开指定的数据库
hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE | SC_MANAGER_CONNECT);
if (NULL == hSCM)
{
MessageBox(L"OpenSCManager error");
return -1;
}
// 获取需要的缓冲区大小
EnumServicesStatusEx(hSCM, SC_ENUM_PROCESS_INFO, SERVICE_WIN32, SERVICE_STATE_ALL,
NULL, dwBufSize, &dwBufNeed, &dwNumberOfService, NULL, NULL);
// 多设置存放1个服务信息的长度
dwBufSize = dwBufNeed + sizeof(ENUM_SERVICE_STATUS_PROCESS);
pBuf = (char *)malloc(dwBufSize);
if (NULL == pBuf)
{
MessageBox(L"malloc error");
return -1;
}
memset(pBuf, 0, dwBufSize);
// 获取服务信息
bRet = EnumServicesStatusEx(hSCM, SC_ENUM_PROCESS_INFO, SERVICE_WIN32, SERVICE_STATE_ALL,
(LPBYTE)pBuf, dwBufSize, &dwBufNeed, &dwNumberOfService, NULL, NULL);
if (bRet == FALSE)
{
printf("EnumServicesStatusEx error.\n");
::CloseServiceHandle(hSCM);
free(pBuf);
return -1;
}
// 关闭打开的服务句柄
bRet = ::CloseServiceHandle(hSCM);
if (bRet == FALSE)
{
MessageBox(L"CloseServiceHandle error");
}
//printf("Service Num:%d\n", dwNumberOfService);
pServiceInfo = (LPENUM_SERVICE_STATUS_PROCESS)pBuf;
// 取得的服务信息
for (unsigned int i = 0; i < dwNumberOfService; i++)
{
StringCbCopy(stcInfo.szServersName, MAX_PATH, pServiceInfo[i].lpServiceName);
StringCbCopy(stcInfo.szDisplayName, MAX_PATH, pServiceInfo[i].lpDisplayName);
stcInfo.dwServersID = pServiceInfo[i].ServiceStatusProcess.dwProcessId;
//运行状况
switch (pServiceInfo[i].ServiceStatusProcess.dwCurrentState)
{
case SERVICE_CONTINUE_PENDING:
case SERVICE_PAUSE_PENDING:
case SERVICE_PAUSED:
wsprintf(stcInfo.szActive, _T("暂停或挂起"));
break;
case SERVICE_RUNNING:
case SERVICE_START_PENDING:
wsprintf(stcInfo.szActive, _T("正在运行"));
break;
case SERVICE_STOP_PENDING:
wsprintf(stcInfo.szActive, _T("停止运行"));
break;
case SERVICE_STOPPED:
wsprintf(stcInfo.szActive, _T("非运行态"));
break;
default:
break;
}
wsprintf(stcInfo.szGroup, _T("逗B组"));
m_Services.push_back(stcInfo);
}
free(pBuf);
return TRUE;
}






// 遍历应用程序 任务
BOOL CALLBACK EnumTaskbarWnds(HWND hwnd, LPARAM lParam)
{
APP_INFO stcInfo = { 0 };
if (!::GetWindow(hwnd, GW_OWNER) && ::IsWindowVisible(hwnd)) // 滤掉不在任务栏显示的窗口
{
GetClassName(hwnd, stcInfo.szClassName, 256);
if (wcscmp(stcInfo.szClassName, L"Shell_TrayWnd") != 0 // 滤掉任务栏本身
&& wcscmp(stcInfo.szClassName, L"Progman") != 0 // 滤掉桌面
)
{
if (GetWindowLong(hwnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW){
return true;
}
//这就是你想要的窗口了。
::GetWindowText(hwnd, stcInfo.szWindName, MAX_PATH);
StringCchCopy(stcInfo.szStatus, MAX_PATH, L"正常运行");
stcInfo.hwnd = hwnd;
GetWindowThreadProcessId(hwnd, &stcInfo.nProcess);
g_vecAppList.push_back(stcInfo);
}
}
return TRUE;
}

//计时器回调
void CDialogA::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
g_vecAppList.clear();
ListView_DeleteAllItems(GetDlgItem(IDC_LISTA)->m_hWnd); //获取List句柄
::EnumWindows(EnumTaskbarWnds, NULL); //枚举
showApp(); //刷新
CDialogEx::OnTimer(nIDEvent);
}






//遍历进程信息
void GetProcess()
{
m_vecProcessList.clear(); //清空容器
int nThread = 0; //线程总数
DWORD dwCount = 0; //进程总数
DWORD dwProcessID = 0;
WINDOW_INFO stcInfo = { 0 };

//创建进程快照(TH32CS_SNAPPROCESS表示创建所有进程的快照)
HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
//PROCESSENTRY32进程快照的结构体
PROCESSENTRY32 pe32;
//实例化后使用Process32First获取第一个快照的进程前必做的初始化操作
pe32.dwSize = sizeof(PROCESSENTRY32);
//下面的IF效果同:
//if(hProcessSnap == INVALID_HANDLE_VALUE) 无效的句柄
if (!Process32First(hSnapShot, &pe32))
{
return;
}
StringCbCopy(stcInfo.szProcessName, MAX_PATH, pe32.szExeFile);
stcInfo.nProcessID = pe32.th32ProcessID;
stcInfo.nThread = pe32.cntThreads;
stcInfo.nParentProcess = pe32.th32ParentProcessID;
stcInfo.nPriority = pe32.pcPriClassBase;
m_vecProcessList.push_back(stcInfo);
dwCount++;
while (Process32Next(hSnapShot, &pe32))
{
StringCbCopy(stcInfo.szProcessName, MAX_PATH, pe32.szExeFile);
stcInfo.nProcessID = pe32.th32ProcessID;
stcInfo.nThread = pe32.cntThreads;
stcInfo.nParentProcess = pe32.th32ParentProcessID;
stcInfo.nPriority = pe32.pcPriClassBase;
m_vecProcessList.push_back(stcInfo);
dwCount++;
}
CloseHandle(hSnapShot);
int nSize = m_vecProcessList.size();

for (int i = nSize - 1; i >= 0; i--)
{
nThread += m_vecProcessList[i].nThread;
AddList(
m_vecProcessList[i].szProcessName,
m_vecProcessList[i].nProcessID,
m_vecProcessList[i].nThread,
m_vecProcessList[i].nParentProcess,
m_vecProcessList[i].nPriority);
}
}


//遍历获取目标进程的线程信息
bool CDialogB::GetThread(DWORD dwPId)
{
m_vecThreadList.clear(); //清空容器
HANDLE hThread = NULL; // 线程句柄
HANDLE hThreadSnap = INVALID_HANDLE_VALUE; // 线程快照句柄
THREADENTRY32 stcTe32 = { 0 }; // 线程快照结构体
stcTe32.dwSize = sizeof(THREADENTRY32);
// 1. 创建一个线程相关的快照句柄
hThreadSnap = CreateToolhelp32Snapshot(
TH32CS_SNAPTHREAD, // 指定快照的类型
0); // 指定进程
if (hThreadSnap == INVALID_HANDLE_VALUE)
return false;
// 2. 通过线程快照句柄获取第一个线程信息
if (!Thread32First(
hThreadSnap, // 线程快照句柄
&stcTe32)) // 线程快照信息结构体
{
CloseHandle(hThreadSnap);
return false;
}
// 3. 清除线程向量信息,并循环遍历线程信息
m_vecThreadList.clear();
do
{
// 3.1 如图遍历到的线程属于本进程,则直接保存其信息
if (stcTe32.th32OwnerProcessID == dwPId)
m_vecThreadList.push_back(stcTe32);
} while (Thread32Next(hThreadSnap, &stcTe32));
// 4. 关闭句柄并退出函数
CloseHandle(hThreadSnap);
return true;
}



//获取当前进程的模块信息
void CpyName(PTCHAR szName, PTCHAR szPath)
{
int Index = 0;
int n = 0;
while (szPath[n])
{
if (szPath[n] == L'\\')
{
Index = n + 1;
}
n++;
}
StringCchCopy(szName, MAX_PATH, szPath + Index);
}


bool CDialogB::GetModule(DWORD dwPId)
{
// 1. 获取进程模块句柄表
m_vecModuleList.clear();
// 1.1 打开进程
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwPId);
// 1.2 确定保存模块句柄的数组大小
HMODULE hModules[0x1000] = { 0 }; // 模块数组
DWORD cbNeed = 0; // 实际获取的大小
EnumProcessModulesEx( /* 枚举进程模块 */
hProcess, // 进程句柄
hModules, // 模块句柄数组
sizeof(hModules), // 模块句柄数组的大小
&cbNeed, // 实际需要的数组大小
LIST_MODULES_ALL); // 枚举模块的类型
// 1.3 获取模块句柄表
DWORD dwModCount = cbNeed / sizeof(HMODULE); // 模块数量
HMODULE* pModBuf = new HMODULE[dwModCount]; // 保存模块句柄的缓存
EnumProcessModulesEx( /* 枚举进程模块 */
hProcess, // 进程句柄
pModBuf, // 模块句柄数组
dwModCount*sizeof(HMODULE), // 模块句柄数组的大小
&cbNeed, // 实际需要的数组大小
LIST_MODULES_ALL); // 枚举模块的类型
// 2. 枚举进程模块信息
TCHAR szModuleName[MAX_PATH] = _T("");
MODULEENTRY32 stcMod32 = { sizeof(MODULEENTRY32) };
MODULEINFO stcModInfo;
for (UINT i = 0; i < dwModCount; i++)
{
GetModuleFileNameEx(hProcess, pModBuf[i], stcMod32.szExePath, MAX_PATH);
GetModuleInformation(hProcess, pModBuf[i], &stcModInfo, sizeof(MODULEINFO));
stcMod32.modBaseAddr = (PBYTE)stcModInfo.lpBaseOfDll;
stcMod32.modBaseSize = stcModInfo.SizeOfImage;
stcMod32.th32ProcessID = dwPId;
//stcMod32.hModule = ::GetModuleHandle(stcMod32.szExePath);
//stcMod32.szModule = stcMod32.szExePath;
CpyName(stcMod32.szModule, stcMod32.szExePath);
m_vecModuleList.push_back(stcMod32);
}
CloseHandle(hProcess);
return true;
}
0 0