辅助安装程序操作

注意

不支持本部分中介绍的功能,并且包含这些功能的驱动程序包将不再接收 Microsoft 签名。 请参阅 使用通用 INF 文件

共同安装程序由 SetupAPI 调用,如下图所示。

说明共同安装程序如何参与设备安装的示意图。

无阴影框表示操作系统为 系统提供的设备安装类提供的组件。 带阴影的框表示可以提供的组件。 如果创建自定义设备安装类,还可以提供类安装程序。 但是,你很少需要创建新的设备设置类,因为几乎每个设备都可以与系统提供的设备安装类之一相关联。 有关 Windows 组件的详细信息,请参阅 设备安装概述

可以为特定设备提供共同安装程序 (特定于设备的辅助安装程序) 或设备安装类 (类共同安装程序) 。 仅当安装注册了共同安装程序的设备时,SetupAPI 才会调用特定于设备的辅助安装程序。 操作系统和供应商可以为设备注册零个或多个特定于设备的共同安装程序。 安装为其注册了共同安装程序的设备安装程序类的任何设备时,SetupAPI 会调用类共同安装程序。 操作系统和供应商可以为设备安装类注册一个或多个类共同安装程序。 此外,可以为一个或多个安装类注册类共同安装程序。

Windows 和 自定义设备安装应用程序 通过调用 SetupDiCallClassInstaller 来安装设备,其中包含 设备安装功能代码 (DIF 代码) 。

在 GUI 模式安装期间,操作系统使用 DIF 代码调用 SetupDiCallClassInstaller ,以检测系统中存在的非 PnP 设备。 IHV 通常会提供一个共同安装程序来为 IHV 发布的非 PnP 设备执行此操作。

对于每个 DIF 请求, SetupDiCallClassInstaller 调用为设备的安装程序类注册的任何类共同安装程序、为特定设备注册的任何设备共同安装程序,然后调用系统为设备的安装类提供的类安装程序(如果有)。

自定义设备安装应用程序必须调用 SetupDiCallClassInstaller ,而不是直接调用共同安装程序或类安装程序。 此函数可确保正确调用所有已注册的共同安装程序。

类共同安装程序通常在设备安装之前注册,特定于设备的协同安装程序注册为设备安装的一部分。 因此,类共同安装程序通常在首次生成时添加到共同安装程序列表中,并在设备安装期间为所有 DIF 请求调用。

在完成设备 (或) 调用 SetupDiRegisterCoDeviceInstallers 的DIF_REGISTER_COINSTALLERS请求后,操作系统会将特定于设备的共同安装程序添加到共同安装程序列表。 特定于设备的辅助安装程序不参与以下 DIF 请求:

DIF_ALLOW_INSTALL

DIF_INSTALLDEVICEFILES

DIF_SELECTBESTCOMPATDRV

只有类共同安装程序 (非特定于设备的辅助安装程序) 才能响应以下 DIF 请求:

DIF_DETECT

DIF_FIRSTTIMESETUP

DIF_NEWDEVICEWIZARD_PRESELECT

DIF_NEWDEVICEWIZARD_SELECT

DIF_NEWDEVICEWIZARD_PREANALYZE

DIF_NEWDEVICEWIZARD_POSTANALYZE

设备共同安装程序不适合在这些上下文中,因为尚未标识特定设备,或者处于此早期安装阶段,或者设备共同安装程序尚未注册。

下图显示了在注册任何特定于设备的辅助安装程序后 ,SetupDiCallClassInstaller 调用共同安装程序和类安装程序的顺序。

调用共同安装程序进行 dif 请求处理和后处理的关系图。

在上图所示的示例中,为此设备的安装程序类注册了两个类共同安装程序,为该设备注册了一个特定于设备的辅助安装程序。 以下步骤对应于上图中带圆圈的数字:

  1. SetupDiCallClassInstaller 调用第一个类共同安装程序,指定一个 DIF 代码,指示正在 (DIF_INSTALLDEVICE处理的安装请求,在此示例中) 。 共同安装程序可以选择参与安装请求。 在此示例中,第一个注册类共同安装程序返回NO_ERROR。

  2. SetupDiCallClassInstaller 又调用任何其他已注册类共同安装程序。 在此示例中,第二类共同安装程序返回ERROR_DI_POSTPROCESSING_REQUIRED,该ERROR_DI_POSTPROCESSING_REQUIRED请求稍后调用共同安装程序进行后处理。

  3. SetupDiCallClassInstaller 调用任何已注册的特定于设备的共同安装程序。

  4. 调用所有已注册的辅助安装程序后,如果设备的安装程序类有一个, 则 SetupDiCallClassInstaller 会调用系统提供的类安装程序。 在此示例中,类安装程序返回ERROR_DI_DO_DEFAULT,这是类安装程序的典型返回值。

  5. SetupDiCallClassInstaller 调用安装请求的默认处理程序(如果有)。 DIF_INSTALLDEVICE有一个默认处理程序 SetupDiInstallDevice,它是 SetupAPI 的一部分。

  6. SetupDiCallClassInstaller 调用请求后处理的任何共同安装程序。 在此示例中,第二类共同安装程序请求后处理。

共同安装程序后处理类似于驱动程序 IoCompletion 例程,不同之处在于协同安装程序在其单一入口点再次调用。 当 SetupDiCallClassInstaller 调用共同安装程序进行后处理时,它会将 PostProcessing 设置为 TRUE并将 InstallResult 设置为 Context 参数中的相应值。 在此示例中为 ContextInstallResult NO_ERROR,因为默认处理程序已成功执行。

对于后处理, SetupDiCallClassInstaller 按相反顺序调用共同安装程序。 如果上图中的所有共同安装程序都已返回ERROR_DI_POSTPROCESSING_REQUIRED, 则 SetupDiCallClassInstaller 将首先调用 Device_Coinstaller_1 进行后处理,然后调用 Class_Coinstaller_2,然后Class_Coinstaller_1。 类安装程序不请求后处理;只有共同安装程序这样做。

即使以前的共同安装程序失败了安装请求,也会调用请求后处理的共同安装程序。