找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3772|回复: 0
打印 上一主题 下一主题
收起左侧

设备及驱动在系统中的安装过程

[复制链接]
跳转到指定楼层
楼主
ID:90014 发表于 2015-9-13 16:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们如何在Windows 系统中安装一个设备以及对应的驱动程序呢?请看MSDN /WDK 中对此部分的描述。
要清楚这个过程,需要先了解一下Windows设备安装过程中所需的各个组件。
http://msdn.microsoft.com/en-us/library/ms791106.aspx


在这幅图中,白底框由Windows操作系统提供,而灰色框则必须由设备供应商提供。而其中的SetupAPI,DeviceManager等则是SetupApi.dll 以及Cfgmgr32.dll的功能。其余的驱动管理器等则是分别不同的sys驱动文件。
Windows的安装类型
Windows 定义了2种类型的安装过程:服务器端以及客户端。因服务器端安装不需要用户干预,应尽可能选择此安装方式。
在以下情况下,可采用服务器端安装
  • 总线驱动能够检测到此设备,并且能通知到PnP管理器。

  • PnP 管理器能够找到包含与该设备硬件ID匹配的INF文件。
  • 设备的INF文件和所有驱动都经过WHQL签核。
  • SetupAPI 能够在不提示用户的情况下找到所有的设备驱动程序。意思是所有驱动都是系统预安装的,或者此前安转过。
  • 设备类安装程序在安装完成后不显示任何属性提示。
  • 设备的 INF 文件中没有指定要求交互式操作。
  • 所有的一次性注册条款都符合设备安装中的规则。

服务器端安装不显示任何用户接口,也不需要以管理员身份登陆。

客户端安装:
  • PnP 管理器无法找到包含设备硬件ID的 INF 文件。
  • PnP 管理器无法找到所需的驱动文件。
  • 设备的 INF 或驱动没有经过签核。
  • 此时 SetupAPI 必须提示用户输入安装介质的位置。
  • 类安装程序或协同安装程序在安装完成后显示一些属性页面。
  • 设备,总线或总线驱动等不支持即插即用(PnP)。

客户端安装需要使用客户端软件,如添加硬件向导(NewDev.dll),或设备供应商提供的安装程序。这些客户端软件通过调用SetupAPI完成安装操作。从Windows Vista开始,设备安装的核心都是非交互式的服务器端安装方式,不再支持客户端方式。但是设备类安装程序及协同安装程序依然可以显示安装完成后属性或动作。

系统的安装过程

用户现在看到的很多安装都是在系统正常运行后的安装。其实主要的设备安装在Windows初次安装时已经完成,客户之后在系统运行后,再次补充特殊的,系统为提供标准驱动的设备的安装过程。如新的显卡,声卡、网卡或其他USB设备等等。这个过程就是上图中的灰色部分。实际的安装过程有3类:文本模式的安装(主要的安装过程),需要再次启动系统的安装以及用户模式下不需要启动的安装。下面对系统已经运行后的安装作一介绍。
  • 将设备插入系统
  • 如果设备和总线支持热拔插,则自动启动安装过程。
  • 如果需要关机并打开机箱安装设备,则设备安装好以后,下次启动系统即可识别。
  • 如果设备不支持即插即用(PnP),则需要人工启动添加新设备向导来配置该设备。
安装过程示例
在下面的示例中,该设备支持热拔插,并且提供了安装文件的CD。

