版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、目录第一章基本原理1$1代码中涉及的概念1$1.2各个文件的作用2第二章功能实现3$2各个函数的功能3$2.1.1 必读函数 createprocess3$2.1.2 processinfo, cpp中各个主要的函数作用4$2.2功能4$2.3界面显示6第三章实现8$3.1 代码精读 processinfo.cpp8$3.2 彳弋码梢读 toolhelp.cpp18第四章实验心得26第一章基本原理$1.1代码中涉及的概念processinfo应用程序中主要是运用了 toolhelp函数来实现的。关于toolhelp 后面会具休写到。下面先写一下我在读代码时遇到的一些陌生的概念。1 进程在操作系
2、统屮进程(process)的定义是指一个程序在给定数据集合上的 一次执行过程,是系统进行资源分配和运行调度的独立单位。3内核对象每个内核对象只是内核分配的一个内存块,并且只能由该内核访问。该内存 块是一种数据结构,它的成员负责维护该对象的各种信息。有些数据成员(如安 全性描述符、使用计数等)在所有对象类型中是相同的,但人多数数据成员属于 特定的对象类型。例如,进程对象有一个进程id、一个基本优先级和一个退出 代码,而文件对彖则拥有一个字节位移、一个共享模式和一个打开模式。当调用一个用于创建内核对象的函数时,该函数就返回一个用于标识该对象 的句柄。为了使操作系统变得更加健壮,这些句柄值是与进程密
3、切和关的。内核对象句柄,是用来标识某个内核对象的一个id同一个对象的该id对 于每个进程是不同的。4快照定义:关于指定数据集合的一个完全可用拷贝,该拷贝包括相应数据在某个 时间点(拷贝开始的时间点)的映像。快照可以是其所表示的数据的一个副本, 也可以是数据的一个复制品。作用:为存储用户提供了另外一个数据访问通道,当原数据进行在线应用处 理时,用户可以访问快照数据,还可以利用快照进行测试等工作。5模块为完成某一功能所需的一段程序或子程序;或指能由编译程序、装配程序等 处理的独立程序单位;或指大型软件系统的一部分。6线程线程(thread)是”进程”屮某个单一顺序的控制流。一个标准的线程由线程id
4、,当前指令指针(pc),寄存器集合和堆栈组成。 在多线程os屮,通常是在一个进程屮包括多个线程,每个线程都是作为利 用cpu的基本单位,是花费最小开销的实体。7堆栈在程序屮,堆用于动态分配和释放程序所使用的对象。在以下情况屮调用堆1事先不知道程序所需对象的数量和大小。2对彖太大,不适合使用堆栈分配器。3.堆使用运行期间分配给代码和堆栈以外的部分内存。$1.2数据类型在windows应用程序设计中,既可以使用c的基本数据类型,也可以使 用windows自定义的数据类型,但是要注意的是,windows自定义的数据类型 的关键字都要大写。具体的数据类型可以在vc+中右击“go to definiti
5、on"查 看。$1.2各个文件的作用一般而言,每个c+/c程序通常由头文件(header files)和定义文件(definition files)组成。头文件作为一种包含功能函数、数据接口声明的载体文件,用于保存程序 的声明(declaration),而定义文件用于保存程序的实现(implementation)。在 processinfo 示例屮:processlnfo.cpp 是定义文件,toolhelp.h resource.h cmnhdr.h都是头文件。下面依次讲解各个文件1 cmnhdr.h所有范例程序皆在引入其他标头档前将cmnhdr.h标头档引入。该文件包含 了巨集码
6、、连结器的指示词以及其他贯穿所有范例应用程序的常见程序代码。当 想尝试某些不同的东西时,需要做的事就是修改cmnhdr.h,然后重新建置所有 范例应用程序。2 toolhelp.hprocessinfo应用程序小主要是运用了 toolhelp函数来实现的。作者用c+ 类封装了一个toolhelp快照。使得调用toolhelp变得更容易一些。4 processinfo. cpp 程序实现的主文件,代码实现中会具体分析。第二章功能描述$2.1各个函数的功能必读函数createprocess要想显示一个进程的信息,就必须要知道这个进程是怎样被创建的。进程通常被定义为一个正在运行的程序的实例,它由两个
7、部分组成:1一个是操作系统用來管理进程的内核对象。内核对象也是系统用來存放关于 进程的统计信息的地方。2. 另一个是地址空间,它包含所有可执行模块或dll模块的代码和数据。它 述包含动态内存分配的空间。如线程堆栈和堆分配空间。bool createprocess(pctstr pszapplicationname,/pszapplicationname指定要创建进程的应用程序名,如在此设置需要全名ptstr pszcommandline,/需要创建进程的命令行参数,一般第一个字符用来存储应用程序名,不需要 全地址psecurity_attributes psaprocess,描述进程的可继承特
8、征,为security_attributes结构体psecurity_attributes psathread,描述主线程皿可继承性bool blnherithandles,被创建的进程是否继承当前进程的内核操作权限dword fdwcreate,规定如何创建进程pvoid pvenvironment,/pvenvironment参数用于指向包含新进程将要使用的环境字符串的内存块。在犬多数情况下,为该参数传递null,使子进程能够继承它的父进程正 在使用的一组坏境字符串。pctstr pszcurdir,/ pszcurdir允许父进程设置子进程的当前驱动器和目录。如果木参数是null,则新进
9、程的工作目录将与生成新进程的应用程序的 口录相同。pstartupinfo psistartlnfo,位置窗口标题显示名称光标等信息,包含了控制台模式和窗体模式一般使用默认值但是需要初始化长度pprocess_information ppiprocinfo);当一个线程调用createprocess时,系统就会创建一个进程内核对彖,其初始 使用计数是1。该进程内核对彖不是进程本身,而是操作系统管理进程时使用 的一个较小的数据结构。可以将进程内核对象视为由进程的统计信息组成的个 较小的数据结构。然后,系统为新进程创建一个虚拟地址空间,并将可执行文件 或任何必要的dll文件的代码和数据加载到该进程
10、的地址空间中。$2.1.2 processlnfo.cpp中各个主要的函数作用这里只是介绍各个函数的作用,具体怎么实现我在代码梢度那里有注释。1. addtext(hwnd hwnd, pctstr pszformat,.)这个函数的作用是显示大文本框中的内容2. void dlg_populateprocesslist(hwnd hwnd)更新列裘显示内容3. void dlg_populatemodulelist(hwnd hwnd)更新模块的显示内容4pvoid getmodulepreferredbaseaddr(dword dwprocessid, pvoid pvmodule re
11、mote)该函数接受一个进程i d和该进程中的一个模块的地址。然后它查看该进程 的地址空间,找出该模块,并读取模块的标题信息,以确定该模块首选的基地址, 一个模块始终应该加载到它的首选基地址中。5. void showprocessinfo(hwnd hwnd, dword dwprocessid)显示进程的信息6. void showmoduleinfo(hwnd hwnd, pctstr pszmodulepath)显示模块信息7. bool dlg_oninitdialog(hwnd hwnd, hwnd hwndfocus, lparam 1 param) 设置图标8. bool dl
12、g_onsize(hwnd hwnd, uint state, int ex, int cy)相应窗口大小改变的回调函数9. void dlg_oncomniand(hwnd hwnd, int id, hwnd hwndctl, uint codenotify)响应菜单选择事件的回调函数10. int_ptr winapi dlg_proc(hwnd hwnd, uint umsg, wparam wparam, lparam iparam)消息映射$2.2功能当启动该程序时,便会出现图21所示的窗口。processinfo首先枚举口前正在运行的一组进程,并在顶部的组合框屮列出每个进 程的名
13、字和ido然后,第一个进程被选定,并在较大的编辑控件中显示关于该 进程的信息。可以看到,与该进程的id 一道显示的还有它的父进程的id,进 程的优先级类,以及该进程环境中当前止在运行的线程数目。 当查看这个进程列表时,可以使用vmmap菜单项(当查看模块信息时,该菜 单项禁用)。如果选定vmmap菜单项,可使vmmap示例应用程序启动运行。该应用 程序将在指定进程的地址空间中运行。模块信息部分显示了映射到进程的地址空间中的模块的列表(可执行文件和 dll文件)。固定模块是指进程初始化时隐含加载的模块。如果是显式加载的dll模块, 则显示dll的使用计数。第二个域显示映射模块的地址。如果模块不是
14、在它的 首选基地址上映射的,那么首选基地址显示在括号中。第三个域显示模块的大小 (用字节数表示)。最后显示的是模块的全路径名。线程信息部分显示了该进程 屮当前运行的一组线程。每个线程id和优先级均被显示。除了进程信息外,可 以选择modules!菜单项。这将使得processinfo能够枚举当前通过系统加载的模 块,并将每个模块的名字放入顶部的组合框。然后processinfo可以选定第-个 模块,并显示关于它的信息,如图22所示。图2-1图2-2$2.3界面显示1启动exe :在下拉列表屮列出每个进程的名字和id。亘)区下面则显示选中的进程的具体信息如下图所以:i process infor
15、aationprocesses! modules! vmmap!101 processl nfo. exe (0x000010e 4)01 processlnfo.exe (0x000010e4alg.exe (0x00000ef4)b aofengplatform. exe(0x00000228)(0x00001484)(0x0000038c)(0x000008f8)(0x00000984)(0x000002f8)(0x00000298)(0x00000290) (0x000007e8)(0x00000288)ccb certificate, exe (0x00000838) conime.
16、exe csrss.exe ctfmon.exe dtlite.exe explorer.exe hkcmd.exe igfxtray.exem sd tss rvr. exe(oxoooood 54)msmdsrv. exe (0x0000054) q d esk. exe (0x00000620)vtl/jpauuuuc.: winuuwbsysteji25adc0000225280c:indoussys t eu210000000385024c:documents and477bd000032768c:uindoussys t en476bc000045056c:uindoussys t
17、 en376680000679936c:uindoussys t en vkxescore.exe kxetray.exeisass. exe (0x000003d c)2查看暴风影音的进程和id如下图:f 易 process infor>ationlxji processes! modules! vmmap!| b aof engplatf orm. exe (0x00000228)prioritfil©name: baofengplatform.exemodulesinformation:usagebaseaddr(imagaddr)sizefixed00400000380
18、928fixed7c920000614400fixed7c8000001171456fixed71a2000094208fixed77da0000692224fixed77e50000602112fixed77fc000069632fixed77be0000360448fixed71a1000032768fixed10000000110592fixed77bd000032768到4叫jpid=00000228z parentpid=000013d0z1 tiiiiiiiiri upuuuuuuuupu d 0 mdccccccccdc3 选择modules!菜单项。processinfo能够枚
19、举当前通过系统加载的模块, 并将每个模块的名字放入顶部的组合框。点击暴风的那一栏 如下图所示:uri.xiprocesses! modules!|baofe ngplatfomrexepathname: d:programfilesbaofengstormp1ayerbao f eprocess information:pid baseaddr0000022800400000processbaofengplatf orm exe第三章实现$ 3.1 代码精读 processlnfo.cpp/»“ ” “”“ “ ”“丄.“丄.«x*“ “ ”丄.“” *” * ” “ ”
20、“” *” 匕 /* ” 匕 /*“/ pp 沪p<t*p p <t* p <t* p <t*<t* pp 沪沪pp 沪沪 p 9t pmodule: processlnfo.cppnotices: copyright (c) 2000 jeffrey richter*1*1*1ig *ij ig *1*1ig *ij*1*1*1 £g*ij £g/tv"tv"tv"tv"tv"tv"tv"tv "tv"tv#x% *tv"tv #include
21、 u.cmnhdehu#include <windowsx.h>#include <tlhelp32.h>/*链接时要换成实际的路径*/编写windows程序必须要包含的头文件#include <tcha匚h> #include <stdarg.h>#include <stdio.h> #include "toolhelp.h"应用程序要显示的信息基本都是通过调用toolhelp的各个函数 现的#include nresource.hn/显示人文本框屮的内容void addtext(hwnd hwnd, pctst
22、r pszformat,.) vaist arglist; va_start(arglist, pszformat);是在c语言中解决变参问题的一组宏广vastart宏初始化变量刚定义的va_list变量,这 个宏的第二个参数是第一个可变参数的前一个参数,是 一个固定的参数。*/tchar sz20 * 1024;edit_gettext(hwnd, sz, chdimof(sz);/chdimof 是一个宏#define chdimof(array) (sizeof(array) / sizeof(array0)_vstprintf(_tcschr(sz, 0), pszformat, ar
23、glist);格式化字符串到指定内存位置_tcschr(sz, o)sz中有以0为ascii的字符的位置, /pszformat为格式,arg list nj'变参数列表edit_settext(hwnd, sz);va_end(arglist);/va_end宏结束可变参数的获収。然后就可以在函数里便用第二个参数了。 如果函数有多个町变参数的,依次调用va_arg获取各个参数。/更新列表显示内容void dlg_populatcproccsslist(hwnd hwnd) hwnd hwndlist = getdlgitem(hwnd, 1dc_processmodulelist);
24、通过资源id获取列表框旬柄setwindowredraw(hwndlist, false);禁止重绘combobox_resetcontent(hwndlist);/cb_resetcontent 此消息清空列表所冇项ctoolhelp thprocesses(th32cs_snapprocess); 包含 了 全部系统进程信息processentry32 pe = sizeof(pe) ; /processentry32 进程入 口 点信息boolfok = thprocesses.processfirst(&pe); 将第一个进程的入口点信息存入 pefor (; fok; fok
25、 = thprocesses.processnext(&pe) 遍历所有进程tcharszl1024j;/ place the process name (without its path) & id in the list返回文件名所在位置的指针pctstr pszexefile = _tcsrchr(pe.szexefile, textcw');if (pszexefile = null) pszexefile = pe.szexefile;只有文件名没路径的情况下上一句返回空指针else pszexefile+; / skip over the slash如果是全
26、路径的话需要去掉文件名前的斜线 wsprintf(sz, text("%s (0x%08x)"), pszexefile, pe.th32processid);格式化到字符串int n = combobox_addstring(hwndlist, sz);为列表框添加一个选项文字返回值是从0开始的索引combobox_setltemdata(hwndlist, n, pe.th32processid);/设置列表框该条记录的值为th32proccssid方便程序访问valuecombobox_setcursel(hwndlist, 0); / select the firs
27、t entry 设置默认显示的值forward_wm_command(hwnd, idc.processmodulelist, hwndlist, cbn_selchange, sendmessage);当用户在list box of a combo box屮改变选择项时windows将会发送wparm高位为 cbn_selchange 的 wm.command 消息setwindowredraw(hwndlist, true); 设置列表为可重绘状态invalidaterect(hwndlist, null, false);使客户区域无效为了发送wm_parint重绘列表框/void dlg
28、_populatemodulelist(hwnd hwnd) hwnd hwndmodulehelp = getdlgitem(hwnd, idc_modulehelp);根据父窗口句柄和资源id获取控件句柄listbox_resetcontent(hwndmodulehelp);ctoolhelp thprocesses(th32cs_snapprocess); 禁止窗体重绘processentry32 pe = sizeof(pe) ;/获取笫一个进程入口点信息存入pebool fok = thprocesses.processfirst(&pe); for (; fok; fok
29、 = thproccsscs.proccssncxt(&pc)获取进程加载模块的信息ctoolhelp thmodules(th32cs_snapmodule, pe.th32processld);moduleentry32 me = sizcof(mc) ; 定义模块入口点信息并初始化氏度 bool fok = thmodules.modulefirst(&me); /获取该进程第-个模块入口点信息并 存入mefor (; fok; fok = thmodules.modulenext(&me) 循环获取模块入口点信息在列表屮杳找当前模块信息是否已经被添加 int n
30、 = listbox_findstringexact(hwndmodulchclp, -1, mc.szexcpath); if (n = lb_err) /this module hasn't been added before模块信息还未被添加则添加listbox_addstring(hwndmodulehelp, mc.szexcpath);hwnd hwndlist = getdlgitem(hwnd, idc_processmodulelist);获取进程列表框句setwindowredraw(hwndlist, false); /设置进程列表框为不可重绘 combobox_
31、resetcontent(hwndlist);int nnummodulcs = listbox_gctcount(hwndmodulchclp);获収当前所有已添加的模块数量for (int i = 0; i < nnummodules; i+)tchar szfl()24;listbox_gettext(hwndmodulehelp, i, sz); 循环获取模块信息存储 szint nlndex = combobox_addstring(hwndlist, _tcsrchr(sz, text('w') + 1);将模块名加入comboboxcombobox_seti
32、temdata(hwndlist, nlndex, i); 设置索弓i/ nlndex的值是不确定的/i的作用就是规范排序并且将combobox与 /idc_modulehelp对应combobox_setcursel(hwndlist, 0); / select the first entry/ simulate the user selecting this first item so that the/ results pane shows something interestingforward_wm_command(hwnd, idc_processmodulelist, hwndl
33、ist, cbn_selchange, sendmessage);setwindowredraw(hwndlist, true);invalidatcrcct(hwndlist, null, false);/pvoid getmodulepreferredbaseaddr(dword dwprocessid, pvoid pvmoduleremote) pvoid pvmodulcprcfcrrcdbascaddr = null;image_dos_header idh;image_nt_headers inth;/ read the remote module's dos heade
34、rtoolhclp32rcadproccssmcmory(dwproccssid,pvmoduleremote, &idh, sizeof(idh), null);/ verify the dos image header/c_magic为dos 口j执行文件标记讦(idh.c_magic = image_dos_signature) / read the remote module's nt header/ejfanew是当前dos头(pvmoduleremote)是相对实际pe头标的相对偏移量 toolhelp32readprocessmemory(dwprocessid,
35、(pbyte) pvmoduleremote + idh.e_lfanew, &in(h, sizeof(inth), null);/ verify the nt image header讦(inth.signature = image_nt_signature) / this is valid nt header, get the image's preferred base address pvmodulepreferredbaseaddr = (pvoid) inth.optionalheader.imagebase;return(pvmodulepreferredbas
36、eaddr);/void showprocessinfo(hwnd hwnd, dword dwprocessid) setwindowtext(hwnd, text(“”); /清除显示区域的内容 ctoolhelp th(th32cs_snapall, dwprocessid);显示进程的信息processentry32 pe = sizeof(pe) ;bool fok = th.processfirst(&pe);for (; fok; fok = th.proccssncxt(&pc) if (pe.th32processid = dwprocessid) addte
37、xt(hwnd, text("filename: %srn"), pe.szexefile);addtext(hwnd, text(n pid=%()8x, parentpid=%()8x,n)text(npriorityclass=%d, thrcads=%d, heaps=%drnh), pe.th32processid, pe.th32parentprocessid, pe.pcpriclassbase, tthreads, th.howmanyheaps();break; / no need to continue looping/ 显不 modules/显示地址用
38、的字符数const int cchaddress = sizeof(pvoid) * 2;addtext(hwnd, text("rnmodules information:rnu)text(" usage %-*s(%-*s) %8s modulernh), cchaddress, text(ubaseaddrm),cchaddrcss, text(uimagaddr"), text(“sizc”);moduleentry32 me = sizeof(me) ;fok = th.modulefirst(&me);for (; fok; fok = th.
39、modulenext(&me) 讦(mc.proccntusagc = 65535) / module was implicitly loaded and cannot be unloaded加载方式为隐式加载不能被卸载addtext(hwnd, text(” fixed”); else addtcxt(hwnd, text(h %5dm), mc.proccntusagc);/首选的加载地址和现实的加载地址首选的放在pe结构屮也就是硬盘上pvoid pvpreferredbaseaddr =getmodulepreferredbaseaddr(pe.th32processid, mc
40、.modbascaddr);if (me.modbaseaddr = pvpreferredbaseaddr) addtext(hwnd, text(h %p %*s%8u %srnu),me.modbaseaddr, cchaddress, text(”), me.modbasesize, me.szexepath); else addtext(hwnd, text(”%p(%p) %8u %srnu),me.modbaseaddr, pvpreferredbaseaddr, me.modbasesize, me.szexepath); / show threads in the proce
41、ss显示进程中的线程信息id和优先级addtext(hwnd, text("rnthread information:rnu)text(“ tid priorityrn“); threadentry32 te = sizeof(te) ;fok = th.threadfirst(&te);for (; fok; fok = th.threadnext(&") 获収线程的时候并不指定进程id/卜血是一段线程优先级的算法if (te.th32ownerprocessld = dwprocessid) int npriority = te.tpbasepri +
42、te.tpdeltapri;if (te.tpbasepri < 16) && (npriority > 15) npriority = 15;if (te.tpbasepri > 15) && (npriority >31) npriority = 31; 讦(te.tpbasepri < 16) && (npriority <1) npriority =1;讦(te.tpbasepri > 15) && (npriority < 16) npriority = 16; addte
43、xt(hwnd, text(h %08x%2dw'),te.th32threadid, npriority);lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllvoid showmoduleinfo(hwnd hwnd, pctstr pszmodulepath) setwindowtext(hwnd, text(”); / 清除显示区域的内容/笫一个参数为th32cs_snapprocess,第二个参数为默认值0返回全部进程ctoolhelp thprocesses(th32c
44、s_snapprocess);processentry32 pe = sizeof(pe) ;bool fok = thprocesses.processfirst(&pe);addtcxt(hwnd, text("pathname: %srnrn"), pszmodulepath);addtext(hwnd, text("process information:rn");addtext(hwnd, text(”p1d baseaddr processrnu);for (; fok; fok = thprocesses.processnext(&
45、amp;pe)用for循环遍历进程ctoolhelp thmodules(th32cs_snapmodule, pe.th32processid);moduleentry32 me = sizeof(me) ;bool fok = thmodules.modulefirst(&me); 遍历进程屮的每个线程for (; fok; fok = thmodules.modulenext(&me) 讦(_tcscmp(mc.szexcpath, pszmodulepath) = 0) addtext(hwnd, text(“ %08x %p %srn”),pe.th32process
46、ld, me.modbaseaddr, pe.szexefile);illllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllbool dlg_oninitdialog(hwnd hwnd, hwnd hwndfocus, lparam iparam) 设置图标chsetdlgicons(hwnd, 1di_processinfo);/ hide the module-helper listbox.隐藏山于comboboxvalue不支持字符而引入的modelhelp控件 showwindow(
47、getdlgitem(hwnd, idc_modulehelp), sw_hide);指定主窗口为固定间距样式setwindowfont(getdlgitem(hwnd, idc_results), getstockfont(ansi_flxed_font), false);调用 dlg_populateprocesslist 初始化默认显示的 processlist/ by default, show the running processes dlg_populateprocesslist(hwnd);return(true);lllllllllllllllllllllllllllllll
48、llllllllllllllllllllllllllllllllllllllllllllllll相应窗口大小改变的回调函数bool dlg_onsizc(hwnd hwnd, uint state, int ex, int cy) rect rc;int n = loword(getdialogbaseunits();hwnd hwndc什二 gctdlgitcm(hwnd, idc_processmodulelist); /获取列表句柄getclientrect(hwndctl, &rc); /列表矩形信息存入 rcsetwindowpos(hwndctl, null, n, n,
49、ex - n - n, rc.bottom, swp_nozorder);/设置列表的位置定义样式为不换行hwndctl = getdlgitem(hwnd, idc.results); /获取主显示区句柄 sctwindowpos(hwndctl, null, n, n + rc.bottom + n,设置主显示区位置ex - n - n, cy - (n + rc.bottom + n) - n, swp_nozorder);return(o);/响应菜单选择事件的回调函数void dlg_oncommand(hwnd hwnd, int id, hwnd hwndctl, uint co
50、dcnotify) static bool s_fprocesses = true; 定义标示位是否当前显示为进程列表switch (id) case idcancel: 响应退出enddialog(hwnd, id);break;case id.processes: 响应 process 菜单点击 s_fprocesses = true; 置标示为 trueenablemenuitem(getmenu(hwnd), id_vmmap, mf_bycommand i mf_enabled); 将id_vmmap菜单置为不可用drawmenubar(hwnd); 重绘id vmmap菜单显示为灰
51、色状态 dlg_populatcproccsslist(hwnd); /初始化进程列表 break;case id_modules: 响应模块菜单点击事件enablemenuitem(getmenu(hwnd), id_vmmap, mf.bycommand imf_grayed); 设置id_vmmap为可用并重绘显示效果drawmcnubar(hwnd);s_fprocesses = false;将显示状:态标志位置为非进程显示状态 dlg_populatemodulelist(hwnd); 初始化模块列表break;case idc_processmodulelist: 响应来口 列表的
52、消息if (codenotify = cbn_selchange) 响应选择项发生变化消息 dword dw = combobox_getcursel(hwndctl); 获取当前选屮项 if (s_fprocesses) 响应进程显示状态下的选择项改变消息dw = (dword) combobox_gctitcmdata(hwndctl, dw); / process id showprocessinfo(getdlgitem(hwnd, idc_results), dw); 显示进程信息 else 响应模块列表状态下的选择项变化消息通过一个关联的查询将存储在modulehelp中的模块全路
53、径 读取出来/ index in helper listbox of full pathdw = (dword) combobox_getitemdata(hwndctl, dw);tchar szmodulepathf 10241;listbox_gcttcxt(gctdlgitcm(hwnd, idc_modulehelp),dw, szmodulepath);showmoduleinfo(getdlgitem(hwnd, 1dc_results), szmodulepath);break;case id_vmmap: 响应菜单id_vmmap点击的消息 startupinfo si =
54、sizeof(si) ;processjnformation pi;tchar szcmdlinc1024;获取combobox的句柄hwnd hwndcb = getdlgitem(hwnd, idc.processmodulelist); dword dwprocessid = (dword)该combobox该选择项的data就是进程的idcombobox_gctitcmdata(hwndcb, combobox_gctcurscl(hwndcb);格式化命令字符串wsprintf(szcmdline, text("t4 vmmapv %d"), dwprocessid);bool fok = createprocess(null, szcmdline, null, null, false, 0, null, null, &si, &pi);if (fok) 如果成功关闭対新进程句柄以及新进程主线程句柄的引用使新进程能顺利退出在用户想让他退出时
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 八年级上册语文课件
- 承包生鲜肉超市合同模板
- 电厂橡胶采购合同模板
- 老板与员工签合同模板
- 雇用合同模板2篇模板
- 装修 仓库出租合同模板
- 母婴店合股合同模板
- 赠与人民币合同模板
- 购买帐篷合同模板
- 农村建房土地合同模板
- 《整式的加减》专项练习100题(有答案)
- 《食品雕刻》授课教案
- 分布式光伏发电项目并网验收调试报告
- 企业发展规划部工作总结
- 咖啡厅室内设计PPT
- 北师大一年级数学上册期中测试卷及答案
- 小学二年级上册美术课件-5.17漂亮的钟-岭南版(14张)ppt课件
- 苏教版六年级上册音乐教案全册
- 江苏某市政道路地下通道工程深基坑支护及土方开挖施工专项方案(附图)
- 生物校本教材—生活中的生物科学
- 北京市建筑施工起重机械设备管理的若干规定
评论
0/150
提交评论