windows设备安装总览

设备安装总览来源:http://blog.sina.com.cn/s/blog_56f9f160010006mo.html
在安装了微软Windows 2000的计算机上,Setup和其他系统提供的组件以及厂商提供的组件一起工作来安装设备。当计算机启动或者启动后的任何时候用户增加了一个即插即用(PnP)设备时,Setup安装设备(或者手工安装一个非即插即用设备)。
为了支持PnP,Setup基于机器中的设备来进行安装过程而不是按照驱动程序的顺序来安装。例如,不是装载一批驱动程序,然后让这些驱动程序检测它们所支持的设备。而是由Setup确定机器中提供了什么设备,再装载和调用相应的驱动程序。驱动程序,比如ACPI驱动程序和其他PnP总线驱动程序帮助Setup确定机器中有什么样的设备。
这一章包含了以下的信息:
·1.1 设备安装组件
·1.2 PnP设备安装示例
·1.3 Setup如何为设备选择驱动程序?
·1.4 系统设置阶段
1.1 设备安装组件
图1.1显示了在Windows 2000机器上安装设备所涉及的软件组件。
图1.1中的阴影矩形代表由IHV和OEM提供的组件其他设备安装组件由微软提供
图1.1 设备安装设置组件
以下描述了设备安装中各种组件所扮演的角色:
内核模式的PnP管理器
内核模式的PnP管理器通知用户模式的PnP管理器在机器中有一个新设备存在并需要被安装。内核模式的PnP管理器也调用设备驱动程序的DriverEntry和AddDevice例程并发送IRP_MN_START_DEVICE请求以启动设备。
PnP管理器有两部分:一部分运行在用户模式,一部分运行在内核模式。内核模式的PnP管理器向用户模式的PnP管理器报告PnP事件,用户模式的PnP管理器向内核模式的PnP管理器发送控制请求。
驱动程序
PnP驱动程序执行由PnP管理器指示的设备安装操作。例如,当PnP管理器为BusRelations发出IRP_MN_QUERY_DEVICE_RELATIONS请求时,PnP总线驱动程序返回它的子设备的列表。当被PnP管理器调用时,PnP驱动程序执行它们的DriverEntry和AddDevice例程。PnP驱动程序也处理由PnP管理器发送的其他请求,比如IRP_MN_QUERY_CAPABILITIES,IRP_MN_START_DEVICE和IRP_MN_REMOVE_DEVICE。
PnP驱动程序还能检测非即插即用设备,并使用IoReportDetectedDevice向PnP管理器报告。
用户模式的PnP管理器
用户模式的PnP管理器从内核模式的PnP管理器接受设备安装请求,调用其他的用户模式Setup组件以开始设备安装任务,并向内核模式的PnP管理器发出控制请求(比如“启动设备”)。
用户模式的PnP管理器和内核模式的PnP管理器一起维护设备树(devicetree)
用户模式的PnP管理器尽力在一个可信任的进程上下文中安装一个设备,而不要求用户对对话框做出响应(“服务器端”的安装)。这样的自动安装提供了更好的用户接口。如果PnP管理器不能完成可信任的安装,比如因为安装程序提供了一个定制的“完成”页面,则PnP管理器放弃可信任的安装。在这种情况下,当用户以系统管理员权限登录,PnP管理器启动New Device DLL中的发现新硬件向导重新开始设备安装(“客户端”安装)。
Setup API
Setup API包括SetupXxx函数和SetupDiXxx函数。这些函数执行许多设备安装任务,如搜索INF文件,为设备构造潜在的驱动程序列表,拷贝驱动程序文件,向注册表中写信息,注册设备的协同安装程序等等。大多数Setup组件调用这些函数以完成工作。
SetupDiXxx函数有时也被称为设备安装程序。但是这个术语是含混的,因为不只一个组件涉及到设备的安装。
更多的信息参见《Windows 2000驱动程序开发参考》第1卷中的第2章和3章。
CfgMgr API
配置管理API提供了基本的安装和配置操作,它们在Setup API中没有被提供。配置管理函数执行底层任务,比如取得设备节点的状态以及管理资源的描述符。这些函数主要被Setup API调用,但也能被其他Setup组件调用。
协同安装程序和类安装程序
类安装程序在一个特定的设备设置类别中执行适用于设备的安装操作。例如,端口类安装程序负责分配一个COM端口名给端口设置类别中的一个设备。如果在特别的设置类别中的设备不要求任何特殊的安装操作,对这个设置类就不需要类安装程序。
微软为大多数系统定义的设备设置类别提供了类安装程序。更多的信息,参见 第5章---编写类安装程序 。IHV和OEM可以提供类安装程序,但是它们通常提供协同安装程序。
协同安装程序执行对一个特别的设备或者一个设置类别设备的安装操作。更多的信息参见 第4章---编写协同安装程序
INF文件和目录文件
INF文件和目录文件提供了关于要安装的设备和驱动程序的信息。更多的信息参见 第3章---建立INF文件
设备管理器
设备管理器允许用户察看和管理机器中的设备。例如,用户可以察看设备状态并设置设备属性。如果用户请求更新驱动程序,设备管理器调用New Device DLL中的更新驱动程序向导。
更多的信息参见设备管理器的联机帮助。
增加/删除硬件向导
增加/删除硬件向导允许用户增加、删除、拔掉和修理设备。在systray中的Unplug或Eject硬件小程序是这个向导的“拔掉”任务的快捷方式。
New Device DLL
New Device DLL包含发现新硬件向导、更新驱动程序向导和UpdateDriverForPlugAndPl ayDevices函数。
用户模式的PnP管理器在有适当权限的用户上下文中调用发现新硬件向导,以开始客户端的新设备的安装。当用户选择设备的驱动程序属性页上的“更新驱动程序...”按钮时,设备管理器调用更新驱动程序向导。发现新硬件向导、更新驱动程序向导调用Setup API和配置管理器API完成它们的任务。
定制Setup应用程序
IHV和OEM可以提供定制的设置应用程序。更多的信息参见第6章---编写定制的设备安装应用程序。
1.2 PnP设备安装示例
为了说明在设备安装涉及的组件间的交互,这一节分步骤的描述了热插拔PnP设备的安装(使用随书的CD中的支持文件)。
图1.2显示了参加PnP设备安装的软件组件。有阴影的组件是设备厂商提供的
图1.2 PnP设备安装示例
以下的注释对应于图1.2中标出的带圈的数字:
1.用户将设备插入机器。
如果设备和总线支持热插拔通知,用户可以在机器运行时插入新设备。
2.设备被枚举。
总线驱动程序在总线支持下,接受新设备的热插拔通知。总线驱动程序通过调用IoInvalidateDeviceRelati ons通知内核模式的PnP管理器,总线上的设备已经改变。这种情况下,改变是总线上的新设备。
内核模式的PnP管理器通过为BusRelations发送IRP_MJ_PNP/IRP_MN_QUERY_DEVICE_RELATIONS向总线驱动程序来查询总线上存在的设备。总线驱动程序以当前总线上的设备列表响应此IRP。
内核模式的PnP管理器比较新列表和以前的列表,以确定总线上有一个新的设备。
内核模式的PnP管理器向总线驱动程序发出IRP以收集关于新设备的信息,比如设备的硬件ID、兼容ID和设备性能。这些IRP包括IRP_MN_QUERY_ID和IRP_MN_QUERY_CAPABILITIES。参见第2部分的第1章---动态添加新的PnP设备以获得更多有关内核模式PnP管理器的枚举活动的信息。
3.内核模式PnP管理器通知用户模式PnP管理器,有一个设备要被安装。
用户模式PnP管理器尽力执行可信任的安装(服务器端安装),但是在这个例子中不能进行,因为它需要显示一个用户界面,询问用户设备安装磁盘的信息。
4.用户模式PnP管理器使用rundll32.exe建立一个新进程,并启动newdev.dll安装新设备。
5.New Device DLL调用Setup API和CfgMgr API函数以执行它的安装任务。
New Device DLL调用SetupDiBuildDriverInfoLi st,为设备建立可能的驱动程序列表。在本例子中,机器中的INF没有和新设备相匹配的,因此返回的列表是空的。New Device DLL显示发现新设备向导。用户提供驱动程序的位置(软盘、CD、Windows Update)。在本例子中,驱动文件在CD上,所以用户装入CD并点击向导中“下一步”按钮。New Device DLL再次调用SetupDiBuildDriverInfoLi st,从CD接收到包含驱动程序的列表。
参见下一节获得更多有关驱动程序选择的信息。
6.类安装程序和协同安装程序通过处理DIF请求,可以参加到安装过程中。
例如,New Device DLL调用SetupDiCallClassInstalle r以发送DIF_SELECTBESTCOMPATDRV安装请求。SetupDiCallClassInstalle r对任何为此设备注册的类安装程序和协同安装程序发送DIF请求。
New Device DLL发送一系列的DIF编码,包括DIF_SELECTBESTCOMPATDRV,DIF_ALLOW_INSTALL,DIF_INSTALLDEVICEFILES,DIF_REGISTER_COINSTALLERS,DIF_INSTALLINTERFACES和DIF_INSTALLDEVICE。类安装程序和协同安装程序可以参加每一个操作。
Setup使用被选择驱动程序的INF文件的Version section中的Class和ClassGUID条目以确定设备的设置类别。设置类别确定了设备的类安装程序和协同安装程序,设备专用的协同安装程序在INF DDInstall.Coinstaller section中列出。更多的关于安装程序的信息,参见第4章---编写协同安装程序和第5章---编写类安装程序。
7.Setup将控制转移给内核模式以装载驱动程序并启动设备。
一旦Setup为设备选择了最佳的驱动程序,拷贝了适合的驱动程序文件,注册了任何设备专用协同安装程序,注册了任何设备接口等等,它将控制转移给内核模式以装载驱动程序并启动设备。适当的CfgMgr函数对用户模式的PnP管理器发送请求,用户模式的PnP管理器再将它传给内核模式的PnP管理器。
8.PnP管理器为设备装入适宜的功能驱动程序和任何可选的过滤器驱动程序
PnP管理器为任何已请求但还没有被装入的驱动程序调用DriverEntry。PnP管理器然后为每个驱动程序调用AddDevice,开始于下层的过滤程序,然后是功能驱动程序,最后是顶层的过滤程序。PnP管理器分配资源给设备,如果需要,它发送IRP_MN_START_DEVICE给设备的驱动程序。
9.安装程序可以提供向导页以改变设备设置。
Setup在它显示标准完成页之前发送DIF_NEWDEVICEWIZARD_FINISHINSTALL请求。如果必要的话,对安装程序这是一个机会以增加定制页以改变设备的设置。
1.3 Setup如何为设备选择驱动程序?
Windows 2000 Setup为每个设备选择驱动程序,除非设备正在被以原始方式使用。这一节描述了Setup如何做出这个选择。Setup对设备的概念实际上是“驱动程序节点”,它包括了对一个设备的所有支持,如任何服务、设备特定的协同安装程序、注册表项等等。设备的服务可以包括一套PnP驱动程序(一个功能驱动程序和任何顶层、下层过滤器驱动程序)。
一些设备要求厂商提供为那个设备专门设计的驱动程序。另一些设备能够被厂商提供的、设计用来支持一个设备家族的驱动程序所驱动。还有一些设备能被系统提供的、能支持给定设备设置类别的所有设备的驱动程序所驱动。为了为设备选择驱动程序,Setup优先选择和设备特别匹配的驱动程序。如果不能找到这样的驱动程序,它从后继的更一般的驱动程序中选择。
为了确定驱动程序匹配,Setup比较设备的硬件ID、兼容性ID和由设备的父总线驱动程序报告的机器中INF文件所列出的硬件ID、兼容性ID。(如果Setup在任何已安装的INF文件中不能找到匹配项,它就会显示发现新硬件向导并询问用户设备的驱动程序。)
Setup为设备建立可能的驱动程序列表---即那些在Models项包含的ID和设备的ID之一相匹配的驱动程序。Setup为每个可能的驱动程序分配优先等级。等级指示了驱动程序对设备的匹配程度。等级号越低,就越匹配。0等级是最佳匹配,0xFFFF等级是最差匹配。Setup指定的等级如下:
驱动程序等级 描述
0-FFF 在INF的Models项的硬件ID和设备的硬件ID匹配。等级N
匹配意味着设备的N+1硬件ID和INF硬件ID匹配。
1000-1FFF 在INF的Models项的兼容性ID和设备的硬件ID之一匹配。
2000-2FFF 在INF的Models项的硬件ID和设备的兼容性ID之一匹配。
3000-3FFF 在INF的Models项的兼容性ID和设备的兼容性ID之一匹配。
FFFF 最差的匹配。这是个特殊的值,被如协同安装程序的组件使用。
等级在0-FFF范围内的驱动程序被称为硬件ID匹配,因为它们是硬件ID和硬件ID的匹配。这是最好的匹配。所有其他等级被称为兼容性ID匹配,因为它们在匹配中至少涉及一项兼容性ID匹配。当Setup在一个管理员用户进程的上下文中安装设备(客户端安装),如果驱动程序等级仅仅是兼容性ID匹配,则Setup显示发现新硬件向导以询问用户是否他/她有更好的驱动程序。
例如,考虑一个有两个硬件ID和两个兼容性ID的设备。ID的语法在术语集中定义;对于这个讨论,用以下的缩写来代表ID:
HwID_1,HwID_2,CID_1,CID_2
在硬件ID列表的第一个硬件ID对设备是最精确的标识。在本例子中就是HwID_1。
在本例子中,有一个INF文件,它的Models节有类似下面的表项:
DeviceDesc1 = InstallSection1,INF_HWID_1,INF_CID_1
INF_XXX_N是对在INF Models节列出的硬件和兼容性ID的缩写。
下表列出了当比较示例设备的ID和INF文件的ID时,Setup可以设置的可能的匹配等级:
设备的ID INF文件Models节的ID
INF_HWID_1 INF_CID_1
HwID_1 0级 1000-1FFF级
HwID_2 1级 1000-1FFF级
CID_1 2000-2FFF级 3000-3FFF级
CID_2 2000-2FFF级 3000-3FFF级
在这个例子中,Setup开始取出设备的第一个硬件ID,HwID_1,并把它和机器中的INF中的ID比较。如果Setup匹配了HwID_1和INF文件Models节列出的第一个硬件ID,它增加此驱动程序节点到它的潜在驱动程序列表中,并将此匹配等级置为0级。如果Setup匹配了任何其他INF文件Models节的ID和HwID_1,它给这些匹配分配等级并将它们增加到它的潜在驱动程序列表中。
接着,Setup取出设备附加的硬件ID,并和INF中的ID比较。如果它找到任何匹配,它给这些匹配分配等级并将它们增加到它的设备的潜在驱动程序列表中。然后它为设备的兼容性ID进行同样的过程(如果有兼容性ID)。
在Setup构造了它的完整的潜在驱动程序列表后,它为设备选择最佳的驱动程序(最小等级的驱动程序)。如果不只一个驱动程序有相同的最小等级,Setup选择最近日期的驱动程序。驱动程序的日期由驱动程序INF文件的DriverVer项说明。如果驱动程序包没有数字签名,Setup忽略任何DriverVer项并使用默认的日期00/00/0000。如果两个驱动程序有相同的等级和相同的日期,Setup选择任何一个。
通过处理DIF_SELECTBESTCOMPATDRV请求(或者对于手工安装的设备是DIF_SELECTDEVICE请求),类安装程序和协同安装程序能参与驱动程序的选择。在Setup构造了它的潜在驱动程序列表后但是在它选择最佳的驱动程序前,Setup发送这个DIF请求。当处理这些DIF编码时,类安装程序和协同安装程序对潜在的驱动程序设置DNF_BAD_DRIVER标记,如果安装程序能够判断驱动程序不能支持设备。如果潜在的驱动程序节点DNF_BAD_DRIVER标记被设置,Setup做选择时会忽略此驱动程序。
当安装程序处理DIF_SELECTBESTCOMPATDRV请求(或者DIF_SELECTDEVICE)时,安装程序通过改变潜在驱动程序的等级也可以参与驱动程序的选择。但是,安装程序改变驱动程序的等级的唯一方式是设置等级为0xFFFF。这个等级值指示驱动程序可以为设备使用,但是仅作为最后的选择。安装程序不应该把设备等级设为中间值,因为它们会干扰适当的驱动程序选择,也因为等级范围容易改变。
不是更改驱动程序的选择过程,类安装程序和协同安装程序可以重载Setup的条目选择过程并直接为设备选择驱动程序。但是,这并不被推荐,因为Setup的选择算法在将来版本中可能会被加强,它自己选择驱动程序也会引起安装程序阻止Setup的选择操作的进行。参见《Windows 2000驱动程序开发参考》卷1中的DIF_SELECTBESTCOMPATDRV和DIF_SELECTDEVICE获得更多信息。
为了说明驱动程序选择过程,考虑一个示例的视频设备,它匹配INF文件的三个驱动程序节点。设备的父总线驱动程序(pci.sys)报告以下的设备ID:
设备的硬件ID:
PCI\VEN_FFFF&DEV_493D&SUBSYS_001C105D&REV_00
PCI\VEN_FFFF&DEV_493D&SUBSYS_001C105D
PCI\VEN_FFFF&DEV_493D&CC_030000
PCI\VEN_FFFF&DEV_493D&CC_0300
设备的兼容性ID:
PCI\VEN_FFFF&DEV_493D&REV_00
PCI\VEN_FFFF&DEV_493D
PCI\VEN_FFFF&CC_030000
PCI\VEN_FFFF&CC_0300
PCI\VEN_FFFF
PCI\CC_030000
PCI\CC_0300
在这个例子中,Setup在INF文件中找到三个驱动程序节点可以匹配设备的ID。第一个匹配的驱动程序的节点如下:
%Sample% = Sample.DDInstall,PCI\VEN_FFFF&DEV_493D&CC_0300
设备的第四个硬件ID和上面的INF项的硬件ID匹配,所以这是个等级为3的驱动程序匹配。Setup增加这个驱动程序到它的潜在驱动程序列表中。这个驱动程序支持这种类型的任何视频设备(有任何子系统厂商ID和任何硬件版本号的视频设备)。
Setup为设备匹配的第二个INF ID在它的Models表项中有以下的驱动程序节点:
%Sample2% = Sample2.DDInstall,PCI\VEN_FFFF&DEV_493D& SUBSYS_001C105D
设备的第二个硬件ID和上面的INF项的硬件ID匹配,所以这是个等级为1的驱动程序匹配。Setup增加这个驱动程序到它的潜在驱动程序列表中。这个驱动程序支持有这个特定子系统厂商ID及任何硬件版本号的设备。
Setup为设备匹配的第三个INF ID在它的Models表项中有以下的驱动程序节点:
%Sample3% = vga,PCI\CC_0300
设备的最后一个兼容性ID和上面的INF项的硬件ID匹配,所以这个驱动程序匹配的等级在2000-2FFF范围内。Setup增加这个驱动程序到它的潜在驱动程序列表中。这个驱动程序是一个支持任何PCI视频设备的通用驱动程序(VGA驱动程序)。
对于这个例子,如果类安装程序和协同安装程序不更改Setup给驱动程序匹配指定的等级,Setup选择等级为1的驱动程序,%Sample2%。
1.4 系统设置阶段
对于大多数设备,你应该设计设备和支持文件以便Setup在系统启动的适当时间或者启动后机器正在运行的任何时候能安装设备。但是,某些设备必须在系统启动的特殊阶段被安装。为协助这些设备的厂商,这一节提供了一些系统设置阶段和设备安装相关的背景信息。
当Windows 2000启动时,Setup程序的初始阶段仅安装Windows 2000运行所需要的最小数目的设备,如键盘、鼠标、显示适配器、SCSI/Disk和Machine/HAL。这个阶段的Setup程序是文本模式的设置。对于在文本模式设置期间安装设备的用户,你的分发盘必须包括一个名为txtsetup.oem的文本文件。更多的信息,参见第9章---安装一个要求重新启动机器的设备。
在文本模式设置完成后,Setup程序启动Windows 2000并继续安装的GUI模式阶段。Setup在GUI模式设置阶段安装大多数设备。
在GUI模式设置阶段没有安装的设备包括那些需要用户交互的安装。例如,如果这是第一次设备被设置并且一个此设备的协同安装程序提供了定制一个完成页,Setup必须向用户显示此页。当用户以管理员权限登录时,Setup执行这种设备安装。
一旦机器启动并运行,用户可以安装新设备:
·为安装一个新的PnP设备,将设备插入机器中。
如果设备和总线支持热插拔通知,设备安装被自动初始化。
如果用户需要关掉机器,打开机箱以插入设备,设备将在系统启动时被识别和配置。
当系统正在运行时,如果设备能被插入,并且设备和总线不支持热插拔通知,使用增加/删除硬件向导以初始化设备配置。(选择“安装”)
·安装一个非PnP设备,使用增加/删除硬件向导。
如果Setup能在系统进程的可信任的上下文中安装设备,用户不需要管理员权限来安装设备。如果Setup需要提示用户信息,它要求在管理员用户的进程上下文中安装设备。
为了更新已安装设备的驱动程序,使用设备管理器或者适宜的控制面板小程序中的硬件页。(点击控制面板小程序中的硬件页的属性按钮以启动设备的设备管理器。)

你可能感兴趣的:(windows设备安装总览)