NdisMSetAttributesEx 関数 (ndis.h)

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

NdisMSetAttributesEx は、初期化中に呼び出し元の NIC または仮想 NIC の重要な機能について NDIS ライブラリに通知します。

構文

void NdisMSetAttributesEx(
  [in]           NDIS_HANDLE         MiniportAdapterHandle,
  [in]           NDIS_HANDLE         MiniportAdapterContext,
  [in, optional] UINT                CheckForHangTimeInSeconds,
  [in]           ULONG               AttributeFlags,
  [in, optional] NDIS_INTERFACE_TYPE AdapterType
);

パラメーター

[in] MiniportAdapterHandle

MiniportInitialize へのハンドル入力を指定します。

[in] MiniportAdapterContext

MiniportInitialize によって割り当てられた常駐コンテキスト領域のハンドルを指定します。

[in, optional] CheckForHangTimeInSeconds

NDIS が MiniportCheckForHang 関数を呼び出す間隔を秒単位で指定します。 ドライバーが OID 要求に応答していない場合、または MiniportCheckForHang への 2 回の連続する呼び出し内で要求を送信した場合、NDIS はドライバーの MiniportReset 関数を呼び出すことができます。

MiniportCheckForHang を呼び出すときに NDIS が使用する実際の間隔は、常に 2 秒の倍数です。 たとえば、5 秒を指定した場合、実際の間隔は約 4 秒になります。

このパラメーターに 0 を指定すると、NDIS は NDIS の既定の 2 秒間隔で MiniportCheckForHang を呼び出す必要があることを示します。

呼び出し元が AttributeFlags でNDIS_ATTRIBUTE_DESERIALIZEを設定した場合、NDIS はミニポート ドライバーの保留中の送信をキューに入れません。 代わりに、このような逆シリアル化されたドライバーは、受信送信をすぐに送信するのに十分なリソースがない場合は常に、後続の送信要求の独自のキューを内部的に管理する必要があります。

[in] AttributeFlags

次のフラグの 1 つ以上 (ORed) で設定できるビットマスクを指定します。

  • NDIS_ATTRIBUTE_BUS_MASTER
    呼び出し元の NIC がバス マスター DMA デバイスであるかどうかを設定します。

  • NDIS_ATTRIBUTE_DESERIALIZE
    呼び出し元が逆シリアル化されたミニポート ドライバーである場合に設定します。

  • NDIS_ATTRIBUTE_IGNORE_PACKET_TIMEOUT
    NDIS がキューに入っている保留中の送信パケットを呼び出し元にタイムアウトさせる必要がない場合に設定します。 中間ドライバーはこのフラグを設定する必要がありますが、NIC ドライバーは設定しないでください。

  • NDIS_ATTRIBUTE_IGNORE_REQUEST_TIMEOUT
    NDIS が保留中のクエリをタイムアウトにしようとせず、呼び出し元にキューに登録されている要求を設定するかどうかを設定します。 中間ドライバーはこのフラグを設定する必要がありますが、NIC ドライバーは設定しないでください。

  • NDIS_ATTRIBUTE_INTERMEDIATE_DRIVER
    呼び出し元が中間ドライバーの場合は を設定します。

  • NDIS_ATTRIBUTE_IGNORE_TOKEN_RING_ERRORS
    トークン リング エラーが示されている場合、NDIS がトークン リング NIC ドライバーの MiniportReset 関数を呼び出さない場合に設定します。

  • NDIS_ATTRIBUTE_NO_HALT_ON_SUSPEND
    システムが低電力 (スリープ) 状態に移行する前に、NDIS がドライバーの MiniportHalt 関数を呼び出さない場合に設定します。 ハードウェア保守状態に依存するドライバーは、このフラグを設定しないでください。

    メモこのフラグを設定すると、ネットワーク インターフェイス カード (NIC) の [プロパティ] ダイアログ ボックスの [電源管理] タブにある [このデバイスの電源をオフにチェックをコンピューターに許可する] ボックスが無効になります。 NIC で電源管理が可能な場合でも、電源管理は無効になります。

  • NDIS_ATTRIBUTE_SURPRISE_REMOVE_OK
    ドライバーがユーザー通知なしで NIC の削除を処理できるかどうかを設定します。 このようなドライバーは、 MiniportPnPEventNotify 関数をエクスポートします。 NDIS_ATTRIBUTE_SURPRISE_REMOVE_OKのシステム サポートは、Windows XP 以降のオペレーティング システムで利用できます。

  • NDIS_ATTRIBUTE_NOT_CO_NDIS
    接続指向デバイスとコネクションレス デバイスの両方をサポートし、デバイスがコネクションレス デバイスであることを示すことができるドライバーによって設定されます。 NDIS_ATTRIBUTE_NOT_CO_NDISのシステム サポートは、Windows XP 以降のオペレーティング システムで利用できます。

  • NDIS_ATTRIBUTE_USES_SAFE_BUFFER_APIS
    NdisBufferVirtualAddressSafeNdisGetFirstBufferFromPacketSafe、および NdisQueryBufferSafe を使用して、送信パケット バッファーのシステム仮想アドレスに排他的にアクセスするドライバーによって設定されます。 NDIS_ATTRIBUTE_USES_SAFE_BUFFER_APISは、物理的なアドレスを排他的に使用してこのようなバッファーにアクセスするドライバーによっても設定されます。 NDIS_ATTRIBUTE_USES_SAFE_BUFFER_APIS設定すると、オペレーティング システムが送信パケット バッファーをシステム仮想アドレスにマップする必要がないため、パフォーマンスが向上する可能性があります。 NDIS_ATTRIBUTE_USES_SAFE_BUFFER_APISのシステム サポートは、Windows XP 以降のバージョンで利用できます。

  • NDIS_ATTRIBUTE_DO_NOT_BIND_TO_ALL_CO
    TAPI サービスを提供しない CoNDIS ミニポート ドライバーによって設定されます。 NDIS_ATTRIBUTE_DO_NOT_BIND_TO_ALL_CO設定すると、NDIS はミニポート ドライバーを NDIS TAPI プロキシ ドライバー (NDPROXY) にバインドできなくなります。 既定では、NDIS はすべての CoNDIS ミニポート ドライバーに NDPROXY をバインドします。

[in, optional] AdapterType

呼び出し元の NIC の I/O バス インターフェイスの種類を指定します。これは、通常、NIC が接続されている I/O バスの種類です。次のいずれかです。

  • NdisInterfaceInternal
    ホスト固有の内部インターフェイスを指定します。

  • NdisInterfaceIsa
    ISA インターフェイスを指定します。

  • NdisInterfaceEisa
    拡張 ISA (EISA) インターフェイスを指定します。

  • NdisInterfaceMca
    これは、サポートされなくなった MCA バスを指します。

  • NdisInterfaceTurboChannel
    Turbo チャネル インターフェイスを指定します。

  • NdisInterfacePci
    周辺機器コンポーネント 相互接続 (PCI) インターフェイスを指定します。

  • NdisInterfacePcMcia
    パーソナル コンピューター メモリ カード国際協会 (PC カード) インターフェイスを指定します。

このパラメーターは中間ドライバーには関係ありません。この引数に対して 0 を NdisMSetAttributesEx に渡す必要があります。

戻り値

なし

解説

MiniportInitialize 関数は、NdisMSetAttributesEx に指定された情報に依存する他の NdisMRegisterXxx または NdisXxx 関数を呼び出す前に、NdisMSetAttributesEx(または NdisMSetAttributes) を呼び出す必要があります。 たとえば、Nic ドライバーの NdisMAllocateMapRegisters への呼び出しは失敗します。MiniportInitialize、AttributeFlags が NDIS_ATTRIBUTE_BUS_MASTERで設定された NdisMSetAttributesEx をまだ呼び出していない場合です。

中間ドライバーは 、NdisMSetAttributes ではなく NdisMSetAttributesEx を呼び出す必要があり、 AttributeFlags でNDIS_ATTRIBUTE_INTERMEDIATE_DRIVERを設定する必要があります。 このフラグを設定すると、NDIS は、中間ドライバーを全二重ミニポート ドライバーとして扱います。これにより、中間ドライバーでまれだが断続的なデッドロックが発生するのを防ぐことができます。 したがって、すべての中間ドライバーは、同時送信と表示を処理できる必要があります。

逆シリアル化されたドライバーは NdisMSetAttributesEx も呼び出す必要があり、 AttributeFlags でNDIS_ATTRIBUTE_DESERIALIZEを設定する必要があります。 NDIS では、逆シリアル化されたドライバーの送信パケット キューは保持されず、NDIS はこのようなドライバーの MiniportXxx 関数への呼び出しをシリアル化しません。 逆シリアル化されたドライバーは、次の処理を行います。

  • すべての受信送信要求を受け入れる
  • たとえば、逆シリアル化された NIC ドライバーに現在、受信送信パケットをすぐに送信するために使用できるリソースが不足している場合など、必要に応じて内部的に受信送信パケットをキューに入れる
  • ドライバーのルーチン間で必要に応じて内部キューへのアクセスを同期する
  • 要求されたすべての送信を非同期的に完了するには、そのミニポート (Co)Send(Packets) 関数に渡された各プロトコル指定のパケット記述子を使用して NdisMSendComplete を呼び出します。

NDIS では、NdisMSetAttributesEx に渡される AttributeFlags に関係なく、すべての接続指向ミニポートが逆シリアル化されたドライバーであると想定しています。 つまり、MajorNdisVersion として0x05を使用して NdisMRegisterMiniport を呼び出すドライバーは、逆シリアル化されたミニポート ドライバーである必要があります。

シリアル化された NIC ドライバーは 、これらの関数のいずれかを MiniportInitialize から呼び出すことができますが、 NdisMSetAttributes では、NIC ドライバーの MiniportCheckForHang 関数または MiniportReset 関数が呼び出される間隔を、呼び出し元が調整することはできません。

CheckForHangTimeInSeconds の値は、送信時の NDIS ライブラリのタイムアウト間隔 (存在する場合) を決定し、呼び出し元にキューに登録されることを要求します。 既定では、NDIS はキューに登録された送信 (シリアル化されたドライバーの場合のみ) と要求を 2 回チェックハング間隔でタイムアウトします。その後、ドライバーが AttributeFlags をNDIS_ATTRIBUTE_IGNORE_PACKET_TIMEOUTに設定し、NdisMSetAttributesEx を呼び出したときにNDIS_ATTRIBUTE_IGNORE_REQUEST_TIMEOUTしない限り、ミニポートReset 関数を呼び出します。 このようなドライバーは、基になる NIC ドライバーが送信と要求を処理するタイミングを決定または制御できないため、 NdisMSetAttributesEx を呼び出すときに中間ドライバーは、これらのフラグを設定する必要があります。

NIC ドライバーでは、NDIS_ATTRIBUTE_IGNORE_PACKET_TIMEOUTフラグとNDIS_ATTRIBUTE_IGNORE_REQUEST_TIMEOUT フラグを設定しないでください。ただし、NDIS ではシリアル化された NIC ドライバーによってこのような仕様が適用されます。 ただし、NIC ドライバーは、明示的な CheckForHangTimeInSeconds を指定することで、ミニポートReset 関数が呼び出されるタイムアウト間隔を調整できます。 たとえば、モデム経由でイーサネットをエミュレートする NIC ドライバーでは、NDIS ライブラリの既定のタイムアウト間隔内のすべてのパケットが完了しない場合があります。 このような NIC でパケットがタイムアウトになると、NDIS は NIC が正しく動作しなくなったと想定し、ドライバーのミニポートReset 関数を呼び出します。 このような NIC のドライバーの場合、CheckForHangTimeInSeconds を 2 より大きい値に設定して NdisMSetAttributesEx を呼び出すと、不要なリセットが防止され、ミニポートCheckForHang 関数が呼び出されて NIC の動作状態がテストされる間隔が拡張されます。

中間ドライバーは、NDIS_ATTRIBUTE_NO_HALT_ON_SUSPEND フラグを設定する必要があります。 このフラグを設定すると、システムが低電力 (スリープ) 状態に移行する前に、NDIS がドライバーを停止できなくなります。

PnP 対応以外の NIC を管理するレガシ ミニポート ドライバーは、システムが低電力状態に移行する前に NDIS がドライバーを停止しないように、NDIS_ATTRIBUTE_NO_HALT_ON_SUSPEND フラグを設定できます。 ミニポート ドライバーがこのフラグを設定する場合、NDIS は、ミニポート ドライバーの NIC のバス ドライバーが、NIC が PM 対応ではないことを示している可能性 がある場合でも 、OID_PNP_CAPABILITIESミニポート ドライバーに対してクエリを実行します。 ミニポート ドライバーは、NDIS_STATUS_SUCCESSでOID_PNP_CAPABILITIES要求に成功する必要があります。 この OID によって返されるNDIS_PM_WAKE_UP_CAPABILITIES構造では、ミニポート ドライバーは、ウェイクアップ機能ごとに NdisDeviceStateUnspecified のデバイス電源状態も指定する必要があります。 システムが低電力状態に切り替わると、NDIS はこのようなミニポート ドライバーの MiniportHalt 関数を呼び出しません。 システムが低電力状態に移行する前に、ミニポート ドライバーは、維持するハードウェア コンテキストを保存する必要があります。 D3 状態に 対するOID_PNP_SET_POWER 要求を受信すると、ミニポート ドライバーは NIC を低電力状態の適切な状態に設定する必要があります。 D0 状態へのOID_PNP_SET_POWER要求を受信すると、ミニポート ドライバーは、NIC を動作状態に適した状態に設定する必要があります。

デバイスの突然の削除 (ユーザー インターフェイスによる通知なしの削除) をサポートするミニポート ドライバーは、NDIS_ATTRIBUTE_SURPRISE_REMOVE_OK設定する必要があります。 これにより、NDIS は、ミニポートのデバイスが通知なしで削除されると、PnPEventNdisDevicePnPEventSurpriseRemoved に設定されたドライバーのミニポートPnPEventNotify 関数を呼び出します。 さらに、NDIS_ATTRIBUTE_SURPRISE_REMOVE_OKを設定すると、デバイスを削除する前にデバイスを停止するようにユーザーに求める警告ダイアログ ボックスの表示が抑制されます。

コネクションレス デバイスと接続指向デバイスの両方をサポートできるミニポート ドライバーは、そのデバイスがコネクションレス デバイスの場合NDIS_ATTRIBUTE_NOT_CO_NDIS設定する必要があります。 それ以外の場合、ドライバーは接続指向ミニポート ドライバー関数を NdisMRegisterMiniport に登録するため、NDIS はデバイスが接続指向であると誤って想定します。

一般に、NIC ドライバーは、NIC のレジストリ内のハードウェア リソースを要求する NdisXxx 関数を呼び出す前に NdisMSetAttributesEx を呼び出す必要があります。これは、このような呼び出しを行う前に NDIS に AttributeFlags 値が必要であり、ドライバーは通常、これらの呼び出しの情報を格納するために MiniportAdapterContext のメモリを必要とするためです。 この制限は、NIC ドライバーのミニポート初期化関数が NdisMSetAttributesEx を呼び出す前に、次の NdisXxx を呼び出すことができないことを意味します。

ただし、 NdisMSetAttributesEx を呼び出す前に、ドライバーの MiniportInitialize 関数は Ndis を呼び出すことができます レジストリにインストールされている構成情報を取得するための構成関数。 また、ミニポート初期化では、ドライバーのインターフェイスの種類に対してインストールされているレジストリ エントリがバスの種類固有の NdisReadXxxMiniportInitialize 呼び出しと一致する限り、NdisReadPciSlotInformation などのバスの種類固有の NdisReadXxx 関数を呼び出すこともできます。

NdisMSetAttributesEx に提供される MiniportAdapterContext ハンドルは、NdisMRegisterMiniport または NdisIMRegisterLayeredMiniport の呼び出しで、MiniportInitialize と共に登録されたすべての MiniportXxx 関数への入力パラメーターになります。 通常、このハンドルは、 ミニポート初期化によって割り当てられた常駐メモリへのポインターであり、ドライバーは NIC 固有の実行時状態を維持します。

  • ターゲット プラットフォーム: ユニバーサル
  • バージョン: Windows Vista の NDIS 6.0 ドライバーではサポートされていません。 代わりに NdisMSetMiniportAttributes を使用してください。 Windows Vista および Windows XP の NDIS 5.1 ドライバーでサポートされています。

要件

要件
Header ndis.h (Ndis.h を含む)
Library Ndis.lib
IRQL PASSIVE_LEVEL

こちらもご覧ください