【问题标题】:Determine if process is system relevant确定流程是否与系统相关
【发布时间】:2018-06-22 07:23:06
【问题描述】:

我有一个进程的HANDLE,想知道该进程是否与系统相关,就像下图中的任务管理器所做的那样。

如果我尝试通过任务管理器关闭此类进程,它会要求我关闭整个计算机或取消。 (我没有找到与此相关的任何内容)

【问题讨论】:

  • 这些是系统进程
  • 您可以通过 BreakOnTermination 标志复制通过 NtSetInformationProcess 的行为; RtlSetProcessIsCritical 例程在内部调用 NtSetInformationProcess。请记住,RtlSetProcessIsCritical 确实位于 NTDLL 中,而 NtSetInformationProcess 真正属于 NTOSKRNL(Windows 内核)下的内核模式内存,因此它的 NTDLL 导出只会执行系统调用。
  • Windows 内核具有内部的、未记录的和不透明的结构,用于跟踪诸如临界状态之类的事物。例如,查看对 _EPROCESS、_KPROCESS、_ETHREAD 和 _KTHREAD 的研究,以了解更多关于它们拥有的字段以及将在其中跟踪哪些类型的数据。

标签: c++ windows winapi process


【解决方案1】:

此类进程的“内部”术语是“关键进程” - 也就是说,Windows 需要始终运行才能正常运行的进程。一个很好的例子是管理登录屏幕 (WinLogon) 的进程 - 没有它就无能为力。

Raymond Chen 最近为此写了一封 blog post。除其他外,他有这样的话:

  1. IsProcessCritical() 确定指定进程是否被视为关键进程。

  2. 除此之外,任务管理器还保留一个硬编码的进程列表,每当它看到它们时,它就会将其放入“Windows 进程”列表中,例如控制台窗口主机(它托管窗口)用于运行控制台应用程序)和桌面窗口管理器。

我不知道您将如何获得该列表的内容。

Raymond 在他的博客中详细介绍了关键过程实际上是什么。如果您想蓝屏您的计算机,请尝试在“详细信息”选项卡中终止一个。

【讨论】:

  • 在 Windows 8 之前,IsProcessCritical() 例程将不可用(当时还没有实现),因此对于 Windows 7 或更低版本,您必须使用 NtQueryInformationProcess 例程(NTDLL为其导出一个例程,该例程将执行系统调用)以检查 BreakOnTermination 标志的值。此外,作为旁注,您还可以通过 NtQueryInformationThread 检查特定线程是否“关键”(也检查 BreakOnTermination 标志)。如果删除 BreakOnTermination 标志上的设置,您仍然可以终止关键进程。
  • 尽管如果您要终止一个关键进程而不通过这样做来调用 BSOD,系统将无法正常工作,具体取决于您的目标。无论如何,用外行的话来说,关键进程是这样​​一个进程,如果它在设置了关键状态的情况下终止,Windows 内核将调用 KeBugCheckEx 并强制导致 BSOD 崩溃。
猜你喜欢
  • 1970-01-01
  • 2013-03-28
  • 2016-03-22
  • 2011-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多