遍历进程线程服务任务

来源:互联网 发布:重庆市投标诚信分算法 编辑:程序博客网 时间:2024/06/05 07:46

// 遍历系统服务信息 
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
原创粉丝点击