NdisRegisterProtocol 函数 (ndis.h)

注意 NDIS 5。 x 已弃用,由 NDIS 6 取代。 x。 有关新的 NDIS 驱动程序开发,请参阅 从 Windows Vista 开始的网络驱动程序。 有关移植 NDIS 5 的信息。 NDIS 6 的 x 驱动程序。 x,请参阅 将 NDIS 5.x 驱动程序移植到 NDIS 6.0

NdisRegisterProtocol 在驱动程序初始化时向 NDIS 库注册 NDIS 驱动程序的 ProtocolXxx 入口点和名称。

语法

void NdisRegisterProtocol(
  [out] PNDIS_STATUS                   Status,
  [out] PNDIS_HANDLE                   NdisProtocolHandle,
  [in]  PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics,
  [in]  UINT                           CharacteristicsLength
);

参数

[out] Status

指向调用方提供的变量的指针,该变量在从此函数返回时可以是以下值之一:

  • NDIS_STATUS_SUCCESS
    NDIS 库将调用方注册为协议驱动程序。

  • NDIS_STATUS_BAD_CHARACTERISTICS
    对于 ProtocolCharacteristics 的缓冲区中指定的 MajorNdisVersion,CharacteristicsLength 太小。

  • NDIS_STATUS_BAD_VERSION
    ProtocolCharacteristics 缓冲区中指定的 MajorNdisVersion 无效。

  • NDIS_STATUS_RESOURCES
    资源(可能是内存)的不足导致 NDIS 库无法注册调用方。

[out] NdisProtocolHandle

指向调用方提供的变量的指针,此函数在其中返回表示已注册驱动程序的句柄。

[in] ProtocolCharacteristics

指向调用方设置的NDIS_PROTOCOL_CHARACTERISTICS结构的指针。 ProtocolCharacteristics 中的结构定义如下:

        typedef struct _NDIS_PROTOCOL_CHARACTERISTICS {
            UCHAR MajorNdisVersion;
            UCHAR MinorNdisVersion;
            UINT Reserved;
            OPEN_ADAPTER_COMPLETE_HANDLER OpenAdapterCompleteHandler;
            CLOSE_ADAPTER_COMPLETE_HANDLER CloseAdapterCompleteHandler;
            SEND_COMPLETE_HANDLER SendCompleteHandler;
            TRANSFER_DATA_COMPLETE_HANDLER TransferDataCompleteHandler;
            RESET_COMPLETE_HANDLER ResetCompleteHandler;
            REQUEST_COMPLETE_HANDLER RequestCompleteHandler;
            RECEIVE_HANDLER ReceiveHandler;
            RECEIVE_COMPLETE_HANDLER ReceiveCompleteHandler;
            STATUS_HANDLER StatusHandler;
            STATUS_COMPLETE_HANDLER StatusCompleteHandler;
            NDIS_STRING Name;
        //
        // MajorNdisVersion must be set to 0x04 or 0x05
        // with any of the following members.
        //
            RECEIVE_PACKET_HANDLER ReceivePacketHandler;
            BIND_HANDLER BindAdapterHandler;
            UNBIND_HANDLER UnbindAdapterHandler;
            PNP_EVENT_HANDLER PnPEventHandler;
            UNLOAD_PROTOCOL_HANDLER UnloadHandler;
        //
        // MajorNdisVersion must be set to 0x05 
        // with any of the following members.
        //
            CO_SEND_COMPLETE_HANDLER CoSendCompleteHandler;
            CO_STATUS_HANDLER CoStatusHandler;
            CO_RECEIVE_PACKET_HANDLER CoReceivePacketHandler;
            CO_AF_REGISTER_NOTIFY_HANDLER CoAfRegisterNotifyHandler;
        } NDIS_PROTOCOL_CHARACTERISTICS, *PNDIS_PROTOCOL_CHARACTERISTICS;

