PnpMgr分析
+ -

windows加载即插即用PNP设备的过程

2021-07-01 645 1

无论是应用通知总线创建子设备或者是真实的物理设备被总线发现,PNP设备均是通过其总线驱动来枚举的。
总线驱动监听其总线上设备的变化(包括设备的新建或移除),当有设备发生变化时,使用函数IoInvalidateDeviceRelations来通知PNP管理器其总线设备上有子设备的变化。
当PNP管理器收到通知后,会通过IRP_MN_QUERY_DEVICE_RELATIONS IRP来获取总线设备上的子设备。总线驱动返回其总线上的所有子设备集。
pnp 管理器根据该IRP_MN_QUERY_DEVICE_RELATIONS返回的信息来更新自己的设备树,创建新设备的节点。然后PNP管理器通过以下IRP收集设备的信息。

  • IRP_MN_QUERY_ID:
    • 通过BusQueryInstanceID标志收集设备的实例ID,
    • 通过BusQueryHardwareIDs标志收集设备的硬件ID
    • 通过BusQueryDeviceID标志收集设备ID
    • 通过BusQueryCompatibleIDs收集设备的兼容ID
    • 通过BusQueryContainerID收集设备的容器ID
  • PDOHandleQueryDeviceText:

    • DeviceTextDescription:设备的描述信息
    • DeviceTextLocationInformation
  • IRP_MN_QUERY_CAPABILITIES:获取设备的CAPABILITIES。可直接返回总线驱动查询到的DEVICE_CAPABILITIES。

  • IRP_MN_QUERY_BUS_INFORMATION:获取与总线相关的信息。使用PNP_BUS_INFORMATION标识总线类型,总线号等。
  • IRP_MN_QUERY_RESOURCES:获取分配给该子设备的硬件资源,包括中断,IO,内存。
  • IRP_MN_QUERY_RESOURCE_REQUIREMENTS:获取分配给该子设备的请求硬件资源,包括中断,IO,内存。

以下成功后,在注册表中创建相关项:

HKLM\System\CurrentControlSet\Enum\<enumerator>\<deviceID>
HKLM\System\CurrentControlSet\Enum\<enumerator>\<deviceID>\<instanceID>

最后根据设备ID安装相应的驱动程序。

关于各IRP详细的使用参见:即插即用简介 https://docs.microsoft.com/zh-cn/windows-hardware/drivers/kernel/introduction-to-plug-and-play

主要过程如下:

1) IoInvalidateDeviceRelations通知PNP管理器有设备变化。
2) 对IRP_MN_QUERY_DEVICE_RELATIONS 返回该总线上的设备集合(总线驱动创建的PDOs)。
3) 对IRP_MN_QUERY_ID返回设备的相关ID信息。

  • BusQueryDeviceID
  • BusQueryInstanceID
  • BusQueryHardwareIDs
  • BusQueryCompatibleIDs

4.返回IRP_MN_QUERY_CAPABILITIES
5.IRP_MN_QUERY_DEVICE_TEXT返回设备的字符描述信息

  • DeviceTextDescription
  • DeviceTextLocationInformation

6.IRP_MN_QUERY_BUS_INFORMATION 总线信息。
7.资源信息IRP_MN_QUERY_RESOURCES,IRP_MN_QUERY_RESOURCE_REQUIREMENTS

0 篇笔记 写笔记

