zoukankan      html  css  js  c++  java
  • 获取进程信息

    // ------------------------------------------------------------------------------------------------------------------------
    // FileName: 
    //     ProcessInfo.h
    // remarks:
    //      基于应用层实现,有的进程,如杀软进程等获取不到调用的dll列表。
    // ------------------------------------------------------------------------------------------------------------------------
    
    #pragma once
    #include <vector>
    
    struct ProInfo
    {
        // 保存进程PID
        unsigned int uPID;
        // 保存进程名
        CString strPrceName;
        // 保存进程路径
        CString strFullPath;
        // 保存该进程调用dll名和路径
        std::vector<CString> strDLLNameArr;
    };
    
    class CProcessInfo
    {
    private:
        // 这个用于提权的
        BOOL EnableDebugPrivilege (BOOL fEnable);
    public:
        // 保存进程名
        std::vector<ProInfo> strPrceInfoArr;
    
        CProcessInfo();
        ~CProcessInfo();
    
        // 获取进程名
        void GetProcessName (void);
    };
    // ------------------------------------------------------------------------------------------------------------------------
    // FileName: 
    //     ProcessInfo.cpp
    // remarks:
    //      基于应用层实现,有的进程,如杀软进程等获取不到调用的dll列表。
    // ------------------------------------------------------------------------------------------------------------------------
    
    #include "stdafx.h"
    #include "ProcessInfo.h"
    #include "TlHelp32.h"
    #include "StrSafe.h"
    #include "Psapi.h"
    // 防止错误 error LNK2019
    #pragma comment(lib, "psapi.lib")
    
    CProcessInfo::CProcessInfo()
    {
    
    }
    
    CProcessInfo::~CProcessInfo()
    {
    
    }
    
    BOOL CProcessInfo::EnableDebugPrivilege(BOOL fEnable)
    {  
        BOOL fOk = FALSE;   
        HANDLE hToken;
    
        // 得到进程的访问令牌
        if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES,&hToken))
        {    
            TOKEN_PRIVILEGES tp;
            tp.PrivilegeCount = 1;
            // 查看系统特权值并返回一个LUID结构体 
            LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
            tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0;
            // 启用/关闭 特权
            AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
            fOk = (GetLastError() == ERROR_SUCCESS);
            CloseHandle(hToken);
        }
        else
        {
            return 0;
        }
        return(fOk);
    }
    
    void CProcessInfo::GetProcessName (void)
    {
        HANDLE hProcessSnap = NULL;
        HANDLE hProcessDll = NULL;
        BOOL bRet = FALSE; 
        // 初始化dwSize为0,不然Process32First执行失败
        PROCESSENTRY32 pe32 = {0};
        MODULEENTRY32 me32;
        LPVOID lpMsgBuf;
        LPVOID lpDisplayBuf;
        DWORD dwError;
        ProInfo proinfo;
        LPCTSTR pszFormat = TEXT("开始服务时遇到错误! %s");
    
        // 创建一个进程快照
    
        if(!EnableDebugPrivilege(1))
        {
            MessageBox(NULL, _T("提权失败!"), _T("提示"), MB_OK|MB_ICONEXCLAMATION);
        }
    
        hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    
        if (hProcessSnap == INVALID_HANDLE_VALUE)
        {
            dwError = GetLastError();
            FormatMessage(
                FORMAT_MESSAGE_ALLOCATE_BUFFER|
                FORMAT_MESSAGE_FROM_SYSTEM|
                FORMAT_MESSAGE_IGNORE_INSERTS,
                NULL,
                dwError,
                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                LPTSTR(&lpMsgBuf),
                0,
                NULL);
    
            lpDisplayBuf = (LPVOID)LocalAlloc(
                LMEM_ZEROINIT,
                (lstrlen((LPCTSTR)lpMsgBuf)+lstrlen(pszFormat))*sizeof(TCHAR));
    
            // 格式化字符串
            StringCchPrintf(
                (LPTSTR)lpDisplayBuf,
                LocalSize(lpDisplayBuf),            // 字节数
                pszFormat,
                lpMsgBuf);
    
            CString strTemp;
            strTemp.Format(TEXT("错误编码为:%d"), dwError);
            ::MessageBox(NULL, (LPCTSTR)lpDisplayBuf, strTemp, MB_OK|MB_ICONEXCLAMATION);
            // 清理分配的内存
            LocalFree(lpMsgBuf);
            LocalFree(lpDisplayBuf);
    
            return;
        }
    
        pe32.dwSize = sizeof(PROCESSENTRY32); 
    
        Module32First(hProcessSnap, &me32);
    
        if (Process32First(hProcessSnap, &pe32)) 
        { 
            do 
            {     
                WCHAR path[MAX_PATH]={0};
    
                proinfo.uPID = pe32.th32ProcessID;
                proinfo.strPrceName = pe32.szExeFile;
                
                HMODULE hModule;
                HANDLE hProcess;
                DWORD needed;
                hProcess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, pe32.th32ProcessID); 
                if (hProcess) 
                {
                    // 枚举进程
                    EnumProcessModules(hProcess, &hModule, sizeof(hModule), &needed); 
                    // 获取进程的全路径
                    GetModuleFileNameEx(hProcess, hModule, path, sizeof(path));
                    // 保存路径
                    proinfo.strFullPath = path;
                }
                else
                {
                    proinfo.strFullPath = _T("无法获得进程路径");
                }
                strPrceInfoArr.push_back(proinfo);
            } 
            while (Process32Next(hProcessSnap, &pe32)); 
        } 
    
        std::vector<ProInfo>::iterator iter;
        for (iter = strPrceInfoArr.begin(); iter != strPrceInfoArr.end(); iter++)
        {
            // 获取该进程的快照
            hProcessDll = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, iter->uPID);
            me32.dwSize = sizeof(MODULEENTRY32);
            if (!Module32First(hProcessDll, &me32 ) || iter->uPID==0)
            {
                continue;
            }
            do
            {  
                iter->strDLLNameArr.push_back(me32.szExePath);
            } 
            while( Module32Next(hProcessDll, &me32));
        }
        
        // 关闭特权
        EnableDebugPrivilege(0);
        // 关闭内核对象
        CloseHandle(hProcessSnap ); 
    }
  • 相关阅读:
    Ajax学习感悟
    C#自定义控件designmodel的判断
    Asp.net+Flash多文件上传
    .net下帮助文件(sandcastle)
    水晶报表小例用于学习
    WinAPI转C#利器
    利用HttpHandler和Cache统计点击量
    关于C#调用API的理解(汇多考勤机HD4K)
    ubuntu 12.04 配置PHP開發環境遇到的問題
    windows 7 系統在VMWear workstation 9上安裝Mac OS X 10.7
  • 原文地址:https://www.cnblogs.com/calm2012/p/2857706.html
Copyright © 2011-2022 走看看