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


Реализация поставщика сети

Сетевой поставщик — это библиотека DLL, которая позволяет операционной системе Windows поддерживать определенный сетевой протокол. Для этого реализуется API поставщика сети. Этот API представляет собой набор функций, которые маршрутизатор с несколькими поставщиками (MPR) вызывает для взаимодействия с сетью. Затем поставщик сети преобразует эти вызовы в вызовы API для конкретной сети для выполнения действия, указанного MPR. Таким образом, операционная система Windows может взаимодействовать с новыми сетевыми протоколами без необходимости понимать их сетевые API.

Чтобы создать сетевой поставщик, напишите библиотеку DLL, которая экспортирует функцию NPGetCaps .

Поддержка других функций в API поставщика сети является необязательной. Если поставщику сети не требуется функция, библиотеке DLL не нужно реализовывать ее или предоставлять реализацию заглушки. Дополнительные сведения см. в разделах об отдельных функциях статьи Функции поставщика сетей.

Исключением является то, что если поддерживается одна из следующих функций перечисления, необходимо также поддерживать две другие функции: NPOpenEnum, NPEnumResource и NPCloseEnum.

В следующих рекомендациях описывается создание поставщика сети, который хорошо взаимодействует с MPR и операционной системой Windows. По возможности поставщик должен соблюдать следующие рекомендации по скорости, проверке и маршрутизации.

Speed

Поставщик сети должен быстро определить, является ли сетевой ресурс его собственным. Это связано с тем, что MPR, возможно, придется циклически пройти через множество поставщиков, чтобы найти владельца ресурса.

Если поставщик сети не является владельцем ресурса, он должен немедленно вернуть код состояния WN_BAD_NETNAME.

Также важно, чтобы поставщики, поддерживающие NPGetDirectoryType , быстро возвращали результаты для этой функции, так как она вызывается, когда WinFile рисовал дерево каталогов.

Проверка

Порядок проверки имеет важное значение. Поставщик сети должен сначала определить, запущена ли его сеть, а затем определить, поддерживает ли сеть и поставщик сети операцию. Если после этих проверок поставщик сети получает какие-либо сетевые ресурсы, он должен определить, является ли он ими владельцем. Наконец, он должен проверить другие параметры.

Маршрутизация

Если MPR должен циклически проходить через сетевых поставщиков, он будет пытаться использовать всех поставщиков до тех пор, пока один из них не примет вызов. Другими словами, MPR всегда пытается найти поставщика сети.

Однако он принимает к сведению первую значимую ошибку, о которую сообщил поставщик. Такие ошибки, как ERROR_BAD_NETPATH, ERROR_BAD_NET_NAME, ERROR_INVALID_PARAMETER ERROR_INVALID_LEVEL, считаются незначительными, так как они просто означают, что поставщик не управляет ресурсом. Однако если поставщик завершается сбоем с ошибкой ERROR_INVALID_PASSWORD или какой-либо другой значительной ошибкой, MPR записывает эту ошибку и продолжает цикличность через сетевых поставщиков. Как правило, при маршрутизации, если ни тот из поставщиков не принимает вызов, MPR сообщает о первой значительной ошибке, с которой она сталкивается во время перехода по сетевым поставщикам.

Поставщик сети должен учитывать это поведение MPR при выборе возвращаемого сообщения об ошибке.

Примечание о реализации

При реализации библиотек DLL поставщика сети поставщик не должен вызывать другие сетевые функции Windows, API оболочки или другие запросы на основе пути UNC, которые могут привести к повторному входу в подсистему MPR. При выполнении таких вызовов из библиотеки DLL поставщика сети приложение или другие компоненты операционной системы могут столкнуться с состязаниями, низкой производительностью или взаимоблокировками в подсистеме MPR.