经过分析,我了解到即使_KPROCESS对象也可以是ActiveProcessLinks列表的成员。 _EPROCESS和_KPROCESS对象有什么区别?何时创建一个而不创建一个?它们之间的概念差异是什么?
答案 0 :(得分:8)
这是简化的,但Windows O / S的内核模式部分分为三部分:HAL,内核和执行子系统。执行子系统处理一般的操作系统策略和操作。内核处理低级操作(例如自旋锁,线程切换)以及调度的过程体系结构特定细节。 HAL处理在处理器体系结构的特定实现中出现的差异(例如,如何在x86的该实现上路由中断)。这些都在Windows Internals书中有更详细的解释。
当您创建新的Win32进程时,内核和执行子系统都希望跟踪它。例如,内核想知道进程中线程的优先级和亲和性,因为这会影响调度。执行子系统希望跟踪流程,例如,安全执行子系统想要将令牌与流程相关联,以便我们稍后进行安全检查。
Kernel用于跟踪进程的结构是KPROCESS。执行子系统用于跟踪它的结构是EPROCESS。作为实现细节,KPROCESS是EPROCESS的第一个字段,因此执行子系统分配EPROCESS结构,然后调用内核来初始化它的KPROCESS部分。最后,两个结构都是Process Object的一部分,它代表用户进程的实例。这也应该包含在Windows Internals书中。
-Scott
答案 1 :(得分:5)
看看这里:
http://channel9.msdn.com/Shows/Going+Deep/Arun-Kishan-Process-Management-in-Windows-Vista
EPROCESS
是来自用户模式的PEB
的内核模式。更多细节可以在Alex Ionescu网站的this document以及the book by Schreiber和其他有关NT内部的书籍中找到。
在WinDbg中使用dt
来了解它们的外观。
答案 2 :(得分:1)
EPROCESS在用户模式下不可用。 KPROCESS也不是。
KPROCESS是EPROCESS的子集。如果查看调试器中的字段,您将看到KPROCESS包含的字段与较低级别的进程的调度和簿记更相关,而EPROCESS内部具有更高级别的进程上下文。据我所知,名称来自与这些结构交互的不同子系统(执行程序的结构和函数经常以Ex为前缀,而内核的结构和函数经常以Ke为前缀)
您可以在不同的文档功能中看到这一点。考虑KeStackAttachProcess(http://msdn.microsoft.com/en-us/library/ff549659(v=vs.85).aspx)的原型,它是Ke函数并采用KPROCESS。没有任何导出和记录的Ex函数接受EPROCESS(或KPROCESS),但Ps函数完全处理EPROCESSES。
线程存在类似的差异,KTHREAD和ETHREAD。