NdisRegisterProtocol 関数 (ndis.h)

メモ NDIS 5。 x は非推奨となり、NDIS 6 に置き換えられます。 x があります。 新しい NDIS ドライバーの開発については、「 Windows Vista 以降のネットワーク ドライバー」を参照してください。 NDIS 5 の移植について説明します。 x ドライバーを NDIS 6 に設定します。 x については、「 NDIS 5.x ドライバーを NDIS 6.0 に移植する」を参照してください。

NdisRegisterProtocol は、ドライバーの初期化時に NDIS ドライバーの ProtocolXxx エントリ ポイントと名前を NDIS ライブラリに登録します。

構文

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
    CharacteristicsLength は、ProtocolCharacteristics でバッファーで指定された MajorNdisVersion に対して小さすぎます。

  • 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;

ドライバーは、次のメンバーを設定する前に、この構造体を 0 で初期化する必要があります。

  • 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 関数、 ProtocolReceive 関数、 ProtocolTransferDataComplete 関数 (コネクションレス ミニポートにもバインドする場合) を提供します。

  • CoAfRegisterNotifyHandler
    接続指向クライアントが指定する必要がある、呼び出し元の ProtocolAfRegisterNotify 関数のエントリ ポイントを指定します。

[in] CharacteristicsLength

ProtocolCharacteristics で構造体のサイズをバイト単位で指定します。 ビルド ディレクティブ -DNDIS50=1 または -DNDIS40=1 が Ndis.h より前 #includeソース ファイルで指定されている場合、sizeof(NDIS_PROTOCOL_CHARACTERISTICS) は自動的に適切な値に設定されます。 どちらのディレクティブも指定しない場合、NDIS では V3.0 の特性構造が使用されていると見なされます。

特性構造体の MajorNdisVersion メンバーと MinorNdisVersion メンバーに設定された値は、ビルド ディレクティブと一致している必要があります。または、それぞれ0x03と0x00する必要があります。

戻り値

なし

解説

プロトコル ドライバーでは、0x05 (現在のバージョン) または0x04の MajorNdisVersion を指定する必要があります。 NDIS では V.30 プロトコルがサポートされなくなったため、0x03の MajorNdisVersion を指定するプロトコルは読み込まれません。

すべてのプロトコルはプラグ アンド プレイ (PnP) 対応である必要があります。 そのため、プロトコルでは BindAdapterHandlerUnbindAdapterHandler のエントリ ポイントを指定する必要があります。 NDIS では、これらのハンドラーに NULL を 指定するプロトコルは読み込まれません。

可能な限り最高のパフォーマンスを得るには、マルチパケット受信をサポートするコネクションレス NIC ドライバーの上にそれ自体を重ね合わせて 使用するプロトコルは、ProtocolReceivePacket 関数を提供する必要があります。 このようなプロトコル ドライバーでは、 ProtocolReceive 関数も提供する必要があります。 マルチパケット送信をサポートするコネクションレス NIC ドライバーも、マルチパケットの受信を示す可能性があります。

すべての接続指向プロトコル (クライアントまたは呼び出しマネージャー) は、 ProtocolCoReceivePacket 関数を登録する必要があります。 また、コネクションレス NIC ドライバーに自身をバインドするクライアント プロトコルは 、ProtocolReceivePacket および ProtocolReceive 関数も提供します。 接続指向プロトコルでは、クライアントの場合は NdisClOpenAddressFamilyProtocolBindAdapter 関数の呼び出しマネージャーの場合は NdisCmRegisterAddressFamily を呼び出して、接続指向のエントリ ポイントを NDIS に追加登録する必要があります。

NdisRegisterProtocol の呼び出しが成功した後、ドライバーは、指定した ProtocolXxx 関数のセットを変更できません。

正常に登録されたドライバーは、 NdisProtocolHandle で返されたハンドルを保存する必要があります。 これは、ドライバーが後で呼び出す他の NdisXxx 関数に必要なパラメーターです。

NdisRegisterProtocol の呼び出しが成功すると、PnP 対応または接続指向プロトコルの DriverEntry 関数は制御を返します。これは、このようなドライバーの ProtocolBindAdapter 関数が、その後、基になる NIC へのバインドを設定するために 1 回以上呼び出されるためです。 それ以外の場合、プロトコル ドライバーは NdisOpenAdapter を呼び出して、基になる NIC ドライバーへのバインドを設定するか、NDIS ミニポートXxx 関数のセットを登録した 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

こちらもご覧ください