Поделиться через


Функция WPUModifyIFSHandle (ws2spi.h)

Функция WPUModifyIFSHandle получает (возможно) измененный дескриптор IFS из Ws2_32.dll.

Синтаксис

SOCKET WPUModifyIFSHandle(
  [in]  DWORD  dwCatalogEntryId,
  [in]  SOCKET ProposedHandle,
  [out] LPINT  lpErrno
);

Параметры

[in] dwCatalogEntryId

Дескриптор, определяющий поставщика вызывающей службы.

[in] ProposedHandle

Дескриптор IFS, выделенный поставщиком.

[out] lpErrno

Указатель на код ошибки.

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

Если ошибка не возникает, WPUModifyIFSHandle возвращает измененный дескриптор сокета. В противном случае он возвращает INVALID_SOCKET, и в lpErrno доступен определенный код ошибки.

Код ошибки Значение
WSAEINVAL
Предлагаемый дескриптор недопустим.
 
 

Комментарии

Дескриптор WPUModifyIFSHandle позволяет WS2_32.dll оптимизировать свои внутренние операции, возвращая возможно измененную версию предоставленного дескриптора IFS. Возвращаемый дескриптор гарантированно будет неотличим от предлагаемого дескриптора в отношении операционной системы. Поставщики IFS должны вызывать эту функцию, прежде чем возвращать поставщику услуг только что созданный дескриптор сокета. Поставщик услуг будет использовать измененный дескриптор только для всех последующих операций сокета. Эта подпрограмма используется только поставщиками IFS, дескрипторы сокетов которых являются реальными дескрипторами IFS.

 
**Рекомендации по многоуровневой службе**

Эту процедуру также может использовать многоуровневый поставщик, который расположен поверх базового поставщика IFS и хочет предоставить дескриптор сокета базового поставщика в качестве собственных, а не создавать их с помощью вызова WPUCreateSocketHandle . Многоуровневый поставщик, которому требуется "пройти" дескриптор сокета IFS, который он получает от следующего слоя в цепочке, может вызвать WPUModifyIFSHandle, передавая свой собственный идентификатор записи каталога как dwCatalogEntryId. Это информирует библиотеку DLL Windows Sockets о том, что этот слой, а не следующий слой, должен быть целевым для вызовов SPI с использованием этого дескриптора сокета.

При таком подходе многоуровневый поставщик должен соблюдать несколько ограничений.

  • Поставщик должен предоставлять базовые точки входа поставщика для LPWSPSend и LPWSPRecv в таблице диспетчеризации процедур, возвращаемой во время WSPStartup , чтобы обеспечить максимально эффективный доступ клиента WINDOWS Sockets SPI к этим функциям.
  • Поставщик не может полагаться на вызов функций LPWSPSend и LPWSPRecv для всех операций ввода-вывода, особенно в случае системных функций ввода-вывода ReadFile и WriteFile. Эти функции будут обходить многоуровневый поставщик и вызывать реализацию базового поставщика IFS напрямую, даже если многоуровневый поставщик помещает собственные точки входа для этих функций в таблицу диспетчеризации процедур.
  • Поставщик не может полагаться на возможность последующей обработки перекрывающихся операций ввода-вывода с помощью LPWSPSend, LPWSPSendTo, LPWSPRecv, LPWSPRecvFrom или LPWSPIoctl. Постобработка уведомления может выполняться через порты завершения и полностью обходить многоуровневый поставщик. Многоуровневый поставщик не может определить, использовался ли порт завершения, или определить, какой это порт. Многоуровневый поставщик не может вставить себя в последовательность уведомлений.
  • Поставщик должен передавать все перекрывающиеся запросы ввода-вывода непосредственно базовому поставщику, используя исходные перекрывающиеся параметры (например, структуру WSAOVERLAPPED и указатель подпрограммы завершения). Поставщик должен предоставить базовую точку входа поставщика для WSPGetOverlappedResult. Так как некоторые перекрывающиеся запросы ввода-вывода могут полностью обойти многоуровневый поставщик, многоуровневый поставщик не может надежно пометить структуры WSAOVERLAPPED , чтобы определить, для каких из них он может сообщать результаты, а какие из них необходимо передать в WSPGetOverlappedResult базового поставщика. Это фактически означает, что LPWSPIoctl должна быть операцией сквозной передачи для базового поставщика.

Требования

Требование Значение
Минимальная версия клиента Windows 2000 Professional [только классические приложения]
Минимальная версия сервера Windows 2000 Server [только классические приложения]
Целевая платформа Windows
Header ws2spi.h

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

WPUCreateSocketHandle

WSAOVERLAPPED

WSPGetOverlappedResult

LPWSPIoctl

LPWSPRecv

LPWSPSend