上图中的主要操作要点:
  • 用户将设备插入计算机。如果此设备支持热拔插,则可以在系统正常运行是插入。如U盘。
  • 设备的枚举过程 总线驱动接受到设备的热拔插通知后,通过调用IoInvalidateDeviceRelations通知核心态的PnP管理器,告知该总线上的设备列表已经发生变化。在本例中,这个变化是总线上出现了新的设备。
    核心态PnP管理器通过发送值为IRP_MN_QUERY_DEVICE_RELATIONS的IRP_MJ_PNP给总线驱动,以取得该总线上目前的设备列表。总线驱动则提供这个列表。核心态PnP管理器将此列表与此前的列表对照,从而确定总线上出现的新设备。
    核心态PnP管理器再次发送各种IRP给总线驱动,进一步取得该设备的其他信息,如设备硬件ID,兼容ID和设备能力描述等。这些请求包括 IRP_MN_QUERY_IDIRP_MN_QUERY_CAPABILITIES
  • 核心态PnP管理器通知用户态PnP管理器要安装新的设备。用户态PnP管理器试图完成信任模式安装(服务器端安装)。但此例中无法完成,必须显示一个提示,要求用户提供安装盘。
  • 用户态PnP管理器创建一个新的RunDll32进程,启动新设备管理程序newdev.dll,开始安装设备。
  • 新设备管理程序调用设备安装函数 (SetupAPI)和即插即用管理函数 (CfgMgr API)来完成此安装任务。 新设备安装程序首先调用 SetupDiBuildDriverInfoList 创建该设备可能的驱动列表。此例中,在系统的INF列表中,没有与之对应的驱动,则返回一个空的列表。新设备安装程序显示发现新硬件向导,用户提供驱动文件的位置,如软盘,CD或微软在线升级等。此例中,驱动文件在CD上,则用户必须装入CD,然后点击"下一步"继续后续安装。新设备安装程序继续调用 SetupDiBuildDriverInfoList,此时已经有用户提供的CD上的文件列表。
    (注意:如果此前已经安装过此设备,但是未能成功,则此设备会被当作未知设备,而不会显示以上安装向导。)
  • 类安装程序以及协同安装程序开始参与安装过程,处理DIF请求。例如,新设备安装程序调用 SetupDiCallClassInstaller,发送 DIF_SELECTBESTCOMPATDRV 安装需求。SetupDiCallClassInstaller 发送 DIF 需求给所有的类安装程序及协同安装程序。
    新设备安装程序发送一系列DIF代码,包括DIF_SELECTBESTCOMPATDRV, DIF_ALLOW_INSTALL, DIF_INSTALLDEVICEFILES, DIF_REGISTER_COINSTALLERS, DIF_INSTALLINTERFACES, 和 DIF_INSTALLDEVICE. 由类安装程序予以处理。
    安装过程使用INF文件中的class以及ClassGUID 项目确定设备的安装类。安装类确定了该设备的类的安装程序及协同安装程序。如果需要协同安装程序,则在INF文件的 INF DDInstall.Coinstallers 部分列出。
  • 安装程序将控制转移到核心模式,开始装载驱动并且启动设备。安装程序选定该设备的最佳驱动后,复制所需要的支持文件,注册该设备特定的协同安装程序以及设备接口,然后由核心模式装载驱动并且启动设备。此时发送相关的配置管理CfgMgr函数给用户态PnP管理器,并经过用户态PnP管理器转发给核心台PnP管理器。
  • PnP加载相关的驱动以及该设备可选的过滤驱动。PnP管理器首先调用尚未安装的驱动的DriverEntry,然后为每一个设备调用AddDevice,启动底端过滤器,此后是功能驱动,最后是高端过滤器驱动。如果有需要,PnP管理器给该设备分配资源,并且给设备驱动程序发送 IRP_MN_START_DEVICE信息。
  • 安装程序可以提供安装后向导页面,改变设备设置或安装应用软件。在显示标准的安装完成页面前,安装程序发出 DIF_NEWDEVICEWIZARD_FINISHINSTALL 。这样就允许安装客户定制的页面,以便更改设备的设置或作其他。
  • 从Windows Vista开始,安装程序可以提供安装完成后操作来安装应用软件,即在所有安装操作都完成之后,发送 DIF_FINISHINSTALL_ACTION 给安装程序。
以上过程是设备安装的大致过程。                                                                                                                    
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表