WEB开发网
开发学院软件开发VC 定制调试诊断工具和实用程序(8) 阅读

定制调试诊断工具和实用程序(8)

 2006-07-20 11:42:17 来源:WEB开发网   
核心提示: 你不应该在 注入 DLL 中使用 MFC,因为你可能会得到一些未定义的结果,定制调试诊断工具和实用程序(8)(4),比如,要是目标进程为 csrss.exe (Win32 子系统)的话,同样的问题存在于注册表键值中,对于 Win32 来说,则会崩溃,在本文的第一部分

你不应该在 注入 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 来说,其命名对用户实在是不友好。

上一页  1 2 3 4 5  下一页

Tags:定制 调试 诊断

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接