文件系统筛选器加载顺序

Windows 操作系统根据文件系统筛选器驱动程序加载文件系统:

  • 驱动程序的启动类型,其中每种启动类型代表系统启动的不同阶段。
  • 加载顺序组用于系统启动时加载的文件系统筛选器驱动程序。 微型筛选器驱动程序需要加载顺序组的概念,以便与传统文件系统筛选器驱动程序互操作。 可以随时加载微型筛选器驱动程序。

在探索系统启动过程中何时以及如何加载文件系统筛选器驱动程序之前,必须了解驱动程序启动类型和加载顺序组。

驱动程序启动类型

内核模式驱动程序的启动类型指定了驱动程序是在系统启动时加载还是在系统启动后加载。 可能的启动类型有五种:

开始类型 说明
SERVICE_BOOT_START (0x00000000) 表示由操作系统 (OS) 加载器启动的驱动程序。 文件系统筛选器驱动程序通常使用这种启动类型或 SERVICE_DEMAND_START。 旧版文件系统筛选器必须使用这种启动类型。 有关详细信息,请参阅文件系统筛选器加载顺序组
SERVICE_SYSTEM_START (0x00000001) 指明驱动程序在 OS 初始化过程中启动。 文件系统识别器使用此启动类型。 除“SERVICE_DISABLED”中列出的文件系统外,文件系统(包括网络文件系统组件)通常使用这种启动类型或 SERVICE_DEMAND_START。 此启动类型也被 PnP 设备的设备驱动程序所使用,这些设备会在系统初始化过程中被枚举,但不需要加载系统。
SERVICE_AUTO_START (0x00000002) 指明示服务控制管理器在系统启动时启动的驱动程序。 很少使用。
SERVICE_DEMAND_START (0x00000003) 指示由 PnP 管理器(适用于设备驱动程序)或服务控制管理器(适用于文件系统和文件系统筛选器驱动程序)按需启动的驱动程序。
SERVICE_DISABLED (0x00000004) 指示操作系统加载程序、服务控制管理器或 PnP 管理器未启动的驱动程序。 由文件系统识别器加载的文件系统使用(启动文件系统除外),或由其他文件系统用于 EFS。 此类文件系统包括 CDFS、EFS、FastFat、NTFS 和 UDFS。 也可用于在调试过程中暂时禁用驱动程序。

所有指定启动类型为 SERVICE_BOOT_START 的驱动程序都会先于启动类型为 SERVICE_SYSTEM_START 或 SERVICE_AUTO_START 的驱动程序加载。 在每个启动类型类别中,加载顺序组将确定何时加载文件系统筛选器驱动程序(和旧版筛选器驱动程序)。

指定起始类型

驱动程序编写器可在安装时通过以下任一方式指定驱动程序的启动类型:

  • 在驱动程序 INF 文件中的 AddService 指令引用的 service-install-section 中,为 StartType 条目指定所需的启动类型。 此方法在为筛选器驱动程序创建 INF 文件ServiceInstall 部分中进行了介绍。

  • 在从用户模式安装程序调用 CreateServiceChangeServiceConfig 时,为 dwStartType 参数传递所需的启动类型。 Microsoft Windows SDK 文档中的 CreateServiceChangeServiceConfig 参考条目对该方法进行了描述。

驱动程序加载顺序组

在 SERVICE_BOOT_START 和 SERVICE_SYSTEM_START 启动类型中,每个驱动程序的加载顺序组指定了驱动程序的相对顺序。

启动类型为 SERVICE_BOOT_START 的驱动程序称为启动(或启动)驱动程序。 作为启动驱动程序的筛选器通常属于 FSFilter 加载顺序组之一。 文件系统筛选器驱动程序的加载顺序组中详细介绍了这些加载顺序组。

启动类型为 SERVICE_SYSTEM_START 的驱动程序也会按其所属的加载顺序组的顺序加载。 但是,在加载所有启动驱动程序之前,不会加载任何系统启动驱动程序。

对于启动类型为 SERVICE_AUTO_START、SERVICE_DEMAND_START 或 SERVICE_DISABLED 的驱动程序,加载顺序组将被忽略。

可在 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control 注册表项的 ServiceGroupOrder 子项下找到完整、有序的加载顺序组列表。

SERVICE_BOOT_START 和 SERVICE_SYSTEM_START 驱动程序使用相同的负载组排序。 但是,在加载任何 SERVICE_SYSTEM_START 驱动程序之前,都会加载并启动所有 SERVICE_BOOT_START 驱动程序。

指定加载顺序组

驱动程序编写器可在安装时通过以下任一方式指定驱动程序的加载顺序组:

  • 在驱动程序 INF 文件中的 AddService 指令引用的 service-install-section 中,为 LoadOrderGroup 条目指定所需的加载顺序组。 此方法在为筛选器驱动程序创建 INF 文件ServiceInstall 部分中进行了介绍。

  • 在从用户模式安装程序调用 CreateServiceChangeServiceConfig 时,为 lpLoadOrderGroup 参数传递所需的启动类型。 Microsoft Windows SDK 文档中的 CreateServiceChangeServiceConfig 参考条目对该方法进行了描述。

有关驱动程序加载顺序和加载顺序组的更多一般信息,请参阅指定驱动程序加载顺序

加载筛选器驱动程序的规则

以下有关启动类型和加载顺序组的规则决定了何时加载筛选器驱动程序:

  • 指定了特定起始类型和加载顺序组的筛选器驱动程序与该起始类型和加载顺序组中的所有其他筛选器驱动程序同时加载。

  • 在每个加载顺序组中,微型筛选器和传统筛选器驱动程序通常按随机顺序加载。 这种情况下,通常会根据安装驱动程序的顺序来加载驱动程序。

  • 如果微型筛选器或旧版筛选器驱动程序没有指定加载顺序组,则会在所有指定了加载顺序组的相同启动类型的其他驱动程序之后加载。