SetupCopyOEMInfA 函数 (setupapi.h)

[此函数可用于“要求”部分所示的操作系统。 在后续版本中可能会更改或不可用。 不应再使用 SetupAPI 来安装应用程序。 请改用 Windows Installer 来开发应用程序安装程序。 SetupAPI 继续用于安装设备驱动程序。]

SetupCopyOEMInf 函数将指定的 .inf 文件复制到 %windir%/Inf 目录。

此函数的调用方必须具有管理权限,否则该函数将失败。

语法

WINSETUPAPI BOOL SetupCopyOEMInfA(
  [in]            PCSTR  SourceInfFileName,
  [in]            PCSTR  OEMSourceMediaLocation,
  [in]            DWORD  OEMSourceMediaType,
  [in]            DWORD  CopyStyle,
  [out, optional] PSTR   DestinationInfFileName,
  [in]            DWORD  DestinationInfFileNameSize,
  [out, optional] PDWORD RequiredSize,
  [out, optional] PSTR   *DestinationInfFileNameComponent
);

参数

[in] SourceInfFileName

源 .inf 文件的完整路径。 应使用以 null 结尾的字符串。 此路径的大小不应超过 MAX_PATH,包括终止 NULL

[in] OEMSourceMediaLocation

要存储在预编译的 .inf (.pnf) 中的源位置信息。 此位置信息特定于指定的源媒体类型。 应使用以 null 结尾的字符串。 此路径的大小不应超过 MAX_PATH,包括终止 NULL

[in] OEMSourceMediaType

位置信息引用的源媒体类型。 此参数可以是以下值之一。

价值 意义
SPOST_NONE
.pnf 文件中未存储任何源媒体信息。 在这种情况下,将忽略 OEMSourceMediaLocation 的值。
SPOST_PATH
OEMSourceMediaLocation 包含源媒体的路径。 例如,如果媒体位于软盘上,则此路径可能是“A:\”。 如果 OEMSourceMediaLocationNULL,则路径假定为 .inf 所在的路径。 如果 .inf 在该位置具有相应的 .pnf,则 .pnf 文件的源媒体信息将传输到目标 .pnf 文件。
SPOST_URL
OEMSourceMediaLocation 包含通用资源定位符(URL),用于指定从中检索 .inf/驱动程序文件的 Internet 位置。 如果 OEMSourceMediaLocationNULL,则假定使用了默认的代码下载管理器位置。

[in] CopyStyle

指定如何将 .inf 文件复制到 .inf 目录中。 可以组合以下标志。

价值 意义
SP_COPY_DELETESOURCE
成功复制时删除源文件。
SP_COPY_REPLACEONLY
仅当此文件已存在于 Inf 目录中时才复制。 此标志可用于更新现有 .inf 的源位置信息。
SP_COPY_NOOVERWRITE
仅当 Inf 目录中当前不存在指定的文件时复制。 如果 .inf 当前存在,则此 API 将失败,GetLastError 返回ERROR_FILE_EXISTS。 在这种情况下,现有 .inf 文件的文件名将放置在目标 .inf 文件的信息输出缓冲区的相应字段中。
SP_COPY_OEMINF_CATALOG_ONLY
指定的 .inf 文件的相应目录文件将复制到 %windir%\Inf。 如果指定了此标志,则如果 Inf 目录中已存在指定的 .inf 文件,则会在成功返回时输入目标文件名信息。

[out, optional] DestinationInfFileName

指向缓冲区的指针,用于在复制到 Inf 目录时接收分配给它的 .inf 文件名。 缓冲区(如果指定)通常应以长度 MAX_PATH。 如果指定了SP_COPY_NOOVERWRITE标志,并且 SetupCopyOEMInf 函数因返回代码ERROR_FILE_EXISTS而失败,则此缓冲区包含现有 .inf 文件的名称。 如果指定了SP_COPY_OEMINF_CATALOG_ONLY标志,则如果 Inf 目录中已存在 .inf 文件,则此缓冲区将包含目标 .inf 文件名。 否则,此缓冲区设置为空字符串。 此参数可以 NULL

[in] DestinationInfFileNameSize

如果未指定缓冲区,则 DestinationInfFileName 缓冲区的大小(以字符为单位或零)。 如果指定 了 destinationInfFileName,并且此缓冲区大小小于返回目标 .inf 文件名(包括完整路径)所需的大小,则此函数将失败。 在本例中,GetLastError 返回ERROR_INSUFFICIENT_BUFFER。

[out, optional] RequiredSize

指向接收存储目标 .inf 文件名所需的大小(以字符为单位)的变量的指针,包括终止 NULL。 如果指定了SP_COPY_OEMINF_CATALOG_ONLY标志,则仅当 Inf 目录中已存在 .inf 文件时,此变量才会接收字符串长度。 否则,此变量设置为零。 此参数可以 NULL

[out, optional] DestinationInfFileNameComponent

指向成功返回时设置的字符串的指针(或ERROR_FILE_EXISTS),指向存储在 DestinationInfFileName 参数中路径的文件名组件的开头。 如果指定了SP_COPY_OEMINF_CATALOG_ONLY标志,DestinationInfFileName 参数可能是空字符串。 在这种情况下,字符指针设置为成功返回时 NULL。 此参数可以 NULL

返回值

此函数返回 WINSETUPAPI BOOL。

言论

SetupCopyOEMInf 函数将指定的 .inf 文件复制到 %windir%\Inf 目录中。 SetupCopyOEMInf 如果发现指定的 .inf 文件的二进制图像已存在于同名或表单 OEM*.inf 的 Inf 目录中,则不会重新复制该文件。 SetupCopyOEMInf 复制文件时,它会将复制的文件重命名为 OEM*.inf。 提供的名称是唯一的,无法预测。

SetupCopyOEMInf 使用以下过程来确定 Inf 目录中是否已存在 .inf 文件:

枚举格式为 OEM*.inf 的所有 .inf 文件,并且与指定 .inf 文件具有相同文件大小的任何文件都是二进制文件。

Inf 目录搜索 .inf 文件的源文件名。 如果同名的 .inf 文件存在并且大小与指定的 .inf 文件的大小相同,则两个文件是二进制文件,以确定它们是否相同。

如果指定的 .inf 文件已存在,则执行进一步检查以确定指定的 .inf 文件是否在其 [Version] 节中包含 CatalogFile= 条目。 如果这样做,.inf 文件的 %windir%\Inf 主文件名(扩展名为“.cat”)用于确定是否已安装目录。 如果安装了目录,但它与与源 .inf 关联的目录不同,则这不会被视为匹配项,枚举继续。 可以有多个相同的 .inf 文件,其中包含 %windir%\Inf 目录中的唯一目录。 如果未找到现有匹配项,则会在新的唯一名称下安装 .inf 和 .cat 文件。

未指定 CatalogFile= 条目的 OEM .inf 文件在数字签名验证方面被视为无效。

如果必须将 .inf 文件复制到 %windir%\Inf 目录,则报告任何数字签名验证失败。

如果 .inf 和 .cat 文件已存在,则使用这些现有文件名,并且文件替换行为基于指定的 CopyStyle 标志。 替换行为仅指存储在 .pnf 中的源媒体信息。 不会修改现有的 .inf、.pnf 和 .cat 文件。

注意

setupapi.h 标头将 SetupCopyOEMInf 定义为一个别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将中性编码别名与不中性编码的代码混合使用可能会导致编译或运行时错误不匹配。 有关详细信息,请参阅函数原型的 约定。

要求

要求 价值
最低支持的客户端 Windows XP [仅限桌面应用]
支持的最低服务器 Windows Server 2003 [仅限桌面应用]
目标平台 窗户
标头 setupapi.h
Setupapi.lib
DLL Setupapi.dll
API 集 ext-ms-win-setupapi-classinstallers-l1-1-2(在 Windows 10 版本 10.0.14393 中引入)

另请参阅

Functions

概述

SetupUninstallOEMInf