获取进程信息及每条进程所调用的dll

本文介绍如何获取Windows系统的进程列表,并详细列出每个进程所加载的DLL。通过创建进程快照,使用API函数获取进程ID、进程名和路径,再遍历模块以显示DLL信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

获取进程列表信息,并列举出每个进程所调用的DLL列表:

1.分别添加List Control,List Box控件,并关联对应的变量:

    CListCtrl m_listProcess;

    CListBox m_listDll;

2.添加头文件:

#include <TlHelp32.h>

#include "Psapi.h"
#pragma comment(lib, "Psapi.lib") 

3.添加获取进程信息的变量:

public:

        HANDLE  hProcessSnap ;
unsigned int uPId ;//保存进程PID
CString m_processName ;//保存进程名
CString m_processPath ;//保存进程路径

4.在初始化中设置并获取进程列表信息:

       m_listProcess.SetExtendedStyle(m_listProcess.GetExtendedStyle() |  LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP ) ;
m_listProcess.InsertColumn(0, _T("进程ID"), LVCFMT_LEFT, 70) ;
m_listProcess.InsertColumn(1, _T("进程名"), LVCFMT_LEFT, 90) ;
m_listProcess.InsertColumn(2, _T("进程路径"), LVCFMT_LEFT, 380) ;
GetProcessName() ;

5.GetProcessName()函数:

  //用于提权的
BOOL CXXXDlg::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 CXXXDlg::GetProcessName()
{
       hProcessSnap = NULL ;

if ( !EnableDebugPrivilege(1))
{
MessageBoxA( NULL, "提取失败", "提示", MB_OK | MB_ICONEXCLAMATION ) ;
}

//创建一个进程快照
hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0) ;
if ( hProcessSnap == INVALID_HANDLE_VALUE)
{
MessageBoxA(NULL, "列举进程失败", "提示", MB_OK | MB_ICONEXCLAMATION ) ;
return ;
}
PROCESSENTRY32 pe32 ;
pe32.dwSize = sizeof(pe32) ;

BOOL bProcess = Process32First( hProcessSnap, &pe32) ;
int nCount = 0 ;
while( bProcess )
{
uPId = pe32.th32ProcessID ;
m_processName = pe32.szExeFile ;

HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pe32.th32ProcessID ) ;
if ( hProcess )
{
HMODULE hModule ;
DWORD needed ;
WCHAR path[MAX_PATH] = {0} ;
//枚举进程
EnumProcessModules( hProcess, &hModule, sizeof(hModule), &needed) ;
            //获取进程的全路径
GetModuleFileNameEx( hProcess, hModule, path, sizeof(path)) ;//添加 #include "Psapi.h" ;获得某个正在运行的EXE或者DLL的全路径
m_processPath =  path ;
}
else
{
m_processPath = _T("无法获得进程路径") ;
}

                m_listProcess.InsertItem( nCount, LPSTR_TEXTCALLBACK) ;
CString m_processID ;
m_processID.Format(_T("%d"), uPId) ;
m_listProcess.SetItemText(nCount, 0,m_processID) ;
m_listProcess.SetItemText(nCount, 1, m_processName) ;
m_listProcess.SetItemText(nCount++, 2, m_processPath) ;

               bProcess = Process32Next( hProcessSnap, &pe32) ;
}
}


6.单击CListCtrl控件中的每一条进程记录,将所对应的进程调用的DLL列表显示在CListBox控件中:

  afx_msg void OnNMClickList4(NMHDR *pNMHDR, LRESULT *pResult);

  ON_NOTIFY(NM_CLICK, IDC_LIST4, &CXXXDlg:OnNMClickList4)

  

void CXXXDlg::OnNMClickList4(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;
int nItem = pNMItemActivate->iItem ;
CString m_processID =m_listProcess.GetItemText( nItem,0);
unsigned int n_ProcessId = _ttoi(m_processID) ;

CString m_StaticShow = _T("进程") ;
m_StaticShow += m_listProcess.GetItemText( nItem, 1) ;
m_StaticShow += _T("所调用DLL列表") ;
       GetDlgItem(IDC_SHOW)->SetWindowText(m_StaticShow) ;

HANDLE hProcessDll = NULL ;
MODULEENTRY32 me32  ;
me32.dwSize = sizeof(MODULEENTRY32) ;

hProcessDll = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, n_ProcessId) ;
BOOL  hProcess = NULL ;
hProcess = Module32First( hProcessDll, &me32) ;
while( hProcess && n_ProcessId != 0 )
{
                 m_listDll.AddString(me32.szExePath ) ;
hProcess = Module32Next( hProcessDll, &me32) ;
}
}


7.关闭窗口时关闭进程特权:

   void CXXXDlg::OnClose()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值

// 关闭特权
EnableDebugPrivilege(0);

// 关闭内核对象
CloseHandle(hProcessSnap ); 
CDialog::OnClose();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值