效果图
// PE_View.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include "resource.h"
#include <commdlg.h>
#include <commctrl.h>
#include <tlhelp32.h>
#include <stdio.h>
#include <stdlib.h>
#pragma comment(lib,"comctl32.lib")
HINSTANCE hAPPInstance;
HWND hAppHwnd;
void EnumProcess(HWND hListProcess)//在列表框中显示内容的函数.
{
LV_ITEM vitem;
memset(&vitem,0,sizeof(LV_ITEM));
vitem.mask=LVIF_TEXT;
//这里是获取所有进程信息的代码
PROCESSENTRY32 pe32 = { 0 };//这个结构存放的是一个进程的信息
MODULEENTRY32 me32 = { sizeof(MODULEENTRY32) };
pe32.dwSize = sizeof(PROCESSENTRY32);
DWORD n=0;
HANDLE hProcessSnap =CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);// 获取全部进程快照
if (hProcessSnap!=INVALID_HANDLE_VALUE)//判断句柄是否有效
{
BOOL bRet = Process32First(hProcessSnap, &pe32);
while(bRet)
{
HANDLE hprocess=OpenProcess(PROCESS_ALL_ACCESS, FALSE,pe32.th32ProcessID);//这里必须要打开某一个进程的快照才能察看到里面的信息。
HANDLE hSnap_proc =CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pe32.th32ProcessID);//对某个模块进行快照。
Module32First(hSnap_proc, &me32);
vitem.pszText=pe32.szExeFile;
vitem.iItem=n;//行
vitem.iSubItem=0;//列
SendMessage(hListProcess, LVM_INSERTITEM,0,(DWORD)&vitem);
sprintf(vitem.pszText,TEXT("%d"), pe32.th32ProcessID);
vitem.iItem=n;//行
vitem.iSubItem=1;//列
//ListView_SetItem(hListProcess,&vitem);
SendMessage(hListProcess, LVM_SETITEM,0,(DWORD)&vitem);
sprintf(vitem.pszText,TEXT("%08X"), me32.modBaseAddr);
vitem.iItem=n;//行
vitem.iSubItem=2;//列
//ListView_SetItem(hListProcess,&vitem);
SendMessage(hListProcess, LVM_SETITEM,0,(DWORD)&vitem);
sprintf(vitem.pszText,TEXT("%08X"), me32.modBaseSize);
vitem.iItem=n;//行
vitem.iSubItem=3;//列
//ListView_SetItem(hListProcess,&vitem);
SendMessage(hListProcess, LVM_SETITEM,0,(DWORD)&vitem);
bRet = Process32Next(hProcessSnap, &pe32);
n++;
CloseHandle(hSnap_proc);
}
CloseHandle(hProcessSnap);
}
}
void EnumModule(HWND hwndDlg,WPARAM wparam,LPARAM lparam)//在列表框中显示内容的函数.
{
DWORD dwRowId;
LV_ITEM lv;
TCHAR szPid[0x20];
memset(&lv, 0, sizeof(LV_ITEM));
memset(&szPid, 0, 0x20);
dwRowId = SendMessage(hwndDlg, LVM_GETNEXTITEM, -1, LVNI_SELECTED);
if (dwRowId == -1)
{
MessageBox(NULL, TEXT("请选择进程"), TEXT("出错了"), MB_OK);
return;
}
lv.iSubItem = 1;
lv.pszText = szPid;
lv.cchTextMax = 0x20;
SendMessage(hwndDlg, LVM_GETITEMTEXT, dwRowId, (DWORD)&lv);
MessageBox(NULL, szPid, TEXT("PID"), MB_OK);
//根据PID 调用API,将内容插入 到插入到下面。
/***************************************/
LV_ITEM vitem;
memset(&vitem,0,sizeof(LV_ITEM));
vitem.mask=LVIF_TEXT;
//这里是获取所有进程信息的代码
PROCESSENTRY32 pe32 = { 0 };//这个结构存放的是一个进程的信息
MODULEENTRY32 me32 = { sizeof(MODULEENTRY32) };
pe32.dwSize = sizeof(PROCESSENTRY32);
DWORD n=0;
HANDLE hprocess=OpenProcess(PROCESS_ALL_ACCESS, FALSE,atoi(szPid));//这里必须要打开某一个进程的快照才能察看到里面的信息。
HANDLE hSnap_proc =CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, atoi(szPid));//对某个模块进行快照。
BOOL FLG= Module32First(hSnap_proc, &me32);
HWND hListProcess=GetDlgItem(hAppHwnd,IDC_LIST_MODULE);
SendMessage(hListProcess,LVM_DELETEALLITEMS,0,0);//先清空列表所有数据。
if(FLG)
{
do
{
vitem.pszText=me32.szModule;
vitem.iItem=n;//行
vitem.iSubItem=0;//列
SendMessage(hListProcess, LVM_INSERTITEM,0,(DWORD)&vitem);
vitem.pszText=me32.szExePath;
vitem.iItem=n;//行
vitem.iSubItem=1;//列
SendMessage(hListProcess, LVM_SETITEM,0,(DWORD)&vitem);
sprintf(vitem.pszText,"%d",n+1);
vitem.iItem=n;//行
vitem.iSubItem=2;//列
SendMessage(hListProcess, LVM_SETITEM,0,(DWORD)&vitem);
n++;
} while (Module32Next(hSnap_proc, &me32));
CloseHandle(hSnap_proc);
}CloseHandle(hprocess);
}
void InitProcess(HWND hDlg)//初始化成LIST 进程列表框 的值的函数,所有都在这里初使化.
{
/* typedef struct _LV_COLUMN
{
UINT mask; //屏蔽位的组合(见下面括号),表明哪些成员是有效的.
int fmt; 该列的表头和子项的标题显示格式(LVCF_FMT).可以是LVCFMT_CENTER、LVCFMT_LEFT或LVCFMT_RIGHT
int cx; //以像素为单位的列的宽度(LVCF_FMT)
LPTSTR pszText; //指向存放列表头标题正文的缓冲区(LVCF_TEXT)
int cchTextMax; //标题正文缓冲区的长度(LVCF_TEXT)
int iSubItem; //说明该列的索引(LVCF_SUBITEM)
} LV_COLUMN;*/
LV_COLUMN lv;//创建一个变量LV(list view)
HWND hListProcess;
memset(&lv,0,sizeof(LV_COLUMN));
hListProcess=GetDlgItem(hDlg,IDC_LIST_PROCESS);//获取名字PROCESS的控件句柄.
SendMessage(hListProcess,LVM_SETEXTENDEDLISTVIEWSTYLE,LVS_EX_FULLROWSELECT,LVS_EX_FULLROWSELECT);//设置整行可选的message
lv.mask=LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM;//窗口显示模式. 文本
lv.pszText=TEXT("进程名");//列标题.
lv.cx=200; //列宽.
lv.iSubItem=0; //索引.
SendMessage(hListProcess,LVM_INSERTCOLUMN,0,(DWORD)&lv); //界面显示必须要sendmessage,WINDOWS才知道下一步做什么,否则界面就不显示.
lv.mask=LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM|LVS_EX_GRIDLINES;//窗口显示模式. 文本
lv.pszText=TEXT("PID");//列标题.
lv.cx=100; //列宽.
lv.iSubItem=1; //索引.
SendMessage(hListProcess,LVM_INSERTCOLUMN,1,(DWORD)&lv);
lv.mask=LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM;//窗口显示模式. 文本
lv.pszText=TEXT("镜像基址");//列标题.
lv.cx=100; //列宽.
lv.iSubItem=2; //索引.
SendMessage(hListProcess,LVM_INSERTCOLUMN,2,(DWORD)&lv);
lv.mask=LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM;//窗口显示模式. 文本
lv.pszText=TEXT("镜像大小");//列标题.
lv.cx=100; //列宽.
lv.iSubItem=3; //索引.
SendMessage(hListProcess,LVM_INSERTCOLUMN,3,(DWORD)&lv);
EnumProcess(hListProcess);
}
void InitModule(HWND hDlg)//初始化成LIST 进程列表框 的值的函数,所有都在这里初使化.
{
LV_COLUMN lv;//创建一个变量LV(list view)
HWND hListModule;
memset(&lv,0,sizeof(LV_COLUMN));
hListModule=GetDlgItem(hDlg,IDC_LIST_MODULE);//获取名字hListModule的控件句柄.
SendMessage(hListModule,LVM_SETEXTENDEDLISTVIEWSTYLE,LVS_EX_FULLROWSELECT,LVS_EX_FULLROWSELECT);//设置整行可选的message
lv.mask=LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM;//窗口显示模式. 文本
lv.pszText=TEXT("模块名");//列标题.
lv.cx=200; //列宽.
lv.iSubItem=0; //索引.
SendMessage(hListModule,LVM_INSERTCOLUMN,0,(DWORD)&lv); //界面显示必须要sendmessage,WINDOWS才知道下一步做什么,否则界面就不显示.
lv.mask=LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM;//窗口显示模式. 文本
lv.pszText=TEXT("模块位置");//列标题.
lv.cx=400; //列宽.
lv.iSubItem=1; //索引.
SendMessage(hListModule,LVM_INSERTCOLUMN,1,(DWORD)&lv);
lv.mask=LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM;//窗口显示模式. 文本
lv.pszText=TEXT("序号");//列标题.
lv.cx=60; //列宽.
lv.iSubItem=2; //索引.
SendMessage(hListModule,LVM_INSERTCOLUMN,2,(DWORD)&lv);
//EnumModule(hListModule);
}
BOOL CALLBACK PEDialogProc(
HWND hwndDlg, // handle to dialog box
UINT uMsg, // message
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
switch(uMsg)
{
case WM_CLOSE:
EndDialog(hwndDlg,0);
break;
case WM_INITDIALOG : //
break;
case WM_COMMAND :
switch (LOWORD (wParam))
{
case IDC_BUTTON_PE:
return TRUE;
case IDC_BUTTON_ABOUT:
return TRUE;
case IDC_BUTTON_QUIT:
EndDialog(hwndDlg, 0);
return TRUE;
}
break ;
}
return FALSE ;
}
BOOL CALLBACK MAINDialogProc(
HWND hwndDlg, // handle to dialog box
UINT uMsg, // message
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
OPENFILENAME stopenfile;
TCHAR szPeFileExt[100]="*.sys;*.exe;*.dll;*.scr;*.drv";//提前定义需要筛选的文件类型。
hAppHwnd=hwndDlg;
switch(uMsg)
{
case WM_CLOSE:
EndDialog(hwndDlg,0);
break;
case WM_INITDIALOG : //
InitProcess(hwndDlg);
InitModule(hwndDlg);
break;
case WM_COMMAND :
switch (LOWORD (wParam))
{
case IDC_BUTTON_PE:
TCHAR szFileName[256];
memset(szFileName,0,256);
memset(&stopenfile,0,sizeof(OPENFILENAME));
stopenfile.lStructSize=sizeof(OPENFILENAME);//设置这结构体的大小。
stopenfile.Flags=OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST;//设置对话框的显示类型。
stopenfile.hwndOwner=hwndDlg;
stopenfile.lpstrFilter=szPeFileExt;//设置筛选的文件类型。//过滤器
stopenfile.lpstrFile=szFileName;
stopenfile.nMaxFile=MAX_PATH;
GetOpenFileName(&stopenfile);//此API为弹出打开文件的对话框 ,选中后文件路径就存储在szFileName中了。
// MessageBox(0,szFileName,0,0);
DialogBox(hAPPInstance,MAKEINTRESOURCE(IDD_DIALOG_PE),hwndDlg,PEDialogProc);
return TRUE;
case IDC_BUTTON_ABOUT:
return TRUE;
case IDC_BUTTON_QUIT:
EndDialog(hwndDlg, 0);
return TRUE;
}
break ;
case WM_NOTIFY:
{
NMHDR* pHnmhdr=(NMHDR*)lParam;
if (wParam==IDC_LIST_PROCESS && pHnmhdr->code==NM_CLICK)
{
EnumModule(GetDlgItem(hwndDlg,IDC_LIST_PROCESS),wParam,lParam);
}
}
break;
}
return FALSE ;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
hAPPInstance=hInstance;
INITCOMMONCONTROLSEX icex;
icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
icex.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&icex);
DialogBox(hInstance, MAKEINTRESOURCE (IDD_DIALOG_MAIN),NULL,MAINDialogProc);
return 0;
}