NDIS ポートの非アクティブ化
NDIS ポートを非アクティブ化するために、ミニポート ドライバーはポート非アクティブ化プラグ アンド プレイ (PnP) イベントを NDIS に送信します。 ミニポート ドライバーがポートを正常にアクティブ化した後、ドライバーはポートを解放する前にポートを非アクティブ化する必要があります。 また、ドライバーは、アプリケーション固有の理由でポートを非アクティブ化する場合があります。 ポートは非アクティブ化後に再アクティブ化できますが、ポートが解放されると再アクティブ化できません。
ポート非アクティブ化 PnP イベントを送信するために、ミニポート ドライバーは、NetEventPortDeactivation 関数の呼び出しで NetEventPortActivation PnP イベント コードを使用します。 ポートを非アクティブ化するには、ミニポート ドライバーは、NdisMNetPnPEvent の NetPnPEvent パラメーターが次のように指す NET_PNP_EVENT_NOTIFICATION 構造体のメンバーを設定する必要があります。
PortNumber
イベント通知の送信元ポート。 NetPnPEvent メンバーが指定する構造体の Buffer メンバーにポート番号が指定されているため、このメンバーを 0 に設定します。
NetPnPEvent
ポート非アクティブ化イベントを記述する NET_PNP_EVENT 構造体。 この構造体のメンバーを次のように設定します。
NetEvent
イベントを記述するイベント コード。 このメンバーを NetEventPortDeactivation に設定します。
Buffer
NDIS_PORT_NUMBER型指定された要素の配列へのポインター。 配列には、ミニポート ドライバーが非アクティブ化しているすべてのポートのポート番号が含まれています。
BufferLength
Buffer で指定されているバイト数。 BufferLength を、Buffer が指す配列のサイズに設定します。 配列内の要素数を取得するには、BufferLengthの値をNDIS_PORT_NUMBERデータ型のサイズで除算します。
その他のメンバー
NET_PNP_EVENT の残りのメンバーを NULL に設定します。
ミニポート ドライバーは、非アクティブ化するポートの一覧を配列に提供できます。 ただし、ミニポート アダプターの既定のポートが NetEventPortDeactivation PnP イベントのターゲットである場合は、既定のポートが一覧内の唯一のポートである必要があります。
ミニポート ドライバーは、アクティブなポートをいつでも非アクティブ化できます。 ただし、ミニポート ドライバーがポートを非アクティブ化する前に、そのポートに関連付けられている未処理の状態表示または受信表示がないことを確認する必要があります。 ミニポート ドライバーは、ポート非アクティブ化 PnP イベントを送信した後、非アクティブ化されたポートに関連付けられている状態を開始したり、表示を受信したりしないでください。
ミニポート ドライバーは、ポートを再アクティブ化することもできます。 NDIS ポートのアクティブ化の詳細については、 NDIS ポートのアクティブ化を参照してください。
ミニポート ドライバーがポートを非アクティブ化すると、NDIS はミニポート ドライバーにバインドされているすべてのプロトコル ドライバーに NetEventPortDeactivation PnP イベントを通知します。 この PnP イベントには、割り当てられた状態に変更されたポートが一覧表示され、すでに非アクティブ化されているポートは含まれません。 プロトコル ドライバーでのポート非アクティブ化イベントの処理の詳細については、 ポート非アクティブ化 PnP イベントの処理を参照してください。
ミニポート ドライバーは、NDIS ポートを割り当てる前に、NdisMSetMiniportAttributes 関数を呼び出して、NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES 構造体の登録属性を設定する必要があります。 ミニポート ドライバーは、NdisMSetMiniportAttributes を呼び出すときに NDIS_MINIPORT_CONTROLS_DEFAULT_PORT 属性フラグを設定することで、既定のポートのアクティブ化を制御できます。 ミニポート ドライバーが既定のポートをアクティブ化し、ミニポート ドライバーが既定のポートをアクティブ化する責任を負う場合は、ミニポートHaltEx 関数から戻る前に、既定のポートを非アクティブ化する必要があります。
NDIS_PORT_NUMBER要素の配列で指定されるすべてのポートは、アクティブ化された状態である必要があります。 ミニポート ドライバーは、既に非アクティブ化されているポートの非アクティブ化を試みないでください。
NDIS がポート配列内のポートの非アクティブ化に失敗した場合、ポート配列内のどのポートも状態を変更しません。 指定したポートの一部が存在しないために非アクティブ化が失敗した場合、 NdisMNetPnPEvent 関数はNDIS_STATUS_INVALID_PORT戻り値を返します。 一部のポートがアクティブ化状態になっていないために非アクティブ化が失敗した場合、 NdisMNetPnPEvent はNDIS_STATUS_INVALID_PORT_STATE戻り値を返します。
NdisMNetPnPEventの呼び出しが返されるまで、ポートは非アクティブ化されず、ミニポート ドライバーは OID 要求を処理し、そのポートに関連付けられている要求を送信できる必要があります。
ミニポート ドライバーが既定のポートを非アクティブ化すると、NDIS は、上にあるプロトコル ドライバーとミニポート アダプター間のすべてのバインドを閉じます。 ミニポート ドライバーが既定のポートを非アクティブ化しようとして、既定のポートが既に非アクティブ化されている場合、 NdisMNetPnPEvent は失敗し、NDIS_STATUS_INVALID_PORT_STATE戻り値を返します。 ミニポート ドライバーが既定のポートを非アクティブ化しようとし、既定のポートが、NDIS_PORT_NU MB (メガバイト)ER 要素の配列で指定されている唯一のポートではない場合、NdisMNetPnPEvent は失敗し、NDIS_STATUS_INVALID_PORT戻り値を返します。 ミニポート ドライバーがバッファーBuffer メンバーを NULL または BufferLength メンバーに 0 に設定した場合、NDIS は NdisMNetPnPEvent 呼び出しに失敗し、NDIS_STATUS_INVALID_PARAMETER戻り値を返します。
ポートが正常に非アクティブ化されると、ポートは割り当て済み状態になります。 ミニポート ドライバーは、割り当てられた状態のポートの受信データまたは状態を示すことはできません。