WSCInstallProviderAndChains 函数 (ws2spi.h)
注意
分层服务提供程序已弃用。 从Windows 8和Windows Server 2012开始,请使用 Windows 筛选平台。 WSCInstallProviderAndChains 函数将指定的 32 位传输提供程序及其特定协议链安装到 32 位计算机上的 Winsock 2 系统配置数据库中。 此函数可确保协议链在传输提供程序配置信息的开头进行排序,确保不需要单独调用 WSCWriteProviderOrder 。
语法
int WSCInstallProviderAndChains(
[in] LPGUID lpProviderId,
[in] const LPWSTR lpszProviderDllPath,
[in] const LPWSTR lpszLspName,
[in] DWORD dwServiceFlags,
[in] LPWSAPROTOCOL_INFOW lpProtocolInfoList,
[in] DWORD dwNumberOfEntries,
[out, optional] LPDWORD lpdwCatalogEntryId,
[out] LPINT lpErrno
);
参数
[in] lpProviderId
指向特定于提供程序的全局唯一标识符的指针 (GUID) 。
[in] lpszProviderDllPath
指向 Unicode 字符串的指针,其中包含提供程序 DLL 的加载路径。 此字符串观察路径解析的常规规则,可以包含嵌入的环境字符串 (%SystemRoot%,例如) 。 每当 Ws2_32.dll 随后代表应用程序加载提供程序 DLL 时,都会扩展此类环境字符串。 扩展任何嵌入的环境字符串后, Ws2_32.dll 将生成的字符串传递到 LoadLibrary 函数,以将提供程序加载到内存中。 有关详细信息,请参阅 LoadLibrary。
[in] lpszLspName
指向包含套接字提供程序名称的 Unicode 字符串的指针。
[in] dwServiceFlags
要创建的“虚拟”目录条目类型的服务标志。
虚拟条目是一个 WSAProtocol_Info 结构, ChainLen 成员设置为 0。 实际的 LSP 目录条目将引用其 ProtocolChain 成员中此虚拟条目的 ID。
可为此参数设置的可能标志如下所示:
值 | 含义 |
---|---|
|
目录条目适用于可安装文件系统 (IFS) LSP,后者返回特定于 IFS 的套接字句柄。 这些句柄直接返回到调用应用程序。 IFS LSP 无法截获 Winsock 调用的完成,并且不必实现或提供所有 Winsock 函数。 |
[in] lpProtocolInfoList
指向 WSAProtocol_Info 结构的数组的指针。 每个结构定义提供程序支持的协议、地址系列和套接字类型。 要检查的 WSAPROTOCOL_INFO 结构的成员是 iProtocol、 iAddressFamily 和 iSocketType。
[in] dwNumberOfEntries
lpProtocolInfoList 数组中的条目数。
[out, optional] lpdwCatalogEntryId
接收指向 Winsock 2 系统配置数据库中传输提供程序新安装的“虚拟”条目的指针。 此 ID 用于安装 LSP 的目录条目。
[out] lpErrno
一个指针,该指针在函数失败时接收调用生成的错误代码。
返回值
如果
WSCInstallProviderAndChains 成功,返回零。 否则,它将返回 SOCKET_ERROR,并在 lpErrno 参数中返回特定的错误代码。
错误代码 | 含义 |
---|---|
一个或多个参数不在用户地址空间的有效部分。 | |
一个或多个参数无效。 对于以下情况,将返回此错误:lpProviderId 参数为 NULL, lpszProviderDllPath 参数无效或路径长度过大, (**MAX_PATH**已超出) ,lpszLspName 参数无效或名称长度过大 (**WSAPROTOCOL_LEN**) ,lpProtocolInfoList 设置为非 NULL,dwNumberOfEntries参数为零,目录中已存在重复的提供程序 ID 或分层服务提供程序名称,或者找不到指定协议、地址系列和套接字类型的匹配项。 | |
提供程序安装已在进行中。 | |
提供程序缺少所需的功能。 | |
无法为缓冲区分配内存。 | |
发生了不可恢复的错误。 此错误在以下几种情况下返回:提供程序已安装、 lpProtocolInfoList 参数为 NULL 且未找到基提供程序、达到最大协议链长度 (**MAX_PROTOCOL_CHAIN**) 、用户缺少写入 Winsock 注册表所需的管理权限,或者在创建或安装目录条目时失败。 | |
不应失败的系统调用失败。 |
注解
WSCInstallProviderAndChains 是用于安装单个传输服务提供商的基本 WSCInstallProvider 函数的增强版本。 如果正在安装分层服务提供程序,则应使用 WSCInstallProviderAndChains 。 WSCInstallProviderAndChains 可以使用单个函数调用安装分层协议和一个或多个协议链。 若要使用 WSCInstallProvider 完成相同的工作,需要多个函数调用。
Winsock 2 适用于分层协议。 分层协议是一种仅实现更高级别的通信功能,同时依赖于基础传输堆栈与远程终结点进行实际数据交换的协议。 分层协议的一个示例是安全层,该层将协议添加到连接建立过程,以便执行身份验证并建立相互同意的加密方案。 此类安全协议通常需要底层可靠传输协议(如 TCP 或 SPX)的服务。 术语基协议是指能够与远程终结点执行数据通信的 TCP 或 SPX 等协议。 术语分层协议用于描述不能独立协议。 然后,协议链将被定义为一个或多个分层协议,这些协议串在一起并由基本协议锚定。 基本协议将 WSAProtocol_Info 结构的 ChainLen 成员设置为 BASE_PROTOCOL定义为 1。 分层协议将 WSAPROTOCOL_INFO 结构的 ChainLen 成员设置为LAYERED_PROTOCOL定义为零。 协议链将 WSAPROTOCOL_INFO 结构的 ChainLen 成员设置为大于 1。
如果 lpProtocolInfoList 设置为 NULL,则此函数将创建协议链,其中提供程序在地址系列、套接字类型和协议定义的每个唯一协议类型的基协议上分层。 这消除了创建任何不可访问的重复提供程序条目。
如果 lpProtocolInfoList 设置为非 NULL 值,则此函数将通过从提供数组中的每个元素获取配置信息中与地址系列、套接字类型和协议匹配的最顶层条目来创建协议链。 同样,仅考虑地址系列、套接字类型和协议;将忽略所有其他成员和重复项。
成功完成此调用后,对 WSAEnumProtocols 或 WSCEnumProtocols 的任何 后续调用都将返回新创建的协议链条目。 请注意,在 Windows 环境中,只有 WSCInstallProviderAndChains 成功完成后通过调用 WSAStartup 创建的 Ws_32.dll 实例才会在 WSAEnumProtocols 和 WSCEnumProtocols 返回时包含新条目。
成功后, WSCInstallProviderAndChains 将尝试通过调用 WSAProviderConfigChange 来提醒已注册更改通知的所有相关应用程序。
WSCInstallProviderAndChains 函数只能由以 Administrators 组成员身份登录的用户调用。 如果 WSCInstallProviderAndChains 由不是 Administrators 组成员的用户调用,则函数调用将失败,并在 lpErrno 参数中返回WSANO_RECOVERY。 对于运行 Windows Vista 或 Windows Server 2008 的计算机,此功能也可能因为用户帐户控制 (UAC) 而失败。 如果包含此函数的应用程序由以管理员组成员身份登录(而非内置管理员)的用户执行,则此调用将失败,除非应用程序已在清单文件中标记为 requestedExecutionLevel 设置为 requireAdministrator。 如果 Windows Vista 或 Windows Server 2008 上的应用程序缺少此清单文件,则作为内置管理员以外的管理员组成员登录的用户必须在增强的 shell 中执行应用程序,因为内置管理员 (运行方式管理员) 才能使此功能成功。
任何文件安装或特定于提供程序的配置必须由调用应用程序执行。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows Vista [仅限桌面应用] |
最低受支持的服务器 | Windows Server 2008 [仅限桌面应用] |
目标平台 | Windows |
标头 | ws2spi.h |
Library | Ws2_32.lib |
DLL | Ws2_32.dll |