SetupAPI 使用指南

以下是使用 SetupAPI 提供的常规 Setup 函数 (SetupXxx) 和设备安装函数 (SetupDiXxx) 的准则:

  • 永远不要假定安装文件内容没有错误,或者你提供的安装文件未被恶意修改。 因此,请始终验证从 SetupAPI 函数接收的所有信息。 验证字符串长度是否有效、缓冲区大小是否有效以及索引值是否在有效范围内。

  • 为 Microsoft Windows XP 及更高版本系统上的安装编写安装应用程序时,可以调用 Windows SDK 文档) 中所述的 SetupVerifyInfFile (,这将验证未修改数字签名的 INF 文件。

  • 始终测试每个 SetupAPI 函数的返回值。 如果函数失败,代码应调用 GetLastError 以获取标识失败的错误代码。 返回的错误代码可以在 Winerror.hSetupapi.h 中定义。 在使用 FORMAT_MESSAGE_FROM_SYSTEM 调用 FormatMessage 以创建文本显示之前,请始终使用 Winerror.h) 中定义的 HRESULT_FROM_SETUPAPI 宏 (将返回值转换为 HRESULT 值。 如果 SetupAPI 函数成功返回,则代码不得调用 GetLastError。 (Windows SDK 文档中介绍了 GetLastErrorFormatMessage 函数以及系统错误代码。)

  • 如果 SetupAPI 函数返回句柄,则代码必须检查返回值 INVALID_HANDLE_VALUE。 此类函数不返回 NULL

  • 请注意 SetupDiXxxSetupXxx 函数之间的以下差异,这些函数允许调用方查询所需的缓冲区大小:

    • 如果 SetupDiXxx 函数的调用方进行此类查询, 则 GetLastError 始终返回ERROR_INSUFFICIENT_BUFFER。

    • 如果 SetupXxx 函数的调用方进行此类查询,如果未指定缓冲区长度, GetLastError 将返回NO_ERROR;如果指定的缓冲区太小,则ERROR_INSUFFICIENT_BUFFER。