定制调试诊断工具和实用程序(8)
2006-07-20 11:42:17 来源:WEB开发网你不应该在 注入 DLL 中使用 MFC,因为你可能会得到一些未定义的结果,比如,要是目标进程为 csrss.exe (Win32 子系统)的话,则会崩溃。
在本文的第一部分,我提出了三个不同的获得某个远程进程命令行的解决方案。我还简要地提到另一个方案,也就是我所说的输出重用。思路是从控制台程序获得输出,对之进行解析,然后获得需要的描述。TLIST 是一个非常好的命令行例子。
很多以控制台模式运行的工具都揭示了未在正式文档中披露的大量 Windows 内部运行机制,尤其是资源包和 Platform SDK 工具(参见 Figure 14)。有关如何从控制台获取输出的讨论可以参知识库文章 Q190351。
所有繁琐的细节工作都被包装在 CConsoleAppDriver 类中,使用时你要从其中派生。你只需要通过 StartApp 指出所执行的命令行,对于产生的每一行,重写的 OnNewLine 方法都会被调用。如果有错误,只要把 FALSE 赋给 m_bParsingOk。如果你已经捕获到所需的信息而想停止解析,返回 FALSE 即可。
诀窍是创建一个管道,专门用来接收应用程序输出,而不是让 Windows 来做这项工作。该管道和新进程之间连接是通过传递给 CreateProcess 的结构 PROCESS_INFORMATION 实现的。为了获取进程输出,该类 hStdOutput 域包含类读取的管道信息(实现细节参见 ConsoleAppDriver.cpp)。
对于一个给定的 DLL,DllSpy 列出使用该 DLL 的进程。对于任何给定的 DLL,我的工具提供了同样的特性。正像你在 Figure 14 中所看到的,OH 是一个控制台工具,它列出每个进程正在使用的内核对象。该程序的主要缺点是不完善的命名规范。请看:
000000A0 csrss.exe File 03bc \WINNT\system32\ega.cpi
这一行意思是 CSRSS 正在使用文件 \WINNT\system32\ega.cpi。但是正如你所见到的,没有驱动器规范说明,同样的问题存在于注册表键值中,对于 Win32 来说,其命名对用户实在是不友好。
- ››调试SQL server 2008功能设置
- ››调试JavaScript错误
- ››定制个性化的对话框窗口类
- ››定制 SWT/RCP 界面:如何编写一个漂亮的 SWT/RCP ...
- ››调试和测试 Swing 代码
- ››定制基于 Visual studio 2005 平台 Windows CE(AR...
- ››定制版黑雨 blackra1n 越狱3.1.2 全系 iPhone
- ››调试集成 Java 和 C/C++ 的代码
- ››定制 Eclipse RCP 应用程序,第 1 部分: 可与 SWT...
- ››调试JavaScript脚本程序(Firefox篇)
- ››调试JavaScript/VB Script脚本程序(ASP.NET篇)
- ››调试JavaScript/VB Script脚本程序(Wscript篇)
更多精彩
赞助商链接