我正在学习Windows驱动程序的加载过程。 但我无法理解以下文章的一部分。
在本文中,有以下描述。
“4. PnP管理器为设备加载适当的功能驱动程序和任何可选的过滤器驱动程序。”
我对上面的描述有疑问。 PnP经理如何确定适当的功能驱动程序?
例如, 当USB存储器插入Windows PC时,PnP管理器将在加载与USB相关的驱动程序后加载disk.sys。 在这种情况下,我想知道为什么PnP管理器可以判断设备对应于disk.sys。 (看到注册表中的某个地方?向总线驱动程序发送一些请求?等等......)
当总线驱动程序检测并报告PDO设备时,PnP管理器向PDO设备发送几个IRP_MJ_PNP
。包括IRP_MN_QUERY_ID
获取Device Identification Strings
然后在表单中格式化注册表键路径
\REGISTRY\MACHINE\SYSTEM\CurrentControlSet\Enum\<BusQueryDeviceID>\<BusQueryInstanceID>
设备为<BusQueryDeviceID>
返回的BusQueryDeviceID
字符串和<BusQueryInstanceID>
设备返回的BusQueryInstanceID
字符串(Parameters.QueryId.IdType
)
此键已打开或创建。然后查询BusQueryHardwareIDs
和BusQueryCompatibleIDs
。此查询的结果保存在HardwareID
和CompatibleIDs
REG_MULTI_SZ
值中。
然后PnP经理在这个密钥下查找Service
REG_SZ
值 - 如果它已经存在 - 加载驱动程序(\REGISTRY\MACHINE\SYSTEM\CurrentControlSet\Services\<Service>
)并且用这个PDO调用AddDevice
。如果这个值尚未设置 - 是通过系统中已安装的inf文件进行搜索 - 最佳匹配HardwareID
和CompatibleIDs
。如果找到驱动程序 - 结果保存在Service
REG_SZ
值下,以备下次不搜索