次の方法で共有


フィルター モジュールの一時停止

実行中のフィルター モジュールを一時停止するには、NDIS は、フィルター ドライバーの FilterPause 関数を呼び出します。 フィルター モジュールは、FilterPause 関数の実行開始時に一時停止状態になります。

NDIS は、ドライバー スタックを一時停止するプラグ アンド プレイ操作の一部としてフィルター モジュールを一時停止します。 ドライバー スタックの一時停止の概要については、「ドライバー スタックの一時停止」を参照してください。

一時停止」状態にあるフィルター モジュールの代わりに、フィルター ドライバーは次の手順を実行します。

  • 新しい受信インジケーターを開始しないでください。

    送受信操作の詳細については「フィルター モジュールの送受信操作」を参照してください。

  • フィルター ドライバーが発信し、NDIS が完了していない受信操作がある場合、フィルター ドライバーは、このような操作を完了する NDIS を待機する必要があります。 NDIS がこのようなすべての未処理の受信の表示の FilterReturnNetBufferLists 関数を呼び出すまで、一時停止操作は完了しません。

  • 基になるドライバーが NDIS に直ちに発信したことを示す未処理の受信通知を返す必要があります。 ドライバーがこのような未処理の受信表示の NdisFReturnNetBufferLists 関数を呼び出すまで、一時停止操作は完了しません。 これらの未処理の受信表示は、ドライバーが基になるドライバーから受信したバッファーをキューに入れる場合に存在する可能性があります。

  • 基になるドライバーが NdisFReturnNetBufferLists 関数を呼び出すことによって直ちに NDIS に発信する新しい受信表示を返す必要があります。 必要に応じて、ドライバーは受信表示をコピーし、それらを返す前にキューに置くことができます。

    注:NdisFReturnNetBufferLists は、対応する FilterReceiveNetBufferLists 呼び出しに設定されている NDIS_RECEIVE_FLAGS_RESOURCES フラグで示された NBL に対して呼び出さないでください。 このような NBL は、FilterReceiveNetBufferLists ルーチンから返すことによって、NDIS に同期的に返されます。

  • 新しい送信要求を発信しないでください。

  • フィルター ドライバーが発信し、NDIS が完了していない送信操作がある場合、フィルター ドライバーは、このような操作を完了する NDIS を待機する必要があります。 NDIS がこのような未処理のすべての送信要求に対して FilterSendNetBufferListsComplete 関数を呼び出すまで、一時停止操作は完了しません。

  • FilterSendNetBufferLists 関数に対して行われたすべての新しい送信要求は、NdisFSendNetBufferListsComplete 関数を呼び出すことによって直ちに返す必要があります。 フィルター ドライバーは、各 NET_BUFFER_LIST 構造体の Status メンバーを NDIS_STATUS_PAUSED に設定する必要があります。

  • NdisFIndicateStatus 関数で状態を示すことができます。

    状態表示の詳細については「フィルター モジュールの状態の表示」を参照してください。

  • FilterStatus 関数の状態表示を処理する必要があります。

  • FilterOidRequest 関数で OID 要求を処理する必要があります。

    OID 要求の詳細については「フィルター モジュールの OID 要求」を参照してください。

  • OID 要求を開始できます。

  • アタッチ操作中にドライバーが割り当てたリソースを解放しないでください。

  • 送信操作と受信操作を停止するために必要な場合は、タイマーを取り消す必要があります。

    タイマーの詳細については、「 NDIS 6.0 タイマー サービス」を参照してください。

フィルター ドライバーは、送受信操作を正常に一時停止した後、一時停止操作を完了する必要があります。 フィルター ドライバーは、FilterPause からそれぞれ NDIS_STATUS_SUCCESS または NDIS_STATUS_PENDING を返すことによって、同期的または非同期的に一時停止操作を完了できます。

ドライバーが NDIS_STATUS_PENDING を返す場合は、一時停止操作が 完了した後、NdisFPauseComplete 関数を呼び出す必要があります。

一時停止」状態にあるフィルター モジュールの代わりに、フィルター ドライバーは次の手順を実行します。

  • 新しい受信表示を発信しないでください。

  • 基になるドライバーが NdisFReturnNetBufferLists 関数を呼び出すことによって直ちに NDIS に発信する新しい受信表示を返す必要があります。 必要に応じて、ドライバーは受信表示をコピーし、それらを返す前にキューに置くことができます。

  • 新しい送信要求を発信しないでください。

  • FilterSendNetBufferLists 関数に対して行われたすべての新しい送信要求は、NdisFSendNetBufferListsComplete 関数を呼び出すことによって直ちに返す必要があります。 フィルター ドライバーは、各 NET_BUFFER_LIST 構造体の Status メンバーを NDIS_STATUS_PAUSED に設定する必要があります。

  • NdisFIndicateStatus 関数で状態を示すことができます。

  • FilterStatus 関数の状態表示を処理する必要があります。

  • FilterOidRequest 関数で OID 要求を処理する必要があります。

  • OID 要求を開始できます。

NDIS は、フィルター ドライバーが一時停止状態にある間、接続、切断、再起動要求など、他のプラグ アンド プレイ操作を開始しません。 NDIS は、フィルター ドライバーが一時停止状態になった後で切断または再起動要求を開始できます。 フィルター モジュールを切断する方法の詳細については、「フィルター モジュールの切断」を参照してください。 フィルター モジュールを再起動する方法の詳細については、「フィルター モジュールの開始」を参照してください。