WSCWriteNameSpaceOrder32 函数 (sporder.h)

WSCWriteNameSpaceOrder32 函数更改 32 位目录中的可用 Windows 套接字 (Winsock) 2 个命名空间提供程序的顺序。 命名空间提供程序的顺序确定枚举或查询名称解析时命名空间的优先级。

注意 此调用是 WSCWriteNameSpaceOrder 的严格 32 位版本,用于 64 位平台。 它用于允许 64 位进程对 32 位命名空间提供程序目录重新排序。

 

语法

int WSCWriteNameSpaceOrder32(
  [in] LPGUID lpProviderId,
  [in] DWORD  dwNumberOfEntries
);

参数

[in] lpProviderId

WSANAMESPACE_INFO 结构中找到的 NSProviderId 元素的数组。 NSProviderId 元素的顺序是命名空间提供程序的新优先级顺序。

[in] dwNumberOfEntries

NSProviderId 数组中的元素数。

返回值

如果例程成功 函数返回ERROR_SUCCESS (零) 。 否则,它将返回特定的错误代码。

错误代码 含义
WSAEFAULT
NSProviderId 数组未完全包含在进程地址空间中。
WSAEINVAL
输入参数无效,未执行任何操作。
WSANO_RECOVERY
发生了不可恢复的错误。 此错误在以下几种情况下返回:无法打开 Winsock 注册表、用户缺少写入 Winsock 注册表所需的管理权限,或者其他应用程序当前正在写入命名空间提供程序目录。
WSASYSCALLFAILURE
不应失败的系统调用失败。
WSATRY_AGAIN
函数由另一个线程或进程调用。
WSA_NOT_ENOUGH_MEMORY
内存不足,无法执行操作。
(其他)
函数可能会返回任何注册表错误代码。

注解

命名空间提供程序使用 WSCInstallNameSpace32 函数安装在 32 位命名空间提供程序目录中的 64 位平台上。 32 位目录中命名空间提供程序的最初安装顺序控制通过 WSCEnumNameSpaceProviders32 枚举它们的默认顺序。 更重要的是,此顺序还控制客户端请求名称解析时考虑命名空间提供程序的顺序。 在 64 位平台上, WSCWriteNameSpaceOrder32 函数用于允许 64 位进程更改 32 位命名空间提供程序目录中命名空间提供程序的顺序。 可以使用 WSCWriteNameSpaceOrder 函数更改本机目录中命名空间提供程序的顺序。

当前命名空间提供程序目录存储在注册表中的以下注册表项下: HKEY_LOCAL_MACHINE\SYSTEM\Current Control Set\Services\Winsock2\Parameters\NameSpace_Catalog5

用于名称解析的客户端请求使用 WSALookupServiceBeginWSALookupServiceNextWSALookupServiceEnd 例程。 传递给 WSALookupServiceBegin 的 WSAQUERYSET 结构的 dwNameSpace 成员设置为 (NS_DNS的单个命名空间的标识符,例如) 以限制搜索,或NS_ALL包含所有命名空间。 例如,如果多个命名空间提供程序支持特定命名空间 (NS_DNS) ,则返回与请求的 dwNameSpace 匹配的所有命名空间提供程序的结果,除非 将 lpNSProviderId 成员设置为特定的命名空间提供程序。 如果为 dwNameSpace 成员指定了NS_ALL,则返回所有命名空间提供程序的结果。 结果的返回顺序取决于目录中的命名空间提供程序顺序。

Windows SDK 包含一个名为 SpOrder.exe 的应用程序,该应用程序允许显示已安装命名空间提供程序的目录。 Winsock 2 包括 64 位平台上的 ws2_32.DLL,用于导出 WSCWriteNameSpaceOrder32 函数,以便对 32 位命名空间提供程序目录中的命名空间提供程序重新排序。 可以通过与 WS2_32.lib 链接来导入此接口。 对于在 Windows XP 上运行的 Service Pack 2 (SP2) 和 Windows Server 2003 以及 Service Pack 1 (SP1) 及更高版本上运行的计算机, netsh.exe winsock show catalog 命令将显示安装的协议和命名空间提供程序。 首先显示本机 64 位目录,然后显示 32 位提供程序目录, (名称) 后用 32 表示。

WSCWriteNameSpaceOrder32 只能由以管理员组成员身份登录的用户调用。 如果 WSCWriteNameSpaceOrder32 由不是 Administrators 组成员的用户调用,则函数调用将失败,并在 lpErrno 参数中返回 WSANO_RECOVERY

对于在 Windows Vista 和 Windows Vista 上运行的计算机,此功能也可能因为用户帐户控制 (UAC) 而失败。 如果包含此函数的应用程序由以管理员以外的管理员组成员身份登录的用户执行,则此调用将失败,除非应用程序已在清单文件中标记为 requestedExecutionLevel 设置为 requireAdministrator。 如果 Windows Vista 和 Windows Vista 上的应用程序在用于生成可执行文件的清单文件中缺少此设置,则以管理员以外的管理员组成员身份登录的用户必须在增强的 shell 中执行应用程序,因为管理员 (RunAs 管理员) 才能使此功能成功。

以下列表描述了 WSCWriteNameSpaceOrder32 函数可能失败的情况:

  • dwNumberOfEntries 参数不等于已注册的命名空间提供程序数。
  • NSProviderId 数组包含无效的命名空间提供程序标识符。
  • NSProviderId 数组只包含一次所有有效的命名空间提供程序标识符。
  • 由于用户权限不足 (某些原因,函数无法访问注册表,例如) 。
  • 另一个进程(或线程)当前正在调用 函数。

要求

   
最低受支持的客户端 Windows Vista、Windows XP Professional x64 Edition [仅限桌面应用]
最低受支持的服务器 Windows Server 2008、Windows Server 2003 x64 Edition [仅限桌面应用]
目标平台 Windows
标头 sporder.h
Library Sporder.lib
DLL Ws2_32.dll

另请参阅

WSAEnumNameSpaceProviders

WSANAMESPACE_INFO

WSAQUERYSET

WSCEnumNameSpaceProviders32

WSCInstallNameSpace

WSCInstallNameSpace32

WSCWriteNameSpaceOrder