前一段时间,在XueTr上发现个有趣的东西【驱动模块-加载顺序】,很好奇这个顺序是怎么来的,调查了一下。
在系统初始化的时候,决定驱动程序在什么时候被载入的信息保存在注册表中。
1. 首先,按【批次】第一批,第二批,第三批顺序载入.
【批次】,是由【HKLM/SYSTEM/CurrentControlSet /Services/驱动名/Start】决定的。
2. 其次,同一批次的按【驱动所属组】的【组顺序】载入。
【驱动所属组】,是由【HKLM/SYSTEM/CurrentControlSet/Services/驱动名/Group】决定的,若无该键值,就在所有的组后面,按字母序。
【组顺序】,是由【HKLM/SYSTEM/CurrentControlSet/Control /ServiceGroupOrder/List】决定的。
3. 最后,同一组内的按【组内序】载入。
【组内序】,是由【HKLM/SYSTEM/CurrentControlSet/Control/GroupOrderList/组名】中记录的【Tag序】来决定的。
【Tag序】,由若干DWORD组成,第一个表示总共有几个驱动Tag 。后面每个DWORD都是组内某个驱动的【Tag值】。
【Tag值】,是由【HKLM/SYSTEMCurrent/ControlSet/Services/驱动名/Tag】记录的,这个值在安装的时候分配,先装的Tag值小,后装的Tag值大。
这个顺序是如何定制的,其实很简单,来自于驱动创建时使用的API函数,CreateService,它的很多参数会决定其加载顺序的位置,我只是把最终结果整理了一下,具体信息,有兴趣的自己去查MSDN。