如何在 windows 7 中使用内核驱动程序或 API 挂钩监视进程/线程上下文切换?我想在进程(例如,Internet Explorer)在上下文切换时进入恢复/挂起状态时记录寄存器值。
1 回答
答案在某种程度上取决于您想要完成什么以及您有什么限制。
我认为您首先需要在 OP 所说的范围内缩小范围。特别是“恢复/暂停”定义不够明确,无法知道您想要什么。事实上,Windows 没有“挂起进程”API。Procmon 通过挂起进程中的所有线程来挂起进程。
我怀疑您的意思是发生进程切换时。没有线程切换就不会发生进程切换。因此,您可能想知道的是,进程 X 拥有的线程何时切换到 IE 拥有的线程(使用您的示例),以及 IE 拥有的线程何时切换到其他进程拥有的线程。
我能想到的最简单的方法是使用内核调试器(Windbg,KD)并在切换线程的内核函数上设置断点。我不记得那个函数是什么,但你可以反汇编任意数量的内核 API(例如 WaitForSingleEvent),看看它们在需要阻塞时会做什么。他们必须将控制权传递给线程调度程序。或者更简单,只需查看系统进程中所有线程的堆栈转储(获取有关 !process 的帮助以查看选项)。他们中的许多人将在调度程序中。
如果你想记录线程切换,你可以编写一些调试器函数来 1)检查进程是否发生了进/出 IE 2)以某种方式记录数据。但是,如果您想捕获 IE 会话中的所有线程切换,则使用调试器将不切实际。这太慢了。
另一种可能性是 Windows 事件跟踪 (ETW)。ETW 是一个很大的话题,所以用谷歌搜索它。专门寻找内核事件的跟踪:1)如何为内核调度事件打开 ETW 2)如何将事件捕获到文件中以及 3)如何查看/处理文件中的事件。您可能必须编写一个程序来对事件进行后处理以提取您感兴趣的事件。
最后你可以用谷歌搜索 Windows Kernel Hooking 或类似的东西。微软在更高版本的 Windows 中增加了挂钩内核 API 的难度——我不知道它们在 Win7、Vista 和 Win8 中做了什么,但你需要牢记这一点作为你的谷歌。我确实记得几年前微软研究院的一些内核挂钩活动。
如果您确实找到了挂钩内核 API 的 API,那么您将参与一些驱动程序开发,除非您还可以找到一个允许您从用户模式控制一切的框架。
在专门用于驱动程序开发、内核黑客等的网站上问这个问题可能会得到更好的结果。我知道 OSR 有一组非常好的资源,包括留言板。
祝你好运。