二、Minifilter驱动的加载顺序和Altitudes
Microsoft Windows XP, Windows 2000 SP4 with Update Rollup 1, 和较新的OS专门为在系统启动时加载的FSFD和minifilter驱动提供了一套加载顺序组.
Legacy FSFD可以只绑定到一个现有FSD 栈的顶部,但不可以绑定到某个栈的中间.其结果是,驱动的启动类型和加载顺序组对legacy FSFD来说很重要,因为一个过滤驱动越早加载,它就可以绑定到FSD栈上越低的位置.
驱动的加载首先基于它的表示系统引导阶段的启动类型.更多关于启动类型的信息参考What Determines When a Driver Is Loaded一文中的"Driver Start Types". 所有启动类型为SERVICE_BOOT_START的FSFD和minifilter驱动都将会在启动类型为SERVICE_SYSTEM_START或 SERVICE_AUTO_START的驱动之前加载.启动类型由用于安装minifilter驱动的INF文件的ServiceInstall 项中的StartType入口指定.在每一种启动类型类别中,加载顺序组决定了FSFD和minifilter驱动什么时候会被加载.
一个minifilter驱动可以在任何时间加载.minifilter驱动仍然需要加载顺序组的概念来与legacy FSFD协同工作.每一个minifilter驱动必须有一个叫做altitude的唯一标识符.一个minifilter驱动的altitude定义了它加载时在I/O栈中相对其他minifilter驱动的位置. Altitude是一个无限精密的串就像小数一样.altitude数字低的minifilter驱动加载到I/O栈中的位置要低于一个altitude数字高的minifilter驱动.
每一个加载顺序组都有一个定义好的altitude范围.minifilter驱动的altitude的分配由微软管理.要想为你的minifilter驱动请求一个altitude,去 WHDC Minifilter Altitude Allocation 网址看看.
Minifilter驱动必须从表示某个加载顺序组的一个altitude范围中指定一个altitude值.minifilter驱动的altitude值在用于安装这个minifilter驱动的INF文件的Strings 项的实例定义中指定.实例定义也可以在对InstanceSetupCallback例程的调用中的FLT_REGISTRATION结构里指定.一个minifilter驱动可以有多个实例和altitude.这些实例定义的应用跨越所有的卷.
以下启动类型和加载顺序组的规则决定了一个minifilter驱动什么时候会被加载:
· 启动类型相同且在同一加载顺序组中的minifilter驱动和其他FSFD会在同一时间被加载.
· 在每一个加载顺序组中,FSFD和minifilter驱动一般都以随机顺序加载.这就导致了驱动的加载基于驱动的安装顺序.
· 如果某个FSFD或minifilter驱动没有指定一个加载顺序组,那它就会在拥有相同启动类型(就是指定了加载顺序组)的所有其他驱动加载之后加载.
下表是系统定义的minifilter驱动的加载顺序组和altitude范围.对每一个加载顺序组来说,加载顺序组栏包含了应该被指定给minifilter的INF文件ServiceInstall 项LoadOrderGroup入口中的组的值. Altitude范围栏包含一个特定的加载顺序组的altitude范围.一个minifilter驱动必须请求微软在适当的加载顺序组或组中分配的一个altitude.
注意加载顺序组和Altitude范围的罗列顺序与它们出现在栈中的顺序相同而于它们的加载顺序相反.
加载顺序组 | Altitude范围 | 描述 |
Filter | 420000-429999 | 此组与WIN2K及更早的OS中的Filter 加载顺序组一样. 它最后加载,因此绑定位置离文件系统最远. |
FSFilter Top | 400000-409999 | 此组是为必须绑定在所有其他FSFilter类型的驱动之上的过滤驱动准备的. |
FSFilter Activity Monitor | 360000-389999 | 此组包括观测和报告文件I/O的过滤驱动,比如FileSpy 和SFilter驱动例子. |
FSFilter Undelete | 340000-349999 | 此组包括恢复已删除的文件的过滤器. |
FSFilter Anti-Virus | 320000-329999 | 此组包括在文件I/O期间探测并杀毒的过滤驱动. |
FSFilter Replication | 300000-309999 | 此组包括复制文件数据给远程服务器的过滤驱动. |
FSFilter Continuous Backup | 280000-289999 | 此组包括复制文件数据给backup媒体的过滤驱动. |
FSFilter Content Screener | 260000-269999 | 此组包括阻止指定文件或文件内容的创建的过滤驱动. |
FSFilter Quota Management | 240000-249999 | 此组包括提供增强的文件系统quota的过滤驱动. |
FSFilter System Recovery | 220000-229999 | 此组包括执行操作来维护OS完整性比如System Restore (SR) filter的过滤驱动. |
FSFilter Cluster File System | 200000-209999 | 此组包括用于那些跨网络提供文件服务器元数据的的产品的过滤驱动. |
FSFilter HSM | 180000-189999 | 此组包括执行分层的存储器管理的过滤驱动. |
FSFilter Imaging | 170000-175000 | 此组包括像ZIP一样提供一个虚拟名字空间的过滤驱动. |
FSFilter Compression | 160000-169999 | 此组包括执行文件数据压缩的过滤驱动. |
FSFilter Encryption | 140000-149999 | 此组包括在文件I/O期间加密和解密数据的过滤驱动. |
FSFilter Virtualization | 130000- 139999 | 此组包括虚拟化文件路径比如Vista中添加的Least Authorized User (LUA) 过滤驱动这样的过滤驱动. |
FSFilter Physical Quota Management | 120000-129999 | 此组包括通过用物理块计数管理quota的过滤驱动. |
FSFilter Open File | 100000-109999 | 此组包括提供已经打开的文件的快照的过滤驱动. |
FSFilter Security Enhancer | 80000-89999 | 此组包括申请lockdown并增强访问控制列表(ACLs)的过滤驱动. |
FSFilter Copy Protection | 60000-69999 | 此组包括做媒体上数据是否超出边界的检查的过滤驱动. |
FSFilter Bottom | 40000-49999 | 此组是为必须绑定在所有其他FSFilter类型的驱动之下的过滤驱动准备的. |
FSFilter System | 20000-29999 | 保留为内部使用. |
FSFilter Infrastructure |
| 保留为内部使用. 此组首先加载,因此绑定位置最接近文件系统. |