プロトコル ドライバーの PnP イベントと電源管理イベントの処理
オペレーティング システムが、ネットワーク インターフェイス カード (NIC) を表すターゲット デバイス オブジェクトにプラグ アンド プレイ (PnP) I/O 要求パケット (IRP) または電源管理 IRP を発行すると、NDIS は IRP をインターセプトします。 NDIS は、ドライバーの ProtocolNetPnPEvent 関数を呼び出すことによって、各バインドされたプロトコル ドライバーとバインドされた各中間ドライバーへのイベントを示します。 ProtocolNetPnPEvent の呼び出しでは、NDIS は、NET_PNP_EVENT構造体を含む NET_PNP_EVENT_NOTIFICATION へのポインターを渡します。 NET_PNP_EVENT 構造体は、示されている PnP イベントまたは電源管理イベントを記述します。 プロトコル ドライバー PnP インターフェイスの詳細については、「プロトコルドライバーでの PnP イベント通知の処理」を参照してください。
次の一覧には、NET_PNP_EVENT 構造体の NetEvent コードで示されているように、PnP イベントと電源管理イベントが含まれています:
NetEventSetPower
ミニポート アダプターが特定の電源状態に移行する必要があることを指定する電源の設定要求を示します。 電源管理に対応したプロトコル ドライバーは、常にNDIS_STATUS_SUCCESS を返すことによって、このイベントを成功させる必要があります。 古いプロトコル ドライバーは、NDIS がミニポート アダプターからバインドを解除する必要があることを示す NDIS_STATUS_NOT_SUPPORTED を返すことができます。
設定された電源要求を発行した後、ミニポート アダプターが低電力状態に移行している場合、NDIS はドライバー スタックを一時停止します。 ミニポート アダプターが動作状態 (D0) に移行している場合、NDIS は、電源設定要求の前にドライバー スタックを再起動します。 ドライバー スタックの一時停止と再起動の詳細については、「ドライバースタックの一時停止」を参照してください。
ミニポート アダプターが低電力状態の場合、プロトコル ドライバーは OID 要求を発行できません。 この要件は、ドライバー スタックが一時停止状態のときに適用される他の制限に追加される追加の電源管理制限です。
基になるミニポート アダプターが電源管理に対応していない場合、ミニポート ドライバーは、NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES の PowerManagementCapabilities メンバーを NULL に設定し、NDIS は NDIS_BIND_PARAMETERS の PowerManagementCapabilities メンバーを NULL に設定します。
注 NDIS 6.30 以降では、このイベントの通知を受けた後、プロトコル ドライバーは新しい I/O 要求の生成を停止する必要があり、ProtocolNetPnPEvent への呼び出しのコンテキスト内で保留中の I/O 要求が完了するのを待つ必要はありません。
電源設定イベントの詳細については、「中間ドライバーでの PnP イベントと電源管理イベントの処理」を参照してください。
NetEventQueryPower
クエリの電源要求を示します。基になるミニポート アダプターが特定の電源状態に移行できるかどうかをクエリします。 プロトコル ドライバーは常に NetEventQueryPower に成功する必要があります。 アクティブな接続を確立した後、プロトコル ドライバーは PoRegisterSystemState を呼び出して、連続ビジー状態を登録できます。 状態登録が有効である限り、電源マネージャーはシステムをスリープ状態にしません。 接続が非アクティブになると、プロトコル ドライバーは PoUnregisterSystemState を呼び出 して状態の登録を取り消します。 プロトコル ドライバーは、NetEventQueryRemoveDevice を失敗させて、システムがスリープ状態に移行しないようにしないでください。 NetEventQueryPower の後には常に NetEventSetPower が続きます。 デバイスの現在の電源状態を有効に設定する NetEventSetPower は、NetEventQueryPower を取り消します。
注 NDIS 6.30 以降では、このイベントの通知を受けた後、プロトコル ドライバーは、ProtocolNetPnPEvent への呼び出しのコンテキスト内で保留中の I/O 要求が完了するのを待つべきではありません。
NetEventQueryRemoveDevice
クエリ削除デバイス要求を示します。この要求は、操作を中断せずに NIC を削除できるかどうかをクエリします。 プロトコル ドライバーは、デバイスを解放できない場合 (たとえば、デバイスが使用中であるため)、NDIS_STATUS_FAILUREを返すことによって NetEventQueryRemoveDevice を失敗する必要があります。
NetEventCancelRemoveDevice
基になる NIC の削除を取り消すデバイスの取り消し要求を示します。 プロトコル ドライバーは、常にNDIS_STATUS_SUCCESSを返すことによって、このイベントを成功させる必要があります。
NetEventReconfigure
ネットワーク コンポーネントの構成が変更されたことを示します。 たとえば、ユーザーが TCP/IP の IP アドレスを変更した場合、NDIS は NetEventReconfigure コードを使用してこのイベントを TCP/IP プロトコルに示します。 プロトコル ドライバーは、まれな状況で、指定された構成変更を適用できず、使用可能な既定値がない場合にエラー コードを返すことができます。 メモリ割り当ての失敗は、プロトコルがエラー コードを返すケースの例です。 エラー コードを返すと、ユーザーにシステムの再起動を求めるメッセージが表示される可能性があります。
プロトコルでは、ProtocolNetPnPEvent 関数に渡される NetEventReconfigure 関連のデータを検証する必要があります。 このようなデータの詳細については、「プロトコル ドライバーの NET_PNP_EVENT」 を参照してください.
NetEventBindList
プロトコル ドライバーに対して、バインド リストの処理順序が再構成されたことを示します。 この一覧は、処理時にプロトコルのバインドに適用される相対的な順序 (たとえば、複数のバインドのいずれかにルーティングされる可能性があるユーザー要求) を示します。 このイベントで渡されるバッファーには、NULL で終わる Unicode 文字列として書式設定されたデバイス名の一覧が含まれています。 各デバイス名の形式は、ProtocolBindAdapterEx の呼び出しに渡される DeviceName パラメーターと同じです。
プロトコルでは、ProtocolNetPnPEvent 関数に渡される NetEventBindList 関連のデータを検証する必要があります。 このようなデータの詳細については、「プロトコル ドライバーの NET_PNP_EVENT」 を参照してください.
プロトコルでは、ProtocolNetPnPEvent 関数に渡される NetEventBindList 関連のデータを検証する必要があります。 このようなデータの詳細については、「プロトコル ドライバーの NET_PNP_EVENT」 を参照してください.
NetEventBindsComplete
プロトコル ドライバーがバインドできるすべての NIC にバインドされていることを示します。 NDIS は、たとえば、PnP NIC がシステムに接続されている場合を除き、プロトコル ドライバーへのこれ以上のバインドを示しません。
NetEventPnPCapabilities
ユーザーが基になるアダプターのウェイクアップ機能を有効または無効にしたことを示します。 (NDIS が ProtocolNetPnPEvent に渡す ProtocolBindingContext パラメーターは、バインドを指定します。)
NetEventPause
指定したプロトコル バインドが一時停止状態に入る必要があることを示します。 NDIS がバインドのすべての未処理の送信要求を完了した後、バインドは一時停止状態になります。 プロトコル バインドの一時停止の詳細については、「バインドの一時停止」を参照してください。
NetEventRestart
指定したプロトコル バインドが再起動状態に入っていることを示します。 ドライバーがバインドの送受信操作を再開する準備ができたら、バインドは実行中の状態になります。 バインドの再起動の詳細については、「バインドの再起動」を参照してください。
NetEventPortActivation
指定したバインドに関連付けられているポートの一覧のアクティブ化を示します。 バインドの一時停止の詳細については、「ポート アクティブ化 PnP イベントの処理」を参照してください。
NetEventPortDeactivation
指定したバインドに関連付けられているポートの一覧の非アクティブ化を示します。 バインドの一時停止の詳細については、「ポート 非アクティブ化 PnP イベントの処理」を参照してください。
NetEventIMReEnableDevice
NDIS 6.0 以降の中間ドライバーの仮想ミニポートの構成が変更されたことを示します。 NetEventIMReEnableDevice は、中間ドライバーが 1 つの仮想ミニポートに対してこのイベントを受信し、NetEventReconfigure イベントが中間ドライバーのすべての仮想ミニポートに適用されることを除き、NetEventReconfigure イベントに似ています。 たとえば、中間ドライバーは、ユーザーがデバイス マネージャーまたは別のソースから 1 つの仮想ミニポートを無効にしてから有効にすると、NetEventIMReEnableDevice イベントを受信します。 中間ドライバーの電源管理の例については、GitHub の Windows ドライバー サンプル リポジトリの「NDIS MUX 中間ドライバーと通知オブジェクト」ドライバー サンプルを参照してください。
NET_PNP_EVENT 構造体の Buffer メンバーは、示されているイベントに固有の情報を含むバッファーを指します。
プロトコル ドライバーはNdisCompleteNetPnPEvent を使用して ProtocolNetPnPEvent の呼び出しを非同期的に完了できます。