安装minifilter后,可以在注册表看到一些东西,比如:
驱动的所有信息都可以在注册表里面找到。
Minifilter的加载顺序由驱动类型和分组决定。
驱动类型
看MSDN: http://msdn.microsoft.com/en-us/library/windows/hardware/ff557272(v=vs.85).aspx
vs2013默认使用的是SERVICE_DEMAND_START。 也就是说系统重启后minifilter不会被加载。需要通过Pnp管理器或者SCM来启动。比如使用命令sc start myminifilter。
当windows启动的时候,SERVICE_BOOT_START和SERVICE_SYSTEM_START的minifilter驱动会被自动加载。SERVICE_BOOT_START比SERVICE_SYSTEM_START的驱动更早被加载。MSDN:However, no system-start driver is loaded until after all boot drivers have been loaded.
对于同一种类型的驱动,加载顺序就看他们所属的组了。
对于SERVICE_AUTO_START, SERVICE_DEMAND_START,SERVICE_DISABLED类型的驱动,分组不会影响加载顺序。其实这个也好理解,比如Demand驱动,这个是由用户控制启动加载的,所以分组不会影响加载顺序。什么时候启动就什么时候被加载。
Note Load order groups are ignored for drivers whose start type is SERVICE_AUTO_START, SERVICE_DEMAND_START, or SERVICE_DISABLED.
驱动分组
Windows已经为我们创建了很多分组,我们所需要做的就是给我们的minifilter指定一个合适的分组。具体分组信息可以查看MSDN: http://msdn.microsoft.com/en-us/library/windows/hardware/ff549689(v=vs.85).aspx
对于SERVICE_BOOT_START和SERVICE_SYSTEM_START,这些类型的minifilter的加载顺序和它们的所属分组有关。
Within the SERVICE_BOOT_START and SERVICE_SYSTEM_START start types, the relative order in which drivers are loaded is specified by each driver's load order group.
高度(Altitude)
每一个minifilter驱动都必须指定一个高度(前面的例子一开始就是因为没有指定altitiude,所有工作不太正常)。高度值是由微软公司控制的。所以最好给微软公司发email获取一个高度值,不然可能会跟其他驱动冲突。
Each load order group has a defined range of altitudes. The allocation of altitudes to minifilter drivers is managed by Microsoft. To request an altitude for your minifilter driver, send an email message to [email protected] asking for one to be assigned.
每一个发组都有自己的一个高度区间,从MSDN上截了个图:
高度值越高,代表在设备栈里面的位置也越高,也就是越先收到应用层发过来的IRP.