SetupAPI 使用指南

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

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

  • 为 Microsoft Windows XP 及更高版本系统编写安装应用程序时,可以调用 SetupVerifyInfFile(如 Windows SDK 文档中所述),它可验证经过数字签名的 INF 文件是否已被修改。

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

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

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

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

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