关于我们
上学时,看一篇文章—如果您愿意对国家有所贡献:1.中国的863计划中有一个重点研究项目: 并行计算,分布计算,向量计算。您愿意研究它吗?2.作为现代通讯技术的一个根本数学基础,大合数的快速因子分解,还是一个难题。您愿意研究它吗?3.研究 vc,java4.研究数据结构,去考高级程序员5.研究操作系......
联系我们
QQ:76230169QQ群:952873936邮箱1:tsingchen2008@163.com邮箱2:tsingchen2008@gmail.com......
站内大事
2021年7月1日,将本人原 www.bytekits.com 关于Windows内核部分搬至此站上线......
隐私政策
首先感谢您访问pnpon内核开发网站(phpon.com)。pnpon内核开发网非常重视用户个人信息及隐私的保护。pnpon内核开发为用户(以下简称“用户”或“您”)提供了IT技术快速学习、查询的相关资料。您在使用我们的网站服务时,我们可能会收集和使用您的相关信息。因此,pnpon内核开发制订了pn......
免责声明
版权信息本站部分内容来源于个人技术积累、经验分享和一些官方资料经过个人的翻译消化归纳,很少的一部分来源于其它网站的内容转载。在此本人并不保证内容的正确性。通过使用本站内容随之而来的风险与本站无关访问者可将本网站提供的内容或服务用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作......
版权信息
第一章 声明第一条:本站为个人非盈利站点,旨在个人学习、欣赏及记录等,故不受狭义的商业性版权限制,除非特别声明;第二条:本站主要内容来源为本站编辑撰写、翻译外文和转载其他网站。第二章:许可协议第三条:pnpon内核开发内容基于CC共享协议:署名—非商业性使用—相同共享方式 创作(另有特别声明的文章按......
windows加载即插即用PNP设备的过程
无论是应用通知总线创建子设备或者是真实的物理设备被总线发现,PNP设备均是通过其总线驱动来枚举的。总线驱动监听其总线上设备的变化(包括设备的新建或移除),当有设备发生变化时,使用函数IoInvalidateDeviceRelations来通知PNP管理器其总线设备上有子设备的变化。当PNP管理器收到......
Windows系统多触摸屏设备与Pnp监视器/显示器关联
一般情况下,我们一般只有一个触摸屏设备和一个显示器。这时候在触摸屏上的操作会在我们对应的显示器上显示。不过还有另一种情况,就是可能我们会有多个触摸屏设备和多台显示器。那么在一个触摸屏设备上的点击效果到底在那个显示器上显示呢?所以这必须有一个对应的关系。通过设置这个对应关系,可以实现指定的触摸屏设备与......
使用PNPUTIL备份设备驱动程序
Windows下提供了一个工具 pnputil.exe,使用该工具可以管理系统中的驱动。pnputil.exe提供的功能有:添加驱动 add-driver 删除驱动 delete-driver导出(备份)驱动 export-driver枚举驱动 enum-drivers枚举设备 enum-dev......
PNP设备的ID-BusQueryDeviceID、BusQueryInstanceID、BusQueryHardwareIDs、BusQueryCompatibleIDs、BusQueryDeviceSerialNumber
PNP设备被总线驱动程序枚举到PNP管理器之后,其第一件就是就收集该子设备的各个ID.typedef enum { BusQueryDeviceID = 0, // ......
PNP管理器设备树变动IoInvalidateDeviceRelations
IoInvalidateDeviceRelations用于通知PNP管理器设备树关系已经发生变化,这样PNP管理器会重新扫描设备树。VOID IoInvalidateDeviceRelations( IN PDEVICE_OBJECT DeviceObject, IN DEV......
PNP管理器重新扫描设树ReenumerateDeviceTree原理
IoInvalidateDeviceRelations最终下发是的一个ReenumerateDeviceTree请求到WorkItem.case RestartEnumeration: // Used after completion of async I/Ocase Reenum......
PNP管理器新设备的生成和老设备的卸载
这里介绍IoInvalidateDeviceRelations引起的设备节点状态变化的状态机:当然,系统定义的设备节点太多了typedef enum _PNP_DEVNODE_STATE { DeviceNodeUnspecified = 0x300, // 768 ......
PNP管理器创建新的设备节点及设备节点树
通过IoCreateDevice创建的PDO设备通过IRP_MN_QUERY_DEVICE_RELATION获取子设备集之后,PNP管理器判断出这是一个新的PDO之后,会创建设备节点并与设备对象DEVICE_OBJECT绑定。判断是一个新的标准很简单,就是判断该设备象DEVOCE_OBJECT的......
PNP管理器设备节点初始化流程
设备节点的创建PDO设备信息的收集安装设备驱动、调用AddDevice分配设备资源调用IRP_MN_PNP_START等的过程其中在PipProcessStartPhase1中调用IopStartDevice,即IRP_MN_START_DEVICE.......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!