实现网络提供程序

网络提供程序是使 Windows 操作系统能够支持特定网络协议的 DLL。 它通过实现网络提供程序 API 来执行此操作。 此 API 是 多提供程序路由器 (MPR) 调用来与网络通信的一组函数。 然后,网络提供程序将这些调用转换为特定于网络的 API 调用,以执行 MPR 指定的操作。 这样,Windows 操作系统就可以与新的网络协议进行交互,而无需了解其特定于网络的 API。

若要创建网络提供程序,请编写用于导出 NPGetCaps 函数的 DLL。

网络提供程序 API 中其他函数的支持是可选的。 如果网络提供程序不需要函数,则 DLL 不需要实现它或提供存根实现。 有关详细信息,请参阅 网络提供程序函数中的单个函数主题。

例外情况是,如果支持以下枚举函数之一,还必须支持其他两个函数: NPOpenEnumNPEnumResourceNPCloseEnum

以下指南介绍如何编写与 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 网络函数Shell API 或其他可能导致重新进入 MPR 子系统的基于 UNC 路径的查询。 如果从网络提供程序 DLL 进行此类调用,则应用程序或其他操作系统组件可能会在 MPR 子系统内遇到争用、性能不佳或死锁。