Windows 服务类型 0x30 是什么意思?

What does a Windows service type of 0x30 mean?

类型WIN32_SHARE_PROCESS (0x20) 的Windows 服务在与其他服务共享的进程中作为线程运行。 (虽然,在最近的 Windows 10 个构建中,它 may get its own process anyway。)类型 WIN32_OWN_PROCESS (0x10) 的 Windows 服务在其自己的独立进程中运行。但是,某些 Windows 服务的类型为 wIN32_OWN_PROCESS | WIN32_SHARE_PROCESS (0x30)。这个组合是什么意思?

sc query 称该组合为 WIN32。例如,sc query AppInfo 报告:

SERVICE_NAME: AppInfo
        TYPE               : 30  WIN32
        STATE              : 4  RUNNING
                                (STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0

Windows API 文档没有提到这种可能性。他们单独谈论每个标志的含义,而不是组合在一起。他们确实在 EnumServicesStatusA 的文档中引用了 0x30,但在该函数的上下文中,它被记录为返回具有任一类型集的服务,它没有谈论服务具有的含义两种类型都设置。

(服务类型字段可以采用其他几个值:驱动程序服务,如 SERVIC_KERNEL_DRIVERSERVICE_INTERACTIVE_PROCESS 标志、用户服务等。我不是在询问任何其他 values/flags在这个问题中,只关于0x30组合。)

正如您所指出的,changes to service host grouping in Windows 10 可能会导致 SERVICE_WIN32_SHARE_PROCESS 运行 类型的服务在其自己的隔离进程中。每当服务发生这种情况时,SC 都会将其显示为 SERVICE_WIN32 —— SERVICE_WIN32_OWN_PROCESS 和 SERVICE_WIN32_SHARE_PROCESS.

的混淆组合

我们通过注册表确认了这种情况。

在我们的 Windows 10 VM(有足够的 RAM 来触发进程隔离增强)上,SC 说 AppInfo 是类型 WIN32 (30):

任务管理器报告 AppInfo 运行 在它自己的进程中。

根据 the documentation,我们通过添加 SvcHostSplitDisable 值禁用了 AppInfo 服务的进程隔离:

重启后,SC 报告类型为 WIN32_SHARE_PROCESS (20) 的 AppInfo:

任务管理器确认进程确实被共享。

所以这一切都归结于 Windows 10 Creators Update(版本 1703)中对服务进程隔离的更改。