确定设备是否已插入

请注意,自动运行调用 的设备安装应用程序 的行为必须取决于用户是先插入硬件还是先插入分发介质。 由于独立硬件供应商 (IHV) 通常提供一个分发磁盘,并且磁盘只能有一个 AutoRun 调用的应用程序,因此 AutoRun 调用的设备安装应用程序必须确定是否已插入设备。

若要确定是否接通设备,应用程序可以调用 UpdateDriverForPlugAndPlayDevices 函数,传递设备的硬件 ID。 如果以下任一条件为 true,则设备已接通电源:

  • 函数返回 TRUE。 (这还会安装 device 的驱动程序。)

  • 函数返回 FALSE,Win32 GetLastError函数返回ERROR_NO_MORE_ITEMS。 (不进行安装。)

如果函数返回 FALSEGetLastError 返回NO_SUCH_DEVINST,则设备不会接通电源。 (不进行安装。)

重新安装拔下的设备

当以前附加的设备现在拔出时,设备的 开发节点 将保留在系统中,尽管它既处于非活动状态又处于隐藏状态。 在重新安装此类设备之前,必须先找到此“虚拟”开发节点,并将其标记为需要重新安装。 然后,当设备重新插入时,即插即用将重新连接设备,找到该设备的新驱动程序,并为设备安装驱动程序。

重新安装拔下的设备:

  1. 调用 SetupCopyOEMInf 函数。

    SetupCopyOEMInf 函数可确保 %SystemRoot%\inf 目录中存在正确的 INF 文件。

  2. 查找拔下的设备。

    调用 SetupDiGetClassDevs 函数。 在调用此函数时,清除 Flags 参数中的 DIGCF_PRESENT 标志。 必须查找 所有 设备,而不仅仅是存在的设备。 可以通过在 ClassGuid 参数中指定特定设备类来缩小搜索结果范围。

  3. 查找拔出设备的硬件 ID 和兼容 ID。

    SetupDiGetClassDevs 返回 设备信息集 的句柄,该集包含设备类中所有已安装设备(无论是否接通电源)的设备类 (假定你在) 的第一步中指定了设备类。 通过连续调用 SetupDiEnumDeviceInfo 函数,可以使用此句柄枚举设备信息集中的所有设备。 每次调用都会为设备提供 SP_DEVINFO_DATA 结构。 若要获取硬件 ID 列表,请调用 SetupDiGetDeviceRegistryProperty 函数, 并将 Property 参数设置为 SPDRP_HARDWAREID。 若要获取兼容 ID 的列表,请调用同一函数,但 属性 参数设置为 SPDRP_COMPATIBLEIDS。 这两个列表都是 MULTI-SZ 字符串。

  4. 查找设备 ID 与上一步) 的硬件 ID (或兼容 ID 之间的匹配项。

    请确保在硬件 ID/兼容 ID 与设备的 ID 之间执行完整的字符串比较。 部分比较可能会导致不正确的匹配。

    找到匹配项时,调用 CM_Get_DevNode_Status 函数,传递SP_DRVINFO_DATA。dnDevInst 参数中的 DevInst。 如果此函数返回CR_NO_SUCH_DEVINST,则确认设备未附加 (即具有虚拟 devnode) 。

  5. 标记设备。

    调用 SetupDiGetDeviceRegistryProperty 函数, 并将 Property 参数设置为 SPDRP_CONFIGFLAGS。 当此函数返回时, PropertyBuffer 参数指向注册表中的设备的 ConfigFlags 值。 使用 Regstr.h) 中定义的CONFIGFLAG_REINSTALL (执行此值的按位 OR。 执行此操作后,调用 SetupDiSetDeviceRegistryProperty 函数,其中 Property 参数设置为 SPDRP_CONFIGFLAGS,PropertyBuffer 参数设置为设备的已修改 ConfigFlags 值的地址 此操作修改注册表的 ConfigFlags 值以合并CONFIGFLAG_REINSTALL标志。 这会导致下次重新使用设备时重新安装设备。

  6. 插入设备。

    即插即用将重新运行设备,为其查找新驱动程序,然后安装该驱动程序。