首页
社区
课程
招聘
[求助][求助]关于进程模块遍历重复问题
发表于: 2024-4-14 10:55 2310

[求助][求助]关于进程模块遍历重复问题

2024-4-14 10:55
2310

近期学习进程相关知识,我是用diaDlg模仿lordPE这个软件的开始界面,遍历进程的,但是在进程遍历模块的时候发现,我点一下进程pid,模块会给我重复打印,我已经初始化了模块的list,但是他依然给我重复打印,想问一下,我代码应该怎样修改,求教。进程模块遍历代码如下:
这段代码是指定某个进程pid,然后根据进程pid遍历相关模块的,目的是我点feige这个进程,模块列表只给我显示feige的模块,然后我点notepad的进程,只给我显示notepad的模块

void modulesview(HWND hwndDlg)
{
LV_COLUMN lv;
HWND hlistmodules;
//初始化
memset(&lv,0,sizeof(LV_COLUMN));
//获取IDC_LIST_PROCESS 句柄
hlistmodules=GetDlgItem(hwndDlg,IDC_LIST_MOUDLE);
//设置整行选中
SendMessage(hlistmodules,LVM_SETEXTENDEDLISTVIEWSTYLE,LVS_EX_FULLROWSELECT,LVS_EX_FULLROWSELECT);
//第一列
lv.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
lv.pszText = TEXT("模块名称"); //列标题
lv.cx = 200; //列宽
lv.iSubItem = 0;
//ListView_InsertColumn(hListProcess, 0, &lv);
SendMessage(hlistmodules,LVM_INSERTCOLUMN,0,(DWORD)&lv);
//第二列
lv.pszText = TEXT("模块位置");
lv.cx = 300;
lv.iSubItem = 1;
//ListView_InsertColumn(hListProcess, 1, &lv);
SendMessage(hlistmodules,LVM_INSERTCOLUMN,1,(DWORD)&lv);}

void enummodules(HWND hlistprocess,HWND hlistmodules,WPARAM wParam,LPARAM lParam)
{
DWORD dwrowid;
TCHAR szpid[20];
DWORD pid=0;
LV_ITEM lv;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
//初始化                       
memset(&lv, 0, sizeof(LV_ITEM));
lv.mask = LVIF_TEXT; // 指定我们需要的是文本
lv.iSubItem = 1; // 获取的列
lv.pszText = szpid; // 指定储存结果的缓冲区
lv.cchTextMax = sizeof(szpid)/sizeof(szpid[0]); // 指定缓存区大小
 
// 获取选择行
dwrowid = SendMessage(hlistprocess, LVM_GETNEXTITEM, -1, LVNI_SELECTED);
if (dwrowid == -1)
{
    MessageBox(NULL, TEXT("请选择进程"), TEXT("出错了"), MB_OK);
    return;
}
 
// 获取PID
SendMessage(hlistprocess, LVM_GETITEMTEXT, dwrowid, (LPARAM)&lv);
     // 解析PID
    sscanf(szpid, "%x", &pid);
HANDLE moudle = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid);
MODULEENTRY32 mi;
mi.dwSize = sizeof(MODULEENTRY32); // 初始化
    TCHAR buffer[0x20];
    memset(buffer,0,0x20);
    //初始化
    LV_ITEM lvitem;
    memset(&lvitem, 0, sizeof(LV_ITEM));
    lvitem.mask = LVIF_TEXT;
    lvitem.iItem = ListView_GetItemCount(hlistmodules);
    BOOL num=Module32First(moudle, &mi);
    sprintf(buffer,"%s",mi.szModule);
    // 添加模块名到列表
    lvitem.pszText = TEXT(buffer);
    lvitem.iItem=0;
    lvitem.iSubItem = 0;
    ListView_InsertItem(hlistmodules, &lvitem);
 
    sprintf(buffer,"%s",mi.szExePath);
    // 添加模块路径到列表
    lvitem.pszText =TEXT(buffer);
    lvitem.iItem=0;
    lvitem.iSubItem = 1;
    ListView_SetItem(hlistmodules, &lvitem);
CloseHandle(moudle);

}
相关效果图如下:

昨天搞了一下午,实在不知道怎么处理了,向大神求教


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 839
活跃值: (820)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2

用VC6与ListView_xxx这种控件API,比较繁琐。

你的问题在于只往list里添加column,却没有清除。自然会累积下去。

用ListView_DeleteAllItems或其它API试下。

最后于 2024-4-14 12:16 被adream2000编辑 ,原因:
2024-4-14 12:14
1
雪    币: 1151
活跃值: (244)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
adream2000 用VC6与ListView_xxx这种控件API,比较繁琐。你的问题在于只往list里添加column,却没有清除。自然会累积下去。用ListView_DeleteAllItems或其它API试下。
哦,原来是这样啊,真的太谢谢你了,问题解决了
2024-4-14 12:39
0
游客
登录 | 注册 方可回帖
返回
//