Code
1VOID ShowModuleInfo(HWND hwnd, PCTSTR pszModulePath) {
2
3 //清除显示区域的内容
4 SetWindowText(hwnd, TEXT("")); // Clear the output box
5 //第一个参数为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
31BOOL 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 font
39 //指定主窗口为固定间距样式
40 SetWindowFont(GetDlgItem(hwnd, IDC_RESULTS),
41 GetStockFont(ANSI_FIXED_FONT), FALSE);
42 //调用Dlg_PopulateProcessList初始化默认显示的ProcessList
43 // By default, show the running processes
44 Dlg_PopulateProcessList(hwnd);
45
46 return(TRUE);
47}
48
49
50/**////////////////////////////////////////////////////////////////////////////////
51
52//相应窗口大小改变的回调函数
53BOOL 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 //列表矩形信息存入rc
60 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//响应菜单选择事件的回调函数
76void 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 //置标示为TRUE
89 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 ID
116 //显示进程信息
117 ShowProcessInfo(GetDlgItem(hwnd, IDC_RESULTS), dw);
118 } else {
119 //响应模块列表状态下的选择项变化消息
120 // Index in helper listbox of full path
121 //通过一个关联的查询将存储在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就是进程的ID
139 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
162INT_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
177int 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 //////////////////////////////////
1VOID ShowModuleInfo(HWND hwnd, PCTSTR pszModulePath) {
2
3 //清除显示区域的内容
4 SetWindowText(hwnd, TEXT("")); // Clear the output box
5 //第一个参数为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
31BOOL 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 font
39 //指定主窗口为固定间距样式
40 SetWindowFont(GetDlgItem(hwnd, IDC_RESULTS),
41 GetStockFont(ANSI_FIXED_FONT), FALSE);
42 //调用Dlg_PopulateProcessList初始化默认显示的ProcessList
43 // By default, show the running processes
44 Dlg_PopulateProcessList(hwnd);
45
46 return(TRUE);
47}
48
49
50/**////////////////////////////////////////////////////////////////////////////////
51
52//相应窗口大小改变的回调函数
53BOOL 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 //列表矩形信息存入rc
60 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//响应菜单选择事件的回调函数
76void 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 //置标示为TRUE
89 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 ID
116 //显示进程信息
117 ShowProcessInfo(GetDlgItem(hwnd, IDC_RESULTS), dw);
118 } else {
119 //响应模块列表状态下的选择项变化消息
120 // Index in helper listbox of full path
121 //通过一个关联的查询将存储在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就是进程的ID
139 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
162INT_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
177int 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核心编程就是要用代码去改变这些结构然后相应的功能也就出来了