Windows平台监控目标进程及需注意的问题
2015-01-16 11:22
246 查看
最近项目中需要监控目标进程并抓取其信息,定位对方进程一般有两种方式:1、Hook系统函数CreateProcess;2、抓取进程快照,采用轮询的方式获取目标进程;
此处采用第二种方式,代码如下(有简单注释):
以上代码使用过程中,内存很快被消耗完,净查阅MSDN文档后发现,使用CreateToolhelp32Snapshot创建进程快照后,需使用CloseHandle关闭其句柄,以释放内存。需要注意的是在WinNT中使用CloseHandle释放内存,而在WinCE(还有人用吗,哈哈)中要使用CloseToolhelp32Snapshot关闭快照释放内存。
祝好!
欢迎斧正,望您不吝赐教!
此处采用第二种方式,代码如下(有简单注释):
TMyProcess = class private Fhandle: Cardinal; Fprocessid: Cardinal; Fpath :string; public property processid:Cardinal read Fprocessid write Fprocessid; property handle:Cardinal read Fhandle write Fhandle; property path:string read Fpath write Fpath; end;
function FindProcess(pname: string;var processInfo: TMyProcess): BOOL; var hnd : hwnd;//句柄 AhProcess :Cardinal; fprocessentry32 : TProcessEntry32; //结构类型的变量 flag,included: Boolean; //返回一个布尔值(用来判断是否找到进程信息) processid : dword; //储存找到的进程ID name,szProcessName: string; //储存找到的进程名称 end; i,index:Integer; Info: TMyProcess ; begin Result := False; try Debug.debug('监控线程打开'); {此处增加一个事件 用来同步 遍历完进程后 如果需要在其他线程(如主进程中处理) 可用于同步 } hnd := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //获得进程快照句柄 fprocessentry32.dwSize := sizeof(fprocessentry32); //给TProcessEntry32结构的第一个参数赋值(也可以理解为把这个结构的第一个参数初始化) Flag := Process32First(hnd,fprocessentry32); //使用 Process32First函数取得第一个进程的信息 while Flag = true do //如果 Process32First函数执行成功也就是说找到进程列表里的第一个进程时开始循环 begin Flag := Process32Next(hnd,FprocessEntry32); //取得第下一个进程信息 name := fprocessentry32.szExeFile; //取得一个进程的名称 //设置string对象的长度,否则会写错误 if name = pname then //如果进程名等于这个字符串 begin //打开已经存在的线程,并返回线程句柄 AhProcess := OpenProcess(PROCESS_ALL_ACCESS, false, FprocessEntry32.th32ProcessID); SetLength(szProcessName, MAX_PATH); //获取进程IP对应的应用程序的路径 GetModuleFileNameEx(AhProcess,0,PAnsiChar(szProcessName),MAX_PATH); if processList.Existed(FprocessEntry32.th32ProcessID) <0 then begin Info := TMyProcess.Create; processInfo := Info; processInfo.processid := FprocessEntry32.th32ProcessID; processInfo.handle := AhProcess; processInfo.state := stNew ; processInfo.path := szProcessName ; Result := True; Exit; end; end; CheckExitProcess; ClearExitProcess; end; finally <span style="color:#ff6666;">CloseHandle(hnd);</span> end; end;
以上代码使用过程中,内存很快被消耗完,净查阅MSDN文档后发现,使用CreateToolhelp32Snapshot创建进程快照后,需使用CloseHandle关闭其句柄,以释放内存。需要注意的是在WinNT中使用CloseHandle释放内存,而在WinCE(还有人用吗,哈哈)中要使用CloseToolhelp32Snapshot关闭快照释放内存。
祝好!
欢迎斧正,望您不吝赐教!
相关文章推荐
- Windows进程内存的监控问题
- MongoDB在Windows平台中需要注意的问题
- Openh323和Windows平台上关于G.723.1编码需要注意的一个问题
- Windows平台下的session0创建进程的问题与解决办法
- 深入探究Windows平台客户端安全问题-进程地址空间入侵和白加黑高阶利用
- Java在Windows平台上调用进程不传参的问题解决办法
- 进程间数据通讯要注意的问题
- 将Socket应用程序从Unix向Windows移植中应注意的几点问题
- 将Socket应用程序从Unix向Windows移植中应注意的几点问题
- 将Socket应用程序从Unix向Windows移植中应注意的几点问题
- windows平台开发移植到linux部署注意事项
- 如何在Windows平台下实现进程隐藏
- 将Socket应用程序从Unix向Windows移植中应注意的几点问题
- MFC中销毁Windows对象需要注意的问题
- 关于使用WindowsUpdate 或 Windows 自动升级时碰到的 svchost.exe 进程 CPU 资源占用过高的问题的相关信息
- Windows Server 2003中的w3wp.exe进程大量占用cpu资源的各种问题解决方法
- 设置Windows下的Core文件输出(监控异常进程)
- 将Socket应用程序从Unix向Windows移植中应注意的几点问题
- 从windows2000转到windows平台遇到的问题
- Windows平台安装QT 3.3.4过程中遇到的两个问题