IRP_MN_DEVICE_USAGE_NOTIFICATION

システム コンポーネントは、デバイスが特別なファイルをサポートできるかどうかをデバイスのドライバーにする確認するために、この IRP を送信します。 特別なファイルには、ページング ファイル、ダンプ ファイル、休止状態ファイルが含まれます。 デバイスのすべてのドライバーが IRP に成功した場合、システムは特別なファイルを作成します。 システムはまた、特別なファイルがデバイスから削除されたことをドライバーに通知するためにも、この IRP を送信します。

ファンクション ドライバーのデバイスにページング ファイル、ダンプ ファイル、または休止状態ファイルを含めることができる場合は、ファンクション ドライバーはこの IRP を処理する必要があります。 フィルター ドライバーがフィルター処理しているファンクション ドライバーが IRP を処理する場合は、フィルタードライバーはこの IRP を処理する必要があります。 バス ドライバーは、そのアダプターまたはコント ローラー (バス FDO) およびその子デバイス (子 PDO) に対して、この IRP を処理する必要があります。

0x16

主要なコード

IRP_MJ_PNP

送信時

システムは、ページング ファイル、ダンプ ファイル、または休止状態ファイルを作成または削除するときに、この IRP を送信します。 デバイスに、従来の親子関係の外部に電源管理のリレーションシップがある場合、ドライバーは、別のデバイス スタックにデバイスの使用状況情報を伝達するために、この IRP を送信することができます。 詳細については、「IRP_MN_QUERY_DEVICE_RELATIONS」の PowerRelations 要求の説明を参照してください。

システム コンポーネントとドライバーは、任意のスレッド コンテキストの中で、IRQL PASSIVE_LEVEL でこの IRP を送信します。

入力パラメーター

IO_STACK_LOCATION 構造体の Parameters.UsageNotification.InPath メンバーは BOOLEAN です。 このパラメーターが TRUE の場合、システムはデバイスでページング、クラッシュ ダンプ、または休止状態のファイルを作成しています。 InPathFALSE の場合、このようなファイルはデバイスから削除されています。

Parameters.UsageNotification.Type は、ファイルの種類を示す列挙型です。 このパラメーターには、DeviceUsageTypePagingDeviceUsageTypeDumpFile、または DeviceUsageTypeHibernation のいずれかの値があります。

出力パラメーター

なし

I/O 状態ブロック

ドライバーは、Irp->IoStatus.Status を STATUS_SUCCESS または適切なエラー状態に設定します。

ドライバーは、Irp->IoStatus.Information フィールドを変更しません。この値は、IRP を送信するコンポーネントによって設定された 0 のままで維持されます。

操作

ドライバーは、この IRP を、IRP がデバイス スタックを下に下がっていくときと、スタックを上に向かって戻っていくときに処理します。

ドライバーは、次のような手順でこの IRP に応答します。

  • Parameters.UsageNotification.InPathTRUE の場合は、デバイスが特殊なファイルをサポートしているかどうかを判断します。

    ドライバーは、ドライバーがサポートできる特定の Parameters.UsageNotification.Type をテストする必要があります。 今後、他の通知の種類が追加される可能性があります。

    各通知の種類をサポートするために必要なアクションについては、以下の詳細情報を参照してください。

    Parameters.UsageNotification.InPathTRUE で、ドライバーがデバイス上の特別なファイルをサポートできない場合、ドライバーはエラー状態で IRP を完了する必要があります。

  • デバイスが特別なファイルをサポートしている場合:

    1. 適切なアクションを実行して、デバイスに特別なファイルが含まれていること、または現在は含まれていないことを反映します。

      ドライバーは通常、カウンターをインクリメントまたはデクリメントします。 たとえば、Parameters.UsageNotification.TypeDeviceUsageTypePagingParameters.UsageNotification.InPathTRUE の場合は、デバイス上のページング ファイルの数をインクリメントします。 特定のドライバー ディスパッチ ルーチンは、カウンターをチェックする必要があります。

      特殊なファイルを含むデバイスは、無効にならないようにする必要があります。 ドライバーは IoInvalidateDeviceState を呼び出して、PnP マネージャーにデバイスの PnP デバイス状態情報について再クエリの実行を要求できます。 結果として得られる IRP_MN_QUERY_PNP_DEVICE_STATE IRP に応答して、ドライバーは PNP_DEVICE_NOT_DISABLEABLE フラグを設定する必要があります。

      InPathFALSE の場合、ドライバーは、デバイスのデバイス オブジェクトに DO_POWER_PAGABLE ビットを設定します。

    2. デバイスの使用状況情報を、その情報を必要とする関連デバイスに伝達します。

      IRP_MN_DEVICE_USAGE_NOTIFICATION IRP の処理の一環として、ドライバーは、1 つ以上の他のデバイス スタックに情報を渡す必要があります。 このようなドライバーは、1 つ (または複数の) 新しい IRP_MN_DEVICE_USAGE_NOTIFICATION IRP を作成し、1 つ (または複数の) 適切なデバイス スタックに送信します。 ドライバーは、受信したデバイス使用状況 IRP の処理を完了する前に、デバイス使用状況通知 IRP の完了を待機する必要があります。

      関連するデバイスを識別する方法は、デバイス固有およびドライバー固有です。 通常、ドライバーは、ファイルの I/O 要求の送信先である他のドライバーに、IRP を送信します。 バス ドライバーは、子デバイスのこの要求を処理するときに、デバイスの親のデバイス スタックに使用状況通知 IRP を送信する必要があります。

      たとえば、ftdisk が 5 つのディスクのストライプ セットを実行している場合、これらの各デバイスがページング ファイル操作を処理するために必要になる場合があるため、ftdisk は、これらの 5 つの各ディスクにページング通知を伝達します。

    3. ファンクションまたはフィルター ドライバーで、IoCompletion ルーチンを設定します。

    4. ファンクションまたはフィルター ドライバーで、Irp->IoStatus.Status を STATUS_SUCCESS に設定して、次のスタックの場所を設定し、IoCallDriver を使用して次の下位ドライバーに IRP を渡します。 IRP は完了させません。

      子 PDO の IRP を処理しているバス ドライバーで、Irp->IoStatus.Status を設定し、IRP (IoCompleteRequest) を完了します。

    5. IRP 完了処理中:

      下位ドライバーが IRP に失敗したことを IoCompletion ルーチンが検出した場合、ファンクションまたはフィルター ドライバーは、IRP に応答して実行した操作を元に戻し、エラーを伝達する必要があります。 ファンクションまたはフィルター ドライバーが使用状況情報を他のデバイス スタックに伝達した場合は、ドライバーは、これらのスタックに別の使用状況 IRP を送信して、エラーを通知する必要があります。

      状態が STATUS_SUCCESS で InPathTRUE の場合は、DO_POWER_PAGABLE ビットをクリアします。

プラグ アンド プレイのマイナー IRP の処理に関する一般的な規則については、「プラグ アンド プレイ」を参照してください。

デバイスでのページング、クラッシュ ダンプ、休止状態のファイルのサポート

ドライバーのいずれかの特殊なファイル数が 0 以外の場合、ドライバーは、そのデバイス (または子孫デバイス) 上の特殊なファイルの存在をサポートする必要があります。

デバイス上に作成された DeviceUsageTypePaging ファイルに対して、ドライバーは次の操作を行う必要があります。

  • DispatchReadDispatchWriteDispatchDeviceControlDispatchPower ルーチンのメモリ内のコードをロックします。

  • (IRP がデバイス スタックを上に向かっていくときに) デバイスのデバイス オブジェクトの DO_POWER_PAGABLE ビットをクリアします。

  • デバイスの IRP_MN_QUERY_STOP_DEVICE 要求と IRP_MN_QUERY_REMOVE_DEVICE 要求に失敗します。

デバイス上の DeviceUsageTypeDumpFile ファイルに対して、ドライバーは次の操作を行う必要があります。

  • DispatchReadDispatchWriteDispatchDeviceControlDispatchPower ルーチンのメモリ内のコードをロックします。

  • デバイスを D0 状態から外さないようにします。

    アイドル検出用にデバイスを登録しません (PoRegisterDeviceForIdleDetection)。 デバイスが既に登録されている場合は、登録をキャンセルします。 ドライバーがデバイスの独自のアイドル状態の検出を実行する場合は、このような検出を停止します。

  • (IRP がデバイス スタックを上に向かっていくときに) デバイスのデバイス オブジェクトの DO_POWER_PAGABLE ビットをクリアします。

  • デバイスの IRP_MN_QUERY_STOP_DEVICE 要求と IRP_MN_QUERY_REMOVE_DEVICE 要求に失敗します。

デバイス上の DeviceUsageTypeHibernation ファイルに対して、ドライバーは次の操作を行う必要があります。

  • DispatchReadDispatchWriteDispatchDeviceControlDispatchPower ルーチンのメモリ内のコードをロックします。

  • ドライバーが、システムが休止状態に入ろうとしていることを示す S4 システム電源 IRP を受け取ったときに、デバイスが D0 状態であることを確認します。

  • S4 休止状態操作の一部である D3 電源設定 IRP に応答して、デバイスの電源を切らないようにします。 詳細については、「システム電源操作」を参照してください。

    このような D3 電源設定 IRP を受信した場合は、デバイスの電源をオフにして電源マネージャー (PoSetPowerState) に通知することを除いて、デバイスを D3 状態にするために必要なすべてのタスクを実行します。 休止状態ファイルが書き込まれるまで、デバイスは電源を保持する必要があります。

  • (IRP がデバイス スタックを上に向かっていくときに) デバイスのデバイス オブジェクトの DO_POWER_PAGABLE ビットをクリアします。

  • デバイスの IRP_MN_QUERY_STOP_DEVICE 要求と IRP_MN_QUERY_REMOVE_DEVICE 要求に失敗します。

デバイスの電源状態、電源 IRP、ドライバーでの電源管理のサポートの詳細については、「電源管理」を参照してください。

この IRP の送信

ドライバーは、デバイスの使用状況情報を別のデバイス スタックに伝達する場合にのみ、IRP_MN_DEVICE_USAGE_INFORMATION IRP を送信することができます。 ドライバーが、デバイスの使用状況情報の最初のソースになることはありません。

要件

ヘッダー

Wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)

関連項目

DispatchDeviceControl

DispatchPower

DispatchRead

DispatchWrite

IoAdjustPagingPathCount

IoCallDriver

IoCompleteRequest

IO_STACK_LOCATION

IRP_MJ_PNP

IRP_MN_QUERY_DEVICE_RELATIONS

IRP_MN_QUERY_PNP_DEVICE_STATE

IRP_MN_QUERY_REMOVE_DEVICE

IRP_MN_QUERY_STOP_DEVICE

PoRegisterDeviceForIdleDetection

PoSetPowerState