1

VOID ShowModuleInfo(HWND hwnd, PCTSTR pszModulePath)
{2

3
//清除显示区域的内容4
SetWindowText(hwnd, TEXT("")); // Clear the output box5
//第一个参数为TH32CS_SNAPPROCESS,第二个参数为默认值0返回全部进程6
CToolhelp thProcesses(TH32CS_SNAPPROCESS);7

PROCESSENTRY32 pe =
{ sizeof(pe) };8
BOOL fOk = thProcesses.ProcessFirst(&pe);9
AddText(hwnd, TEXT("Pathname: %s\r\n\r\n"), pszModulePath);10
AddText(hwnd, TEXT("Process Information:\r\n"));11
AddText(hwnd, TEXT(" PID BaseAddr Process\r\n"));12
//遍历进程13

for (; fOk; fOk = thProcesses.ProcessNext(&pe))
{14
CToolhelp thModules(TH32CS_SNAPMODULE, pe.th32ProcessID);15

MODULEENTRY32 me =
{ sizeof(me) };16
BOOL fOk = thModules.ModuleFirst(&me);17
//遍历进程中的每个线程18

for (; fOk; fOk = thModules.ModuleNext(&me))
{19

if (_tcscmp(me.szExePath, pszModulePath) == 0)
{20
AddText(hwnd, TEXT(" %08X %p %s\r\n"),21
pe.th32ProcessID, me.modBaseAddr, pe.szExeFile);22
}23
}24
}25
}26

27

28

/**////////////////////////////////////////////////////////////////////////////////29

30

31

BOOL Dlg_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{32
//设置图标33
chSETDLGICONS(hwnd, IDI_PROCESSINFO);34
//隐藏由于ComboBoxValue不支持字符而引入的ModelHelp控件35
// Hide the module-helper listbox.36
ShowWindow(GetDlgItem(hwnd, IDC_MODULEHELP), SW_HIDE);37

38
// Have the results window use a fixed-pitch font39
//指定主窗口为固定间距样式40
SetWindowFont(GetDlgItem(hwnd, IDC_RESULTS),41
GetStockFont(ANSI_FIXED_FONT), FALSE);42
//调用Dlg_PopulateProcessList初始化默认显示的ProcessList43
// By default, show the running processes44
Dlg_PopulateProcessList(hwnd);45

46
return(TRUE);47
}48

49

50

/**////////////////////////////////////////////////////////////////////////////////51

52
//相应窗口大小改变的回调函数53

BOOL Dlg_OnSize(HWND hwnd, UINT state, int cx, int cy)
{54

55
RECT rc;56
int n = LOWORD(GetDialogBaseUnits());57
//获取列表句柄58
HWND hwndCtl = GetDlgItem(hwnd, IDC_PROCESSMODULELIST);59
//列表矩形信息存入rc60
GetClientRect(hwndCtl, &rc);61
//设置列表的位置定义样式为不换行62
SetWindowPos(hwndCtl, NULL, n, n, cx - n - n, rc.bottom, SWP_NOZORDER);63
//获取主显示区句柄64
hwndCtl = GetDlgItem(hwnd, IDC_RESULTS);65
//设置主显示区位置66
SetWindowPos(hwndCtl, NULL, n, n + rc.bottom + n,67
cx - n - n, cy - (n + rc.bottom + n) - n, SWP_NOZORDER);68

69
return(0);70
}71

72

73

/**////////////////////////////////////////////////////////////////////////////////74

75
//响应菜单选择事件的回调函数76

void Dlg_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{77

78
//定义标示位是否当前显示为进程列表79
static BOOL s_fProcesses = TRUE;80

81

switch (id)
{82
//响应退出83
case IDCANCEL:84
EndDialog(hwnd, id);85
break;86
//响应Process菜单点击87
case ID_PROCESSES:88
//置标示为TRUE89
s_fProcesses = TRUE;90
//将ID_VMMAP菜单置为不可用91
EnableMenuItem(GetMenu(hwnd), ID_VMMAP, MF_BYCOMMAND | MF_ENABLED);92
//重绘ID_VMMAP菜单显示为灰色状态93
DrawMenuBar(hwnd);94
//初始化进程列表95
Dlg_PopulateProcessList(hwnd);96
break;97
//响应模块菜单点击事件98
case ID_MODULES:99
//设置ID_VMMAP为可用并重绘显示效果100
EnableMenuItem(GetMenu(hwnd), ID_VMMAP, MF_BYCOMMAND | MF_GRAYED);101
DrawMenuBar(hwnd);102
//将显示状态标志位置为非进程显示状态103
s_fProcesses = FALSE;104
//初始化模块列表105
Dlg_PopulateModuleList(hwnd);106
break;107
//响应来自列表的消息108
case IDC_PROCESSMODULELIST:109
//响应选择项发生变化消息110

if (codeNotify == CBN_SELCHANGE)
{111
//获取当前选中项112
DWORD dw = ComboBox_GetCurSel(hwndCtl);113

if (s_fProcesses)
{114
//响应进程显示状态下的选择项改变消息115
dw = (DWORD) ComboBox_GetItemData(hwndCtl, dw); // Process ID116
//显示进程信息117
ShowProcessInfo(GetDlgItem(hwnd, IDC_RESULTS), dw);118

} else
{119
//响应模块列表状态下的选择项变化消息120
// Index in helper listbox of full path121
//通过一个关联的查询将存储在MODULEHELP中的模块全路径读取出来122
dw = (DWORD) ComboBox_GetItemData(hwndCtl, dw);123
TCHAR szModulePath[1024];124
ListBox_GetText(GetDlgItem(hwnd, IDC_MODULEHELP),125
dw, szModulePath);126
ShowModuleInfo(GetDlgItem(hwnd, IDC_RESULTS), szModulePath);127
}128
}129
break;130
//响应菜单ID_VMMAP点击的消息131
case ID_VMMAP:132

STARTUPINFO si =
{ sizeof(si) };133
PROCESS_INFORMATION pi;134
TCHAR szCmdLine[1024];135
//获取ComboBox的句柄136
HWND hwndCB = GetDlgItem(hwnd, IDC_PROCESSMODULELIST);137
DWORD dwProcessId = (DWORD)138
//该ComboBox该选择项的Data就是进程的ID139
ComboBox_GetItemData(hwndCB, ComboBox_GetCurSel(hwndCB));140
//格式化命令字符串141
wsprintf(szCmdLine, TEXT("\"14 VMMap\" %d"), dwProcessId);142
//创建新进程传递命令字符串143
BOOL fOk = CreateProcess(NULL, szCmdLine, NULL, NULL,144
FALSE, 0, NULL, NULL, &si, &pi);145

if (fOk)
{146
//如果成功关闭对新进程句柄以及新进程主线程句柄的引用147
//使新进程能顺利退出在用户想让他退出时148
CloseHandle(pi.hProcess);149
CloseHandle(pi.hThread);150

} else
{151
//如果失败弹框152
chMB("Failed to execute VMMAP.EXE.");153
}154
break;155
}156
}157

158

159

/**////////////////////////////////////////////////////////////////////////////////160

161

162

INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{163
164

switch (uMsg)
{165
chHANDLE_DLGMSG(hwnd, WM_INITDIALOG, Dlg_OnInitDialog);166
chHANDLE_DLGMSG(hwnd, WM_SIZE, Dlg_OnSize);167
chHANDLE_DLGMSG(hwnd, WM_COMMAND, Dlg_OnCommand);168
//这里是消息映射169
}170
return(FALSE);171
}172

173

174

/**////////////////////////////////////////////////////////////////////////////////175

176

177

int WINAPI _tWinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int)
{178

179
//可调试状态很含糊有自己的理解了但是不会表达多看看吧明天补上180
CToolhelp::EnableDebugPrivilege(TRUE);181
DialogBox(hinstExe, MAKEINTRESOURCE(IDD_PROCESSINFO), NULL, Dlg_Proc);182
CToolhelp::EnableDebugPrivilege(FALSE);183
return(0);184
}185

186

187

/**///////////////////////////////// End of File //////////////////////////////////
哈哈看到这里整个程序的具体实现方法、功能之间的联系、其中包含的知识、以及结合以前所学想象一下程序为什么能运行、心里已经有底了。通过这几天的学习收获很多,对发现Windows核心编程有了一个初步的自己的认识。Windows好像就是一个巨大的错综复杂的数据结构,Windows核心编程就是要用代码去改变这些结构然后相应的功能也就出来了
posted on
浙公网安备 33010602011771号