c++获取进程信息列表和进程所调用的dll列表



代码如下:

// -----------------------// 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 );
}

(0)

相关推荐

  • C/C++获取目录下的文件列表信息

    1.数据结构 复制代码 代码如下: struct dirent{    long d_ino;                 /* inode number 索引节点号 */    off_t d_off;                /* offset to this dirent 在目录文件中的偏移 */    unsigned short d_reclen;    /* length of this d_name 文件名长 */    unsigned char d_type;    

  • C++初始化函数列表详细解析

    在以下三种情况下需要使用初始化成员列表: 一,需要初始化的数据成员是对象的情况: 二,需要初始化const修饰的类成员: 三,需要初始化引用成员数据: 原因:C++可以定义引用类型的成员变量,引用类型的成员变量必须在构造函数的初始化列表中进行初始化.对于类成员是const修饰,或是引用类型的情况,是不允许赋值操作的,(显然嘛,const就是防止被错误赋值的,引用类型必须定义赋值在一起),因此只能用初始化列表对齐进行初始化.成员类型是没有默认构造函数的类.若没有提供显示初始化式,则编译器隐式使用成

  • C++双向循环列表用法实例

    本文实例讲述了C++双向循环列表用法.分享给大家供大家参考.具体如下: /* 双向循环链表 */ #include <iostream> using namespace std; //结构体构造链表的指针域和数据域 struct ChainNode { int data; //节点数据 ChainNode *left; //节点的前驱指针 ChainNode *right; //节点的后继指针 }; ////////////创建n个双向循环链表 并返回链表头指针///////// ChainN

  • c++ 构造函数的初始化列表

    首先,运行下图中的C++代码,输出是什么? 复制代码 代码如下: class A{private: int n1; int n2;public: A(): n2(0) , n1(n2 + 2) { } void Print() {  cout<<"n1:"<<n1<<",n2:"<<n2<<endl; }};int main(void){ A a; a.Print(); return 0;} 答案:输出n1

  • c++基础语法:构造函数初始化列表

    C++为类中提供类成员的初始化列表 类对象的构造 顺序是这样的:1.分配内存,调用构造函数 时,隐式/显示的初始化各数据 成员2.进入构造函数后在构造函数中执行一般计算 使用初始化列表有两个原因: 1.必须这样做:如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,而没有默认构造函数,这时要对这个类成员进行初始化,就必须调用这个类成员的带参数的构造函数,如果没有初始化列表,那么他将无法完成第一步,就会报错. 复制代码 代码如下: class  ABC  .

  • C++初始化列表学习

    何谓初始化列表与其他函数不同,构造函数除了有名字,参数列表和函数体之外,还可以有初始化列表,初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段.在C++中,struct和class的唯一区别是默认的克访问性不同,而这里我们不考虑访问性的问题,所以下面的代码都以struct来演示. 复制代码 代码如下: struct foo{    string name ;    int id ;    foo(string s, int i):name(s), id(i){} ; // 初始化列表}; 构

  • c++获取进程信息列表和进程所调用的dll列表

    复制代码 代码如下: // -----------------------// FileName: // ProcessInfo.h// remarks:// 基于应用层实现,有的进程,如杀软进程等获取不到调用的dll列表.// ----------------------- #pragma once#include <vector> struct ProInfo{    // 保存进程PID    unsigned int uPID;    // 保存进程名    CString strPr

  • Python利用psutil实现获取硬件,网络和进程信息

    目录 楔子 CPU 相关 内存相关 磁盘相关 网络相关 进程管理 进程管理操作 楔子 Python 有一个第三方模块叫 psutil,专门用来获取操作系统以及硬件相关的信息,比如:CPU.磁盘.网络.内存等等.下面来看一下它的用法,不过在使用之前需要先安装,直接 pip install psutil 即可. CPU 相关 获取 CPU 的逻辑核心数量 import psutil print(psutil.cpu_count())  # 12 # 或者使用 multiprocessing impo

  • 在Python中获取操作系统的进程信息

    本文主要介绍在 Python 中使用 psutil 获取系统的进程信息. 1 概述 psutil 是 Python 的一个进程和系统工具集模块,通过使用 psutil,我们可以在 Python 中获取操作系统中进程的相关信息. 本文中使用的 rpm 包为: python2-psutil.x86_64,该 rpm 包定义如下: python2-psutil.x86_64 : A process and system utilities module for Python 2 代码示例 下面给出一个

  • Python使用psutil获取进程信息的例子

    psutil是什么 psutil是一个能够获取系统信息(包括进程.CPU.内存.磁盘.网络等)的Python模块.主要用来做系统监控,性能分析,进程管理,像glances也是基于psutil写成的. 在不了解这个模块之前,我都是直接用subprocess去直接执行系统命令来取得进程信息,但是这样会多写很多系统命令行.psutil可以让我们更方便地获取进程信息. psutil获取进程信息 psutil可以获取进程信息,示例如下: >>> p = psutil.Process(27050)

  • VC实现获取当前正在运行的进程

    本文实例讲述了VC实现获取当前正在运行的进程.分享给大家供大家参考.具体实现方法如下: #include <windows.h> #include <tlhelp32.h> #include <stdio.h> int main(int argc,char* argv[]) { PROCESSENTRY32 pe32; //再使用这个结构体前先定义它的大小 pe32.dwSize=sizeof(pe32); //给系统内的所有进程拍一个快照 HANDLE hProces

  • Linux查看端口、进程情况及kill进程的方法

    看端口: ps -aux | grep tomcat 发现并没有8080端口的Tomcat进程. 使用命令:netstat –apn 查看所有的进程和端口使用情况.发现下面的进程列表,其中最后一栏是PID/Program name 发现8080端口被PID为9658的Java进程占用. 进一步使用命令:ps -aux | grep java,或者直接:ps -aux | grep pid 查看 就可以明确知道8080端口是被哪个程序占用了!然后判断是否使用KILL命令干掉! 方法二:直接使用 n

  • android使用百度地图SDK获取定位信息示例

    本文使用Android Studio开发. 获取定位信息相对简单,我们只需要如下几步: 第一步,注册百度账号,在百度地图开放平台新建应用.生成API_KEY.这些就不细说了,请前往这里:http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/key 第二步,下载sdk,地址:http://lbsyun.baidu.com/index.php?title=android-locsdk/geosdk-android-download

  • Python进程间通讯与进程池超详细讲解

    目录 进程间通讯 队列Queue 管道Pipe 进程池Pool 在<多进程并发与同步>中介绍了进程创建与信息共享,除此之外python还提供了更方便的进程间通讯方式. 进程间通讯 multiprocessing中提供了Pipe(一对一)和Queue(多对多)用于进程间通讯. 队列Queue 队列是一个可用于进程间共享的Queue(内部使用pipe与锁),其接口与普通队列类似: put(obj[, block[, timeout]]):插入数据到队列(默认阻塞,且没有超时时间): 若设定了超时且

  • JS HTML5 音乐天气播放器(Ajax获取天气信息)

    晚上要考软件工程,实在不想复习.写个播放器吧,这个只是个用来学习的小Demo,众多不完善之处,下面贴出源代码,如果要转载,请加上版权声明 PS:因为Ajax涉及到跨域获取天气信息,有两个版本,一个是直接跨域,IE10支持,其他的浏览器要改配置.另一个是服务器端的weather.php,获取天气信息返回json. weather.php就不写了,里面的对应路径存放对应的文件 演示地址: http://569375.ichengyun.net/fm/ 实现功能:音乐播放,进度调节(滑动模块),音量条

  • 微信开发之网页授权获取用户信息(二)

    在公众号的配置过程中,许多开发者会在菜单中加入HTML5页面,有时在页面内需要访问页面的用户信息,此时就需要网页授权获取用户基本信息 我们提醒大家:本文介绍讲述的内容是基于yii2.0框架 1.设置授权回调域名:开发 ---> 接口权限 找到"网页授权获取用户基本信息",点击后面对应的"修改",在弹框响应位置填写授权回调域名即可,此处的域名不需要加http:// (关于网页授权回调域名的说明详情可参考公众平台开发者文档) 2.获取授权 关于OAuth2.0博主

随机推荐