Функция WSCWriteNameSpaceOrder32 (sporder.h)

Функция WSCWriteNameSpaceOrder32 изменяет порядок доступных поставщиков пространств имен Windows Sockets (Winsock) 2 в 32-разрядном каталоге. Порядок поставщиков пространств имен определяет приоритет пространства имен при перечислении или запросе разрешения имен.

Примечание Этот вызов является строго 32-разрядной версией WSCWriteNameSpaceOrder для использования на 64-разрядных платформах. Он предоставляется для того, чтобы 64-разрядные процессы могли переупорядочить каталог поставщика 32-разрядного пространства имен.

 

Синтаксис

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

Параметры

[in] lpProviderId

Массив элементов NSProviderId , найденных в структуре WSANAMESPACE_INFO . Порядок элементов NSProviderId является новым приоритетом для поставщиков пространства имен.

[in] dwNumberOfEntries

Количество элементов в массиве NSProviderId .

Возвращаемое значение

Функция возвращает ERROR_SUCCESS (ноль), если подпрограмма выполнена успешно. В противном случае возвращается определенный код ошибки.

Код ошибки Значение
WSAEFAULT
Массив NSProviderId не полностью содержится в адресном пространстве процесса.
WSAEINVAL
Входные параметры были недопустимыми, никаких действий не предпринималось.
WSANO_RECOVERY
Произошла неустранимая ошибка. Эта ошибка возвращается при нескольких условиях, включая следующие: не удалось открыть реестр Winsock, у пользователя нет прав администратора, необходимых для записи в реестр Winsock, или другое приложение в настоящее время записывает данные в каталог поставщика пространства имен.
WSASYSCALLFAILURE
Системный вызов, который никогда не должен завершаться ошибкой, завершился сбоем.
WSATRY_AGAIN
Функция вызывается другим потоком или процессом.
WSA_NOT_ENOUGH_MEMORY
Недостаточно памяти для выполнения операции.
(другое)
Функция может возвращать любой код ошибки реестра.

Комментарии

Поставщики пространств имен устанавливаются на 64-разрядных платформах в каталоге поставщиков 32-разрядных пространств имен с помощью функции WSCInstallNameSpace32 . Порядок первоначальной установки поставщиков пространств имен в 32-разрядном каталоге определяет порядок их перечисления по умолчанию через WSCEnumNameSpaceProviders32. Что еще более важно, этот порядок также определяет порядок, в котором учитываются поставщики пространства имен, когда клиент запрашивает разрешение имен. На 64-разрядных платформах предоставляется функция WSCWriteNameSpaceOrder32 , позволяющая 64-разрядным процессам изменять порядок поставщиков пространств имен в каталоге поставщиков 32-разрядных пространств имен. Порядок поставщиков пространств имен в собственном каталоге можно изменить с помощью функции WSCWriteNameSpaceOrder .

Текущий каталог поставщика пространства имен хранится в реестре в следующем разделе реестра: HKEY_LOCAL_MACHINE\SYSTEM\Current Control Set\Services\Winsock2\Parameters\NameSpace_Catalog5

Клиентский запрос разрешения имен использует подпрограммы WSALookupServiceBegin, WSALookupServiceNext и WSALookupServiceEnd . Элементу dwNameSpace структуры WSAQUERYSET, переданной в WSALookupServiceBegin, присваивается идентификатор одного пространства имен (например, NS_DNS), в котором необходимо ограничить поиск, или NS_ALL включить все пространства имен. Если несколько поставщиков пространств имен поддерживают определенное пространство имен (например, NS_DNS), результаты от всех поставщиков пространств имен, соответствующих запрошенному dwNameSpace , возвращаются, если для элемента lpNSProviderId не задан определенный поставщик пространства имен. Результаты от всех поставщиков пространств имен возвращаются, если для элемента dwNameSpace указано NS_ALL. Порядок возврата результатов зависит от порядка поставщика пространства имен в каталоге.

Пакет WINDOWS SDK включает приложение с именем SpOrder.exe, которое позволяет отображать каталог установленных поставщиков пространств имен. Winsock 2 включает ws2_32.DLL на 64-разрядных платформах, которые экспортируют функцию WSCWriteNameSpaceOrder32 для изменения порядка поставщиков пространств имен в каталоге поставщиков 32-разрядных пространств имен. Этот интерфейс можно импортировать путем связывания с WS2_32.lib. На компьютерах под управлением Windows XP с пакетом обновления 2 (SP2) и Windows Server 2003 с пакетом обновления 1 (SP1) и более поздних версий команда netsh.exe winsock show catalog отображает установленные поставщики протокола и пространства имен. Сначала отображается собственный 64-разрядный каталог, за которым следуют 32-разрядные каталоги поставщиков (обозначаются 32 после их имени).

WSCWriteNameSpaceOrder32 может вызывать только пользователь, вошедший в систему как член группы Администраторы. Если WSCWriteNameSpaceOrder32 вызывается пользователем, не включаемым в группу Администраторы, вызов функции завершится ошибкой и WSANO_RECOVERY возвращается в параметре lpErrno.

Для компьютеров под управлением Windows Vista и Windows Vista эта функция также может завершиться сбоем из-за контроля учетных записей (UAC). Если приложение, содержащее эту функцию, выполняется пользователем, вошедшего в систему как участник группы администраторов, отличный от администратора, этот вызов завершится ошибкой, если приложение не было отмечено в файле манифеста с параметром requestedExecutionLevel , для которого задано значение requireAdministrator. Если приложение в Windows Vista и Windows Vista не имеет этого параметра в файле манифеста, используемом для сборки исполняемого файла, пользователь, выполнивший вход в качестве члена группы администраторов, кроме администратора, должен выполнять приложение в расширенной оболочке в качестве администратора (администратора от имени) для успешного выполнения этой функции.

В следующем списке описаны сценарии, в которых может произойти сбой функции WSCWriteNameSpaceOrder32 :

  • Параметр dwNumberOfEntries не равен числу зарегистрированных поставщиков пространства имен.
  • Массив NSProviderId содержит недопустимый идентификатор поставщика пространства имен.
  • Массив NSProviderId не содержит все допустимые идентификаторы поставщика пространства имен только один раз.
  • По какой-либо причине функция не может получить доступ к реестру (например, недостаточные разрешения пользователя).
  • Другой процесс, или поток, в настоящее время вызывает функцию.

Требования

   
Минимальная версия клиента Windows Vista, Windows XP Professional x64 Edition [только классические приложения]
Минимальная версия сервера Windows Server 2008, Windows Server 2003 x64 Edition [только классические приложения]
Целевая платформа Windows
Header sporder.h
Библиотека Sporder.lib
DLL Ws2_32.dll

См. также раздел

WSAEnumNameSpaceProviders

WSANAMESPACE_INFO

WSAQUERYSET

WSCEnumNameSpaceProviders32

WSCInstallNameSpace

WSCInstallNameSpace32

WSCWriteNameSpaceOrder