在设置以下成员之前,驱动程序应用零初始化此结构:

  • MajorNdisVersion
    指定驱动程序使用的 NDIS 库的主版本。 当前值为 0x05,尽管 NDIS 库继续支持为 NDIS V4.0 开发的现有驱动程序。 NDIS 不再支持 V3.0 协议。

  • MinorNdisVersion
    指定次要 NDIS 版本。 当前值为 0x00。

  • Reserved
    此成员保留供系统使用。

  • OpenAdapterCompleteHandler
    指定调用方 ProtocolOpenAdapterComplete 函数的入口点。

  • CloseAdapterCompleteHandler
    指定调用方 ProtocolCloseAdapterComplete 函数的入口点。

  • SendCompleteHandler
    指定调用方 ProtocolSendComplete 函数的入口点(如果有)。

  • TransferDataCompleteHandler
    指定调用方 ProtocolTransferDataComplete 函数的入口点(如果有)。

  • ResetCompleteHandler
    指定调用方 ProtocolResetComplete 函数的入口点。

  • RequestCompleteHandler
    指定调用方 ProtocolRequestComplete 函数的入口点。

  • ReceiveHandler
    指定调用方 ProtocolReceive 函数的入口点(如果有)。

  • ReceiveCompleteHandler
    指定调用方 ProtocolReceiveComplete 函数的入口点。

  • StatusHandler
    指定调用方 ProtocolStatus 函数的入口点(如果有)。

  • StatusCompleteHandler
    指定调用方 ProtocolStatusComplete 函数的入口点。

  • 名称
    在系统默认字符集中包含调用方初始化的计数字符串(命名驱动程序)的NDIS_STRING类型。 对于 Windows 2000 及更高版本的驱动程序,此字符串包含 Unicode 字符。 也就是说,对于 Windows 2000 及更高版本,NDIS 将NDIS_STRING类型定义为 UNICODE_STRING 类型。 此字符串必须与安装协议时在 “服务) ”下的注册表 (中指定的字符串匹配。

    NdisRegisterProtocol 将提供的字符串转换为大写,因此协议驱动程序编写器不能假定更改已注册协议名称的大写会为驱动程序创建唯一名称。

  • ReceivePacketHandler
    指定调用方的 ProtocolReceivePacket 函数的入口点(如果有)或 NULL。 绑定到任何支持多包接收指示的 NIC 驱动程序的协议应提供 ProtocolReceivePacket 函数来增强其性能。 但是,将自身专门绑定到面向连接的微型端口的协议也可以将此成员设置为 NULL

  • BindAdapterHandler
    指定调用方 ProtocolBindAdapter 函数的入口点。 将 MajorNdisVersion 成员中的值设置为 0x05 或 0x04 的调用方必须提供 ProtocolBindAdapter 函数并支持即插即用。 NDIS 中间驱动程序还必须提供 ProtocolBindAdapter 函数,该函数允许这些中间驱动程序调用 NdisIMRegisterLayeredMiniport 并延迟完全驱动程序初始化,直到基础 NIC 驱动程序初始化为止。

  • UnbindAdapterHandler
    指定调用方 ProtocolUnbindAdapter 函数的入口点。 提供 ProtocolBindAdapter 函数的 NDIS 驱动程序还必须提供 ProtocolUnbindAdapter 函数。

  • PnPEventHandler
    指定调用方 ProtocolPnPEvent 函数的入口点(如果有)。

  • UnloadHandler
    指定调用方 ProtocolUnbind 函数的入口点(如果有)或 NULL

  • CoSendCompleteHandler
    指定调用方 ProtocolCoSendComplete 函数的入口点,面向连接的客户端或调用管理器必须提供该入口点。 面向连接的客户端提供 ProtocolSendComplete 函数(如果它还将自身绑定到无连接微型端口)。

  • CoStatusHandlerCoStatusHandler
    指定调用方 ProtocolCoStatus 函数的入口点,面向连接的客户端或调用管理器必须提供该入口点。 面向连接的客户端提供 ProtocolStatus 函数(如果它还将自身绑定到无连接微型端口)。

  • CoReceivePacketHandler
    指定调用方的 ProtocolCoReceivePacket 函数的入口点,面向连接的客户端或调用管理器必须提供该入口点。 面向连接的客户端提供 ProtocolReceivePacket 函数和/或 ProtocolReceiveProtocolTransferDataComplete 函数(如果它还将自身绑定到无连接微型端口)。

  • CoAfRegisterNotifyHandler
    指定调用方 ProtocolAfRegisterNotify 函数的入口点,面向连接的客户端必须提供该入口点。

[in] CharacteristicsLength

指定 ProtocolCharacteristics 结构的大小(以字节为单位)。 如果在 #include Ndis.h 之前在源文件中指定生成指令 -DNDIS50=1 或 -DNDIS40=1,则 (NDIS_PROTOCOL_CHARACTERISTICS) 的大小将自动设置为适当的值。 如果未指定这两个指令,则 NDIS 假定正在使用 V3.0 特征结构。

特征结构的 MajorNdisVersionMinorNdisVersion 成员中设置的值必须与 build 指令一致,或者它们必须分别0x03和0x00。

返回值

备注

协议驱动程序必须将 MajorNdisVersion 指定为 0x05 (当前版本) 或0x04。 NDIS 不再支持 V.30 协议,因此不会加载指定 MajorNdisVersion 为 0x03 的协议。

所有协议都必须即插即用 (支持 PnP) 。 因此,协议必须为 BindAdapterHandlerUnbindAdapterHandler 指定入口点。 NDIS 不会加载为这些处理程序指定 NULL 的协议。

为了获得最佳性能,任何将自身分层在支持多包接收的无连接 NIC 驱动程序之上的协议都应提供 ProtocolReceivePacket 函数。 此类协议驱动程序还必须提供 ProtocolReceive 函数。 任何支持多包发送的无连接 NIC 驱动程序也可能指示多包接收。

所有面向连接的协议(无论是客户端还是调用管理器)都必须注册 ProtocolCoReceivePacket 函数。 将自身绑定到无连接 NIC 驱动程序的客户端协议也提供 ProtocolReceivePacketProtocolReceive 函数。 面向连接的协议必须通过调用客户端的 NdisClOpenAddressFamily 或从其 ProtocolBindAdapter 函数调用呼叫管理器的 NdisCmRegisterAddressFamily,向 NDIS 注册其他面向连接的入口点。

成功调用 NdisRegisterProtocol 后,驱动程序无法更改它提供的 ProtocolXxx 函数集。

成功注册的驱动程序应保存 NdisProtocolHandle 返回的句柄。 它是驱动程序随后调用的其他 NdisXxx 函数的必需参数。

成功调用 NdisRegisterProtocol 后,PnP 感知协议或面向连接的协议的 DriverEntry 函数将返回控件,因为随后将调用此类驱动程序的 ProtocolBindAdapter 函数一次或多次,以设置到基础 NIC 的绑定 (s) 。 否则,协议驱动程序可以调用 NdisOpenAdapter 来设置到基础 NIC 驱动程序的绑定,或者将自身分层到注册了一组 NDIS MiniportXxx 函数的任何 NDIS 驱动程序之上。

  • 目标平台: 通用
  • 版本:Windows Vista 中的 NDIS 6.0 驱动程序不支持。 请改用 NdisRegisterProtocolDriver。 支持 Windows Vista 和 Windows XP 中的 NDIS 5.1 驱动程序。

要求

要求
Header ndis.h (包括 Ndis.h)
Library Ndis.lib
IRQL PASSIVE_LEVEL

另请参阅