NDIS ポートのアクティブ化
ミニポート ドライバーが NDIS ポートを正常に割り当てた後、NDIS 関数でポート番号を使用する前に、ドライバーはポートをアクティブにする必要があります。 ポートをアクティブ化するには、ミニポート ドライバーは NDIS にポートのアクティブ化プラグ アンド プレイ (PnP) イベントを送信します。 ポートのアクティブ化 PnP イベントを送信するには、ミニポート ドライバーは、NdisMNetPnPEvent 関数の呼び出しで NetEventPortActivation PnP イベント コードを使用します。
ポートをアクティブ化するには、ミニポート ドライバーは、NdisMNetPnPEvent の NetPnPEvent パラメーターが次のように指す NET_PNP_EVENT_NOTIFICATION 構造体のメンバーを設定する必要があります。
PortNumber
イベント通知の送信元ポート。 NetPnPEvent メンバーが指定する構造体の Buffer メンバーにポート番号が指定されているため、このメンバーを 0 に設定します。
NetPnPEvent
ポートのアクティブ化イベントを記述する NET_PNP_EVENT 構造体。 この構造体のメンバーを次のように設定します。
NetEvent
イベントを記述するイベント コード。 このメンバーを NetEventPortActivation に設定します。
Buffer
NDIS_PORT 構造体のリンク リストへのポインター。 NDIS_PORT 構造体の Next メンバーは、リスト内の次の NDIS_PORT 構造体を指します。
BufferLength
Buffer で指定されているバイト数。 BufferLength を NDIS_PORT 構造体のサイズに設定します。
その他のメンバー
NET_PNP_EVENT の残りのメンバーを NULL に設定します。
ミニポート ドライバーは、NDIS_PORT 構造体のリンク リストで非アクティブからアクティブに状態を変更したポートを一覧表示します。 ただし、ミニポート アダプターの既定のポートが NetEventPortActivation PnP イベントのターゲットである場合は、既定のポートが一覧内の唯一のポートである必要があります。
ミニポート ドライバーが NDIS にポートのアクティブ化を通知する場合 (できれば、この通知呼び出しが返される前に)、ミニポート ドライバーは、ポートに関連付けられている送信要求と OID 要求を処理可能な状態でなければなりません。 ミニポート ドライバーは、状態で新しくアクティブ化されたポートのポート番号を使用しないか、NdisMNetPnPEvent への呼び出しが返されるまで表示を受け取る必要があります。
NDIS は、既定のポートがアクティブになるまで、アクティブ化されたポートについて上位ドライバーに通知しません。 NDIS がプロトコル ドライバーの ProtocolBindAdapterEx 関数を呼び出すと、NDIS は、BindParameters パラメーターが指す NDIS_BIND_PARAMETERS 構造体の ActivePorts メンバーに現在アクティブなすべてのポートの一覧を提供します。 ミニポート ドライバーが新しいポートをアクティブ化するとき、NDIS は NetEventPortActivation PnP イベントを使用してミニポート ドライバーにバインドされているすべてのプロトコル ドライバーに通知します。 プロトコル ドライバーでこれらのポート アクティブ化イベントを処理する方法の詳細については、「ポート アクティブ化 PnP イベントの処理」を参照してください。
ミニポート ドライバーは、NDIS ポートを割り当てる前に、NdisMSetMiniportAttributes 関数を呼び出して、NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES 構造体の登録属性を設定する必要があります。 ミニポート ドライバーは、NdisMSetMiniportAttributes を呼び出すときに NDIS_MINIPORT_CONTROLS_DEFAULT_PORT 属性フラグを設定することで、既定のポートのアクティブ化を制御できます。 ミニポート ドライバーが既定のポートをアクティブ化する責任を負う場合、NDIS はミニポート ドライバーがポートのアクティブ化 PnP イベントを使用して既定のポートをアクティブ化するまで、ミニポート アダプターと上位ドライバーの間のバインドを開始しません。
NDIS_PORT 構造体のリンク リストで指定されているすべてのポートは、割り当てられた状態にある必要があります。 ミニポート ドライバーは、既にアクティブなポートをアクティブ化しようすることはできません。ドライバーがアクティブなポートのアクティブ化を試みる場合、NDIS は、ポートのアクティブ化エラーとして状況を処理します。
NDIS がリストのポートをアクティブ化できない場合は、NdisMNetPnPEvent の呼び出しが失敗し、リストのいずれのポートもアクティブ状態に変化しません。 一部のポートが存在しないために NDIS がポートのアクティブ化に失敗した場合、 NdisMNetPnPEvent は NDIS_STATUS_INVALID_PORT 戻り値を返します。 一部のポートが割り当てられた状態ではないために NDIS がポートのアクティブ化に失敗した場合、 NdisMNetPnPEvent は NDIS_STATUS_INVALID_PORT_STATE 戻り値を返します。
ポートが正常にアクティブ化されると、ポートはアクティブ状態になります。 ミニポート ドライバーは、アクティブ状態のポートの受信データと状態を示すことができます。
NDIS は、既定のポートの認証状態を、 MiniportInitializeEx 関数 (DefaultPortAuthStates メンバー、 NDIS_MINIPORT_INIT_PARAMETERS 構造にある) に渡します。 ミニポート ドライバーが既定のポートを制御する場合は、ミニポート ドライバーが既定のポートをアクティブ化する際に、既定の認証設定を使用して既定のポートをアクティブ化できます。 既定の認証設定を使用するには、NDIS_PORT_CHARACTERISTICS 構造体の Flags メンバーで NDIS_PORT_CHAR_USE_DEFAULT_AUTH_SETTINGS フラグを設定します。 ミニポート ドライバーは、割り当ておよびアクティブ化するポートに対して NDIS_PORT_CHAR_USE_DEFAULT_AUTH_SETTINGS フラグを使用できます。 アクティブ化の場合、NDIS は新しくアクティブ化されたポートに既定の認証状態を割り当て、NetEventPortActivation イベントの NdisMNetPnPEvent に渡される認証状態を無視します。
既定のポートの制御とポートの割り当てについて詳しくは、「NDIS ポートの割り当て」を参照してください。