次の方法で共有


IRP ディスパッチ ルーチンの登録

Note

最適な信頼性とパフォーマンスを実現するには、レガシ ファイル システム フィルター ドライバーではなく、フィルター マネージャーのサポートがあるファイル システム ミニフィルター ドライバーを使用します。 レガシ ドライバーをミニフィルター ドライバーに移植するには「レガシ フィルター ドライバーの移植ガイドライン」を参照してください。

レガシ フィルター ドライバーの DriverEntry ルーチンの DriverObject パラメーターは、フィルター ドライバーのドライバー オブジェクトへのポインターを提供します。 I/O 要求パケット (IRP) ディスパッチ ルーチンを登録するには、ドライバー オブジェクトの MajorFunction メンバーにこれらのルーチンのエントリ ポイントを格納する必要があります。 たとえば、架空の "MyLegacyFilter" ドライバーは、ディスパッチ ルーチンのエントリ ポイントを次のように設定できます。

for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++) {
    DriverObject->MajorFunction[i] = MyLegacyFilterDispatch;
}
DriverObject->MajorFunction[IRP_MJ_CREATE] = MyLegacyFilterCreate;
DriverObject->MajorFunction[IRP_MJ_CLOSE] = MyLegacyFilterClose;
DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = MyLegacyFilterFsControl;

forループは 、すべての IRP メジャー関数コードの既定のディスパッチ ルーチンを割り当てます。 それ以外の場合、I/O マネージャーは認識されない IRP を既定で STATUS_INVALID_DEVICE_REQUEST で完了するため、この割り当てが適切です。 このような要求は通常、ドライバー スタックの下位にある別のドライバーを対象としているため、ファイル システム フィルター ドライバーは、この方法で未知の IRP を拒否しないでください。 このため、既定のディスパッチ ルーチンは通常、IRP を次の下位レベルのドライバーに渡すだけです。