WSCInstallProviderAndChains64_32 函数 (ws2spi.h)
WSCInstallProviderAndChains64_32函数将指定的传输提供程序及其特定协议链安装到 64 位计算机上的 32 位和 64 位 Winsock 2 系统配置数据库中。 此函数可确保协议链在传输提供程序配置信息的开头进行排序,无需单独调用 WSCWriteProviderOrder 。
语法
int WSCInstallProviderAndChains64_32(
[in] LPGUID lpProviderId,
[in] const LPWSTR lpszProviderDllPath,
[in] const LPWSTR lpszProviderDllPath32,
[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 字符串的指针,该字符串包含提供程序 64 位 DLL 的加载路径。 此字符串观察路径解析的常规规则,可以包含嵌入的环境字符串 (,例如 %SystemRoot%) 。 当 Ws2_32.dll 随后必须代表应用程序加载提供程序 DLL 时,会扩展此类环境字符串。 扩展任何嵌入的环境字符串后, Ws2_32.dll 将生成的字符串传递给 LoadLibrary 函数,后者会将提供程序加载到内存中。 有关详细信息,请参阅 LoadLibrary。
[in] lpszProviderDllPath32
指向 Unicode 字符串的指针,该字符串包含提供程序 32 位 DLL 的完全限定路径。 此字符串观察路径解析的常规规则,可以包含嵌入的环境字符串 (,例如 %SystemRoot%) 。 当 Ws2_32.dll 随后代表应用程序加载提供程序 DLL 时,会扩展此类环境字符串。 扩展任何嵌入的环境字符串后, Ws2_32.dll 将生成的字符串传递到 LoadLibrary 函数,以将提供程序加载到内存中。 有关详细信息,请参阅 LoadLibrary。
[in] lpszLspName
指向 Unicode 字符串的指针,该字符串包含分层服务提供程序的名称 (LSP) 。
[in] dwServiceFlags
要创建的分层协议目录条目类型的服务标志。 分层协议条目是 ChainLen 成员设置为 0 的WSAProtocol_Info结构。 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 系统配置数据库中传输提供程序新安装的分层协议条目的指针。 这是用于生成 LSP 目录中安装的协议链条目的 ID。
[out] lpErrno
指向调用生成的错误代码(如果函数失败)的指针。
返回值
如果 WSCInstallProviderAndChains64_32 成功,则返回零。 否则,它将返回 SOCKET_ERROR,并在 lpErrno 参数中返回特定的错误代码。
错误代码 | 含义 |
---|---|
一个或多个参数不在用户地址空间的有效部分。 | |
一个或多个参数无效。 对于以下情况,将返回此错误:lpProviderId 参数为 NULL, lpszProviderDllPath 参数无效或路径长度过大, (**MAX_PATH**已超出) ,lpszLspName 参数无效或名称长度过大 (**WSAPROTOCOL_LEN**) ,lpProtocolInfoList 设置为非 NULL,dwNumberOfEntries参数为零,目录中已存在重复的提供程序 ID 或分层服务提供程序名称,或者找不到指定协议、地址系列和套接字类型的匹配项。 | |
|
提供程序缺少所需的功能。 非 IFS 提供程序必须实现所有 Winsock 2 扩展函数 (AcceptEx、 ConnectEx、 DisconnectEx、 TransmitFile、 TransmitPackets 和 LPFN_WSARECVMSG (WSARecvMsg) ) 。 |
提供程序安装已在进行中。 | |
无法为缓冲区分配内存。 | |
发生了不可恢复的错误。 此错误在以下几种情况下返回:提供程序已安装、 lpProtocolInfoList 参数为 NULL 且未找到基提供程序、达到最大协议链长度 (**MAX_PROTOCOL_CHAIN**) 、用户缺少写入 Winsock 注册表所需的管理权限,或者在创建或安装目录条目时失败。 | |
不应失败的系统调用失败。 |
注解
WSCInstallProviderAndChains64_32 是用于安装单个传输服务提供商的基本 WSCInstallProvider64_32 函数的增强版本。 如果正在安装分层服务提供程序,则应使用 WSCInstallProviderAndChains64_32 。 WSCInstallProviderAndChains64_32 可以通过单个函数调用安装分层协议和一个或多个协议链。 若要使用 WSCInstallProvider64_32 完成相同的工作,需要调用多个函数。
Winsock 2 适用于分层协议。 分层协议是一种仅实现更高级别的通信功能,同时依赖于基础传输堆栈与远程终结点进行实际数据交换的协议。 分层协议的一个示例是安全层,该层将协议添加到连接建立过程,以便执行身份验证并建立相互同意的加密方案。 此类安全协议通常需要底层可靠传输协议(如 TCP 或 SPX)的服务。 术语基协议是指能够与远程终结点执行数据通信的 TCP 或 SPX 等协议。 术语分层协议用于描述不能独立协议。 然后,协议链将被定义为一个或多个分层协议,这些协议串在一起并由基本协议锚定。 基本协议将 WSAProtocol_Info 结构的 ChainLen 成员设置为 BASE_PROTOCOL定义为 1。 分层协议将 WSAPROTOCOL_INFO 结构的 ChainLen 成员设置为LAYERED_PROTOCOL定义为零。 协议链将 WSAPROTOCOL_INFO 结构的 ChainLen 成员设置为大于 1。
WSCInstallProviderAndChains64_32 是 WSCInstallProviderAndChains 的 64 位版本。 它将提供程序安装到 64 位平台上的 32 位和 64 位目录中。 这意味着在 64 位平台上维护两个 Winsock 目录,并且 32 位和 64 位进程都可以加载随此函数安装的 LSP。
在 64 位计算机上,所有不是专为 32 位 (设计的调用(例如),所有不以“32”结尾的函数 ) 在本机 64 位目录上运行。 在 64 位计算机上执行的进程必须使用 WSCInstallProviderAndChains64_32 在 32 位目录和 64 位目录上运行,以保持兼容性。 特定 32 位调用的定义和语义与其本机调用相同。
如果 lpProtocolInfoList 设置为 NULL,则此函数将创建协议链,其中提供程序在地址系列、套接字类型和协议定义的每个唯一协议类型的基协议上分层。 这消除了创建任何不可访问的重复提供程序条目。
如果 lpProtocolInfoList 设置为非 NULL 值,则此函数将通过从提供数组中的每个元素获取配置信息中与 {address family, socket type, protocol} 元组匹配的最顶层条目来创建协议链。 同样,仅考虑 {address family, socket type, protocol} 元组;将忽略所有其他成员和重复项。
成功完成此调用后,对 WSAEnumProtocols、 WSCEnumProtocols 或 WSCEnumProtocols32 的任何后续调用都将返回新创建的协议链条目。 请注意,在 Windows 环境中,当 WSAEnumProtocols、WSCEnumProtocols 和 WSCEnumProtocols32 返回时,只有通过调用 WSAStartup 创建的 WSCInstallProviderAndChains64_32Ws_32.dll 实例才会包含新条目。
成功后, WSCInstallProviderAndChains64_32 将尝试通过调用 WSAProviderConfigChange 来提醒已注册更改通知的所有相关应用程序。
WSCInstallProviderAndChains64_32函数只能由以管理员组成员身份登录的用户调用。 如果WSCInstallProviderAndChains64_32由不是 Administrators 组成员的用户调用,则函数调用将失败,并在 lpErrno 参数中返回WSANO_RECOVERY。 对于运行 Windows Vista 或 Windows Server 2008 的计算机,此功能也可能因为用户帐户控制 (UAC) 而失败。 如果包含此函数的应用程序由以管理员组成员身份登录(而非内置管理员)的用户执行,则此调用将失败,除非应用程序已在清单文件中标记为 requestedExecutionLevel 设置为 requireAdministrator。 如果 Windows Vista 或 Windows Server 2008 上的应用程序缺少此清单文件,则作为内置管理员以外的管理员组成员登录的用户必须在增强的 shell 中执行应用程序,因为内置管理员 (运行方式管理员) 才能使此功能成功。
任何文件安装或特定于提供程序的配置必须由调用应用程序执行。
IFS 和非 IFS 提供程序
IFS 提供程序是返回本机操作系统句柄的提供程序。 通常,这些句柄与内核模式协议驱动程序相关联。 例如,基 TCP/IPv4、UDP/IPv4、TCP/IPv6 和 UDP/IPv6 是 IFS 提供程序,因为这些条目对应于内核模式组件。 IFS 句柄可用于 “ReadFile” 、 **WriteFile** 和 **CancelIo** 函数调用。 作为 IFS 提供程序的分层服务提供程序只返回从较低提供程序 (创建的套接字句柄,该句柄也必须是直接) 调用应用程序的 IFS 提供程序。 IFS LSP 无法截获 Winsock 调用的完成通知。非 IFS 提供程序是使用 WPUCreateSocketHandle 创建中间句柄并将此句柄返回给调用方的提供程序。 这允许非 IFS LSP 在调用应用程序之前截获发送和接收完成事件,以允许后处理 (例如,) 解密接收的数据区块。 非 IFS 套接字句柄可用于调用 ReadFile 和 WriteFile,但不能与 CancelIo 一起使用。 取消非 IFS 句柄上的操作的唯一保证方法是使用 closesocket 关闭套接字。
32 位和 64 位提供程序 DLL 的路径
lpszProviderDllPath 表示提供程序 DLL 64 位版本的完全限定路径。 此参数可以包含嵌入的环境字符串 (,例如 %SystemRoot%) 。lpszProviderDllPath32 表示提供程序 DLL 的 32 位版本的完全限定路径。 此参数可以包含嵌入的环境字符串 (,例如 %SystemRoot%) 。
如果 lpszProviderDllPath32 为 NULL,则 lpszProviderDllPath 是 32 位和 64 位提供程序的路径。 例如,当 64 位计算机上的 32 位进程 (运行时,当 Winsock 应用程序加载 32 位版本的 LSP) 时,它会尝试加载 lpszProviderDllPath 中指定的 32 位提供程序。 如果 lpszProviderDllPath32 为 NULL,则必须将 lpszProviderDllPath 参数设置为 %windir%\system32<dllname>。 如果不是这种情况,调用将失败并显示 WSAEINVAL。 如果 lpszProviderDllPath 中的路径为 %windir%\system32<>当lpszProviderDllPath32 为 NULL 时,将使用文件系统重定向程序) 将调用重定向 (重定向到 GetSystemWow64Directory 返回的目录,其中 32 位 LSP 必须驻留。 对于 Windows XP 64 位版本、Windows Server 2003 和 Windows Vista,此目录为 %windir%\syswow64。
要求
最低受支持的客户端 | Windows Vista [仅限桌面应用] |
最低受支持的服务器 | Windows Server 2008 [仅限桌面应用] |
目标平台 | Windows |
标头 | ws2spi.h |
Library | Ws2_32.lib |
DLL | Ws2_32.dll |