オプションのディスパッチ ルーチン
ドライバーに次のディスパッチ ルーチンが用意されていることがあります。
-
IRP_MJ_CLEANUP は、ターゲット デバイス オブジェクトに関連付けられているファイル オブジェクトの最後のハンドルが閉じていることを示しています。 未処理の I/O 要求がファイル オブジェクトに残っている可能性があります。 ドライバーは、DispatchCleanup ルーチンを実装して、どの特定のファイル ハンドルにも固有ではないクリーンアップを実行できます。 ドライバーは、同じ目的で自身の DispatchClose ルーチンを使用することもできます。
DispatchQueryInformation、DispatchSetInformation
最上位レベルのドライバーの中には、IRP_MJ_QUERY_INFORMATION IRP と IRP_MJ_Standard Edition T_INFORMATION IRP を処理することが必要なものがあります。 このような要求は、ユーザー モード アプリケーション、カーネル モード コンポーネント、またはドライバーがファイル オブジェクト (ドライバーのデバイス オブジェクトを表すオブジェクト) の長さに関する情報を要求していて、そのオブジェクトのハンドルをユーザー モードの要求元が持っていることを示しているか、ユーザー モードの要求元がそのファイル オブジェクトにファイルの末尾を設定しようとしていることを示しています。
並列クラス デバイス ドライバーとシリアル デバイス ドライバーは、FILE_STANDARD_INFORMATION または FILE_POSITION_INFORMATION の長さまたは位置をゼロに設定することにより、このような要求を処理します。 他の最上位レベルのデバイス ドライバーは、特にユーザー モード アプリケーションまたはカーネル モード ドライバーが C ランタイム関数を呼び出してファイル オブジェクトを操作する可能性がある場合に、このような要求をサポートする必要があります。 ファイル システム ドライバーは、これら最上位のデバイス ドライバーよりも全面的にこれらの要求をサポートする必要があります。
-
デバイスにデータをキャッシュするドライバー、またはドライバーによって割り当てられたメモリでデータを内部的にバッファーするドライバーが IRP_MJ_FLUSH_BUFFERS を受け取ることがあります。 この要求を受信したことは、バッファーしたデータをデバイスに書き込むか、キャッシュしたデータをデバイスにフラッシュする必要があること、またはデバイスから読み取ってバッファーまたはキャッシュに置いたデータを破棄する必要があることを示しています。
たとえば、デバイスからの入力データを収める内部リング バッファーを持つキーボードとマウスのクラス ドライバーはフラッシュ要求をサポートします。 大容量記憶装置のドライバーとその上に階層化されたドライバーも、この要求をサポートします。
-
システムがシャットダウンする前に呼び出される可能性が高いすべてのドライバーは IRP_MJ_SHUTDOWN を扱う必要があります。 DispatchShutdown ルーチンは、電源マネージャーがシステムの電源設定 IRP を送信してシステムをシャットダウンする前に、ドライバーで決定されたクリーンアップに必要な処理をすべて実行する必要があります。 ドライバーは、IoRegisterShutdownNotification または IoRegisterLastChanceShutdownNotification を呼び出してシャットダウン通知に登録できます。
大容量記憶装置デバイスのドライバーとその上に階層化された中間ドライバーは、最上位レベルのファイル システム ドライバーを使用して、システムがシャットダウンしようとしているときにシャットダウン IRP を送信できます。 つまり、キャッシュされたファイル データが周辺機器へ確実に書き出されるようにする措置がファイル システム ドライバーによってとられます。そのような書き出しを実現するには、基になるドライバーを呼び出して、デバイスのキャッシュや、バッファーがあればバッファーなどから、システムをシャットダウンする前にデータをフラッシュします。
データを内部的にキャッシュしている大容量記憶装置のドライバーは、DispatchShutdown ルーチンと DispatchFlushBuffers ルーチンを提供する必要があります。 大容量記憶装置のドライバーがメモリにデータがバッファーしているものの、大容量記憶装置のデバイスに内部キャッシュがない場合、そのドライバーは DispatchShutdown ルーチンと DispatchFlushBuffers ルーチンも提供する必要があります。
IRP_MJ_FLUSH_BUFFERS 要求と IRP_MJ_SHUTDOWN 要求を扱うドライバーの上位に階層化されているすべての中間ドライバーは、DispatchShutdown ルーチンと DispatchFlushBuffers ルーチンも提供します。