WDK文档what-determines-when-a-driver-is-loaded的翻译
https://msdn.microsoft.com/en-us/windows/hardware/drivers/ifs/what-determines-when-a-driver-is-loaded
在探索系统引导顺序中加载文件系统驱动的方式和时间之前,需要了解驱动启动的类型和加载顺序组。
驱动的启动类型
一个内核模式驱动的启动类型指定了驱动在系统启动中或者启动后是否被加载。这里有五种可能的启动类型:
SERVICE_BOOT_START (0x00000000)
表示驱动被OS 加载器启动。文件系统过滤驱动通常地用这种启动类型或者手动启动类型。在XP及以后的系统,过滤器为了使用新的文件系统过滤加载组必须用这种启动类型。
SERVICE_SYSTEM_START (0x00000001)
表示驱动在OS初始化时启动。文件系统识别器使用这种启动类型。除了被禁止的文件系统,文件系统(包括网络文件系统)通常使用这种启动类型或者手动启动类型。这种启动类型也被设备驱动用于在系统初始化期间枚举但不需要被加载系统的PNP设备。
SERVICE_AUTO_START (0x00000002)
表示驱动在系统启动时被服务控制管理器启动。极少使用。
SERVICE_DEMAND_START (0x00000003)
表示驱动按需启动,或者被PNP管理器(用于设备驱动)或者被服务控制管理器启动(用于文件系统驱动和文件系统过滤驱动)。
SERVICE_DISABLED (0x00000004)
表示驱动不会被OS加载器,服务控制管理器,或PNP管理器启动。由文件系统识别器加载的文件系统(除了那些引导文件系统),或者由另一个文件系统加载的文件系统(如EFS文件系统)会使用这种启动类型。这些文件系统包括DFS,
EFS, FastFat, NTFS, and UDFS。这种启动类型也会在调试时用于暂时禁用驱动。
设定启动类型
在驱动安装时可以通过下面的任一方式指定驱动的启动类型:
- INF文件中的服务安装域AddService指令用到的the StartType entry指定想要的启动类型。
- CreateService or ChangeServiceConfig 的dwStartType参数传递想要的启动类型。这个方法在SDK文档里CreateService and ChangeServiceConfig 相关部分有描述。
驱动加载顺序组
引导启动类型和系统启动类型的驱动加载的相应顺序,是被驱动的load order group组所指定的。
驱动启动类型是SERVICE_BOOT_START的被叫做引导驱动。在2000及以前的系统,大多数过滤器是属于"filter"组的引导驱动。XP及以后的系统,过滤器通常是属于新的FSFilter组的引导驱动。这些加载顺序的详细描述在Load Order Groups for File System Filter Drivers.
启动类型是SERVICE_SYSTEM_START的驱动也按所属加载顺序组的顺序加载。然而,系统启动驱动是在所有引导驱动加载后才加载。
注意 加载顺序组对于启动类型是SERVICE_AUTO_START,SERVICE_DEMAND_START, or SERVICE_DISABLED的驱动是被忽略的。
全部加载顺序组的加载顺序的列表就在下边注册表路径的子键ServiceGroupOrder下。
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control
引导驱动和系统启动驱动虽然使用相同的加载顺序组,但是系统启动驱动在所有引导驱动加载后才加载。
设定加载顺序组
通过以下一种方式在安装时设定驱动的加载顺序组:
- INF文件被AddService 指令引用的service-install-section 节中the LoadOrderGroup项上,设定所需要的加载顺序组。
- CreateService or ChangeServiceConfig 的lpLoadOrderGroup参数传递想要的启动类型。这个方法在SDK文档里CreateService and ChangeServiceConfig 相关部分有描述。
For more general information about driver load order and load order groups, see Specifying Driver Load Order.