次の方法で共有


フィルター ドライバーのコントロール デバイス オブジェクト

Note

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

名前付きコントロール デバイス オブジェクト (CDO) を作成して使用するには、ファイル システムが必要です。 ファイル システムとは異なり、従来のファイル システム フィルター ドライバーには CDO は必要ありません。 その場合、必要に応じて CDO という名前が付けられ、システムに対するフィルター ドライバーが表されます。 その役割は、ユーザー モード アプリケーション (またはあまり一般的ではない別のカーネル モード ドライバー) から I/O 要求を受信し、それらに適切に対応することです。

ほとんどのファイル システム フィルター ドライバーは、CDO を作成して使用します。 ただし、CDO での I/O 要求のサポートは省略可能です。 このサポートを提供するには、フィルター ドライバーが IoCreateDevice を呼び出して CDO を作成するときに、オブジェクトのデバイス名を指定する必要があります。 ユーザー モード アプリケーションは CreateFile を呼び出して、デバイス名のユーザー モード バージョンを指定することで、名前付き CDO へのハンドルを取得できます。

たとえば、架空の "MyLegacyFilter" カーネル モード ドライバーを考えてみましょう。 このドライバーは、名前を持つ CDO を作成できます。

\Device\MyLegacyFilter

そして、 IoCreateSymbolicLink を呼び出して、この名前を同等のユーザー モード表示名にリンクします。 この名前付けは、MyLegacyFilter のユーザー モード アプリケーションが、名前を指定してカーネル モード ドライバーの CDO へのハンドルを開くことができるように行われます。

\\.\MyLegacyFilter

CreateFile を呼び出す場合。

フィルター ドライバーのコントロール デバイス オブジェクトに送信される I/O 要求の種類

ファイル システム フィルター ドライバーは、コントロール デバイス オブジェクト (CDO) に対する I/O 操作をサポートするために必要ありません。 ただし、ほとんどのフィルターでは、次の種類の I/O 要求をフィルターの CDO に送信できます。

  • IRP_MJ_CREATE (ターゲット デバイス オブジェクトへのハンドルを開き、そのハンドルをユーザー アプリケーションに渡す)

  • IRP_MJ_CLEANUP (ターゲット デバイス オブジェクトに対するユーザー モード アプリケーションのハンドルを閉じる)

  • IRP_MJ_CLOSE (最後の再メイン開いているハンドルをターゲット デバイス オブジェクトに閉じる)

  • IRP_MJ_DEVICE_CONTROLIRP_MJ_FILE_SYSTEM_CONTROLFastIoDeviceControl (プライベート IOCTL または FSCTL をフィルター ドライバーに送信する場合)

ファイル システム フィルター ドライバーが作成する他のすべてのデバイス オブジェクトとは異なり、CDO はドライバー スタックにアタッチされません。 フィルター ドライバーの CDO の上または下にデバイス オブジェクトがアタッチされていません。 したがって、受信するすべての I/O 要求について、CDO は、それが唯一の目的の受信者であると安全に想定できます。 これは、フィルター デバイス オブジェクトまたはファイル システムの CDO には当てはまりません。 したがって、CDO は最終的に受信するすべての IRP を完了する必要があります。 高速 I/O 要求の場合は、TRUE または FALSE を返す必要があります。