(57)【特許請求の範囲】
【請求項１】
（ａ）システムリソースとしてソフトウェアドライバを管理するドライバ・オブジェクトと、
（ｂ）１つ又は複数のデバイス・オブジェクトであって、ソフトウェアドライバの、機能と他のオペレーティング・システム・リソースへの可用性とを、各々が定義し、有効ファイル・オブジェクト・タイプと各ファイル・オブジェクト・タイプの関連する作成ハンドラとを有するバリデーション・テーブルを含むプライベート・データ・エリアを、各々が含む、１つ又は複数のデバイス・オブジェクトと、
（ｃ）特定のデバイス・オブジェクトによって指定されたオペレーティング・システム・リソースの呼出しを管理する１つ又は複数のファイル・オブジェクトであって、ＩＲＰ要求ハンドラ・テーブル及び有効ファイル・オブジェクト・タイプと各ファイル・オブジェクト・タイプの関連する作成ハンドラとを有するバリデーション・テーブルを含むプライベート・データ・エリアを、各々が含む、１つ又は複数のファイル・オブジェクトと
を含み、前記ファイル・オブジェクトはデバイス・オブジェクト又は他のファイル・オブジェクトから成る親オブジェクトと関係づけられている、コンピュータ・オペレーティング・システムにおいて、（i）ファイル・オブジェクトの作成のバリデーション又は（ii）ファイル・オブジェクトへのメッセージのルーチングを、標準化する方法であって、
特定タイプのファイル・オブジェクトを作成し又は特定タイプのファイル・オブジェクトへメッセージをルーチングするための要求をドライバ・オブジェクトで受信するステップと、
サード・パーティ・ドライバ開発者によって提供されることとは対照的に、前記オペレーティング・システムの１部として常駐しているマルチプレクシング・ディスパッチ機能へ受信した前記要求を送信するステップと、
作成又はルーチングの前記要求が送信された前記特定タイプのファイル・オブジェクトをサーチする目的で親オブジェクトのプライベート・データ・エリアに前記マルチプレクシング・ディスパッチ機能がアクセスするステップと、
前記特定タイプのファイル・オブジェクトが見つかった場合、前記特定タイプのファイル・オブジェクトの適当な作成ハンドラにアクセスし、又は、前記特定タイプのファイル・オブジェクトが見つからなかった場合、エラー・メッセージを返し前記要求を拒絶するステップと
を備えることを特徴とする標準化する方法。
【請求項２】
請求項１に記載の標準化する方法において、前記ドライバ・オブジェクトで受信された前記要求は、前記親オブジェクトがファイル・オブジェクト又はデバイス・オブジェクトかどうかを判定するために必要な情報を含む
ことを特徴とする標準化する方法。
【請求項３】
請求項１に記載の標準化する方法において、前記ドライバ・オブジェクトで受信された前記要求は、データ構造として実施される
ことを特徴とする標準化する方法。
【請求項４】
請求項１に記載の標準化する方法において、前記マルチプレクシング・ディスパッチ機能は、前記親オブジェクトがファイル・オブジェクト又はデバイス・オブジェクトかどうかを判定する
ことを特徴とする標準化する方法。
【請求項５】
請求項１に記載の標準化する方法において、前記マルチプレクシング・ディスパッチ機能は、ＩＲＰ要求を処理する単一機能である
ことを特徴とする標準化する方法。
【請求項６】
請求項１に記載の標準化する方法において、前記マルチプレクシング・ディスパッチ機能は、前記ドライバ・オブジェクトによって受信された特定要求と密接な関係をもついくつかのマルチプレクシング機能の１つである
ことを特徴とする標準化する方法。
【請求項７】
請求項３に記載の標準化する方法において、前記データ構造は前記親オブジェクトへのハンドルを含む
ことを特徴とする標準化する方法。
【請求項８】
請求項４に記載の標準化する方法において、前記親オブジェクトがファイル・オブジェクトである場合、前記マルチプレクシング・ディスパッチ機能は、親ファイル・オブジェクトの前記プライベート・データ・エリアを使用してＩＲＰ要求ハンドラ・テーブルを参照する
ことを特徴とする標準化する方法。
【請求項９】
請求項１に記載の標準化する方法において、前記親オブジェクトがデバイス・オブジェクトである場合、前記マルチプレクシング・ディスパッチ機能は、親デバイス・オブジェクトの前記プライベート・データ・エリアを使用してバリデーション・テーブルを参照する
ことを特徴とする標準化する方法。
【請求項１０】
請求項８に記載の標準化する方法において、前記要求が作成要求である場合、前記マルチプレクシング機能は、前記ＩＲＰ要求ハンドラ・テーブルにおいて参照されるバリデーション・テーブルにアクセスする
ことを特徴とする標準化する方法。
【請求項１１】
請求項１に記載の標準化する方法において、前記マルチプレクシング機能は、特定タイプのファイル・オブジェクトを作成するための前記要求内のストリングを前記バリデーション・テーブルに含まれるファイル・オブジェクト・タイプのストリングと比較する
ことを特徴とする標準化する方法。
【請求項１２】
請求項１０に記載の標準化する方法において、前記マルチプレクシング機能は、特定ファイル・オブジェクトを作成するための前記要求内のストリングを前記バリデーション・テーブルに含まれるファイル・オブジェクト・タイプのストリングと比較する
ことを特徴とする標準化する方法。
【請求項１３】
請求項１０に記載の標準化する方法において、前記マルチプレクシング機能は、特定タイプのファイル・オブジェクトを作成するための前記要求内のインデックス値を前記バリデーション・テーブルに含まれる許容インデックス値の範囲と比較する
ことを特徴とする標準化する方法。
【請求項１４】
請求項１に記載の標準化する方法において、前記マルチプレクシング機能は、特定タイプのファイル・オブジェクトを作成するための前記要求内のインデックス値を前記バリデーション・テーブルに含まれる許容インデックス値の範囲と比較する
ことを特徴とする標準化する方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明の分野はコンピュータ・ソフトウェア・ドライバの開発に属するものである。本発明は、ドライバのコード生成を単純化し、標準化アクセス・ポイントを提供するツール、ソフトウェア・フレームワーク、規則などに関する。より具体的には、本発明はファイル・オブジェクト間の階層関係を作成するための標準化メソッド、コンピュータ・プログラム・プロダクト、およびデータ構造に関する。
【０００２】
【従来の技術】
あるソフトウェア・ドライバ実行可能コードの実装は、異なる機能部分への複数のエントリ・ポイント(entry point) を含んでいる場合がある。Microsoft(登録商標）社のWindows NT（商標）などのオペレーティング・システムによってロードされ、その制御下に置かれると、特定のシステム・オブジェクトが作成され、これらは、ドライバ（ドライバ・オブジェクト）、ドライバによってサポートされる他のコンポーネントによってアクセス可能な「デバイス」または特定の機能定義（デバイス・オブジェクト）、およびコンポーネントによって実際に使用されるドライバ機能のインスタンス（ファイル・オブジェクトの形態になっているのが代表的）を表している。
【０００３】
Windows NTを含む、大部分のオペレーティング・システムは、ドライバが単一タイプの機能を実行し、そのドライバに関連して作成されるすべてのデバイス・オブジェクトがその機能を同じように実行するものと暗黙に想定されている。さらに、作成されたファイル・オブジェクトは、それがデバイス・オブジェクトの下で作成されたものであるか、他のファイル・オブジェクトの下で作成されたものであるかに関係なく、同じような方法でサービスを受けるものと想定されている。上記のような想定があるために、Windows NTオペレーティング・システムや他の類似オペレーティング・システムは、同じドライバ・オブジェクトを使用して作成されたすべての兄弟(sibling) デバイス・オブジェクトとすべてのエントリ・ポイントを共用するために、単一のドライバ・オブジェクトを使用している。
【０００４】
このような想定がある結果として、各ドライバ開発者は、階層的に関係づけられたファイル・オブジェクトが特定のルール集合に従って作成されるようなシステムでは、初期ファイル・オブジェクト要求をバリデーションする(validate)ための特定のコードを書かなければならない。そのようなファイル・オブジェクト階層の一例としては、以下で詳しく説明するドライバ接続システム(driver connection system)がある。なお、このドライバ接続システムは単なる例示であり、これに限定されるものではなく、以下に説明されている本発明を利用する他のシステムはいずれも、特許請求の範囲に記載されている本発明の範囲に属するものである。
【０００５】
この問題は、デバイス・ドライバを書く標準化システムがドライバ接続システムで見られるような使い方がされるとき、さらに悪化する。すべてのドライバ開発者は同じルール集合に従って書いているので、特定のコードがファイル・オブジェクト作成を取り扱うために必要になるだけでなく、標準化規則(standardized convention) に従ってドライバを書いている各開発者によってなん度も繰返し開発されることになる。
【０００６】
すべてのファイル・オブジェクトは同じようにサービスを受けるとの基本的想定の結果として起こるもう１つの問題は、処理要求が特定のファイル・オブジェクトの正しいハンドラへルーチング(routing) されることを保証することである。異なる機能をドライバに分け与えることができ、そのような機能は、「ファイル」の状態(state) を管理するためのシステムにおいて基礎となるファイル・オブジェクトを作成し、ファイル・ハンドル(handle)を入出力要求を方向づけるアクセス・メカニズムとして提供する特定デバイスで、その「ファイル」をオープンすることでアクセスされるので、異なる処理要求ハンドラは、要求を受け取るように指定されたファイル（およびファイル・オブジェクト）に応じて使用されている。同種オペレーションの想定を解消するためには、かかるルーチングを行う特殊なコードを書かなければならないのが通常である。この場合も、多数の異なる製造者が階層的に関係づけられた機能をもつドライバを書くことができる標準化システムでは、特殊コードを初めからなん度も書かなければならないので、その影響は倍増することになる。
【０００７】
以上のような理由から、ファイル・オブジェクトが階層的に関係づけられたシステムにおいてファイル・オブジェクトの作成要求をバリデーションする標準化メカニズムと、処理要求を与えられたファイル・オブジェクトの正しいハンドラへルーチングする方法とが要望されている。
【０００８】
【発明が解決しようとする課題】
本発明の目的は、多数のサード・パーティ・ソフトウェア・ドライバ開発者によって使用できるシステム・デバイス・オブジェクトとファイル・オブジェクトに置かれていて、参照によってアクセス可能なコンテキスト情報に基づいてファイル・オブジェクト作成要求をバリデーションするための標準化メカニズムを提供することである。
【０００９】
本発明の別の目的は、処理要求を標準化された方法で与えられたファイル・オブジェクトの適切なハンドラへルーチングし、多数のサード・パーティ開発者による相互操作デバイス・ドライバの開発を容易化することである。
【００１０】
本発明のさらに別の目的は、ソフトウェア・ドライバを開発するためのコーディング作業量を軽減化し、処理要求を標準化された方法で処理できるドライバの開発を支援する、サード・パーティ・ドライバ開発者のためのフレームワークを提供することである。
【００１１】
本発明のその他の目的および利点は以下の説明に記載されているが、その一部はその説明から理解されるものと、本発明を実施することにより知得し得るものとがある。本発明の目的と利点は、請求の範囲に個々に記載されているインストリューメント(instrument)の手段および組合せにより実現し、得られるものである。
【００１２】
【課題を解決するための手段】
上記目的を達成するために、また、以下に実施の形態として示され、以下に広い意味で説明されている本発明によれば、ファイル・オブジェクトの作成とファイル・オブジェクトへのメッセージのルーチングをバリデーションする方法、コンピュータ・プログラム・プロダクト、およびデータ構造が提供されている。すべてのサード・パーティ・ソフトウェア・ドライバ開発者は標準化されたデータ構造に従って、コーディングするためのシステム・レベルの規則が確立されているので、ソフトウェア・ドライバの開発が容易化され、同一ドライバ内に異種タイプの機能を置くこと、バリデーションされたファイル・オブジェクト作成を通して機能を階層的に関係づけること、処理メッセージを正しいハンドラ・ルーチンへ転送することが容易化されている。
【００１３】
本発明は複数の要求処理マルチプレクシング機能を意図し、各々は受信されたメッセージのタイプ（作成、入出力制御、クローズなど）に応じてドライバ・オブジェクトから参照されるようになっている。これらのマルチプレクシング機能はサード・パーティ開発者によって開発されるのではなく、システム開発者や他のエンティティによってシステムの一部として用意されている。ドライバ開発者は標準マルチプレクシング機能を利用すると、確立された規則に従い、事前定義のデータ構造を利用するソフトウェア・ドライバを書くことができるという利点が得られる。
【００１４】
本発明によれば、デバイス・オブジェクトとファイル・オブジェクト内のプライベート(private) 記憶エリアは、サード・パーティ・ドライバ開発者によって書かれた事前定義のデータ構造を参照するために使用される。ドライバ開発者はデータ構造を作成すると、そこにデータを「入れる(fill)」ことになり、この中には、特定のファイル・オブジェクト・タイプとメッセージ・タイプに必要とされる特定のメッセージ・ハンドラを書くことが含まれるが、ファイル・オブジェクト作成をバリデーションするためのコードや着信メッセージを正しいメッセージ・ハンドラ機能へルーチングするためのコードは一切書く必要がない。バリデーションとルーチングの機能はすでに用意されているマルチプレクシング・ディスパッチ機能の中に入っている。
【００１５】
例えば、デバイス・オブジェクトのプライベート・データ・エリアは有効(valid) ファイル・オブジェクト・タイプのテーブルと、対応するタイプのファイル・オブジェクトを作成する適切な作成ハンドラを指すポインタとを含んでいるバリデーション(validation)・テーブルのデータ構造をポインタまたは他の手段を通して参照する。作成メッセージが作成マルチプレクシング・ディスパッチ機能によって受信されると、バリデーション・テーブルのデータ構造がアクセスされ、要求の有効性が判断され、有効であれば、正しい作成ハンドラがアクセスされる。
【００１６】
そのメッセージが「親」ファイル・オブジェクトが存在することを示していれば、作成マルチプレクシング・ディスパッチ機能は別のデータ構造への参照を得るために親ファイル・オブジェクトのプライベート・データ・エリアをアクセスする。ファイル・オブジェクト・データ構造はその特定ファイル・オブジェクトのすべての適切なメッセージ・ハンドラを指すポインタを含んでいる。
【００１７】
作成メッセージ・ハンドラの場合には、有効ファイル・オブジェクトと、対応するタイプのファイル・オブジェクトを作成する適切な作成ハンドラを指すポインタとを含んでいるバリデーション・テーブルのデータ構造への参照がポインタまたは他の手段を通して行なわれる。作成メッセージが作成マルチプレクシング・ディスパッチ機能によって受信されると、バリデーション・テーブルのデータ構造がファイル・オブジェクト・データ構造からアクセスされ、要求の有効性が判断され、有効であれば、正しい作成ハンドラがアクセスされる。
【００１８】
ファイル・オブジェクトおよびデバイス・オブジェクトと関連づけられたバリデーション・テーブルがあるために、どの作成要求またはメッセージも作成マルチプレクシング・ディスパッチ機能によってバリデーションしてから、適切な作成ハンドラへ送ることができる。無効なメッセージが受信されると、作成マルチプレクシング・ディスパッチ機能はエラー・ステータスを送り返し、要求を破棄する。この場合も、ドライバ開発者はバリデーション・コードを書くことから解放され、対応するデータ構造内のファイル・オブジェクトの有効なタイプを、比較のために使用されるインデックス範囲または実際のタイプ・ストリングによって知らせるだけで済む。
【００１９】
各ファイル・オブジェクト・データ構造は、前述したように、その特定ファイル・オブジェクトに関係するメッセージ・ハンドラへの参照も各メッセージ・タイプ別に含んでいる。このようにすると、特定のメッセージ・タイプのマルチプレクシング・ディスパッチ機能はメッセージを与えられたファイル・オブジェクトの正しいハンドラへルーチングすることができる。この場合も、ドライバ開発者はルーチング・コードを書く必要がなく、マルチプレクシング・ディスパッチ機能とファイル・オブジェクト・データ構造を使用して適切なメッセージ・ハンドラを参照するだけで済む。
【００２０】
本発明の上記およびその他の目的と特徴は以下の説明および請求の範囲に詳しく記載されている通りであるが、以下に説明する本発明を実施することによって知得することも可能である。
【００２１】
本発明の上記およびその他の利点と目的がどのようにして得られるかという方法を示すために、以下では、添付図面に図示されている具体的実施の形態を参照して、以上で簡単に説明してきた本発明を詳しく説明することにする。添付図面は本発明の代表的な実施の形態を示したにずぎず、従って、本発明の範囲を限定するものではないとの了解の下で、以下、添付図面を使用しながら本発明をもっと具体的にかつ詳しく記述し説明することにする。
【００２２】
【発明の実施の形態】
本明細書で用いられている「ユーザ・モード(user mode) 」という用語は、ユーザが書いたプログラムの大部分が実行されるときの、オペレーティング・システムにおける動作レベルのことである。ユーザ・モードの動作レベルはセキュリティ・レベルが最も高く、あるアプリケーション・プログラムまたはプロセスが別のアプリケーション・プログラムまたはプロセスに干渉するのを防止するために大量のオーバヘッドが消費されるのが代表的である。さらに、システム・リソースへのアクセスは特定のインタフェースを通して厳格に制御され、実行優先度は最低ではないとしても、最低優先度の１つであるのが一般である。
【００２３】
本明細書で用いられている「カーネル・モード(kernel mode) 」という用語はユーザ・モードの動作モードよりも制約が非常に少ない、オペレーティング・システムにおける動作レベルのことである。カーネル・モードのプログラムまたはプロセスの例としては、ハードウェア・コンポーネントを制御するソフトウェア・ドライバ(software driver) を含む。代表例として、カーネル・モードのプログラムはパフォーマンスに影響されやすく、従って、動作上のオーバヘッドはユーザ・モードのプログラムよりも少なくなっている。さらに、ハードウェアや多くのシステム・リソースへのアクセスは無制約であるか、あるいはユーザ・モードのプログラムの場合よりも制約がはるかに少なくなっている。多くの場合、カーネル・モードで実行されるプログラム・コードは、規則(convention)に対するプログラマの規律正しさと準拠とを信頼して、システムが良好に動作するようにする（例えば、別のプログラムのアドレス空間を破壊しないようにする）。カーネル・モードを表わす別の用語として、「トラステッド(trusted) 」コードがある。
【００２４】
本明細書で用いられている「ドライバ(driver)」という用語はカーネル・モードで実行されるのが代表的である、ソフトウェア・ドライバ・プログラムのことである。ドライバという用語は、オペレーティング・システム上にロードされる実際の実行可能プログラムまたはある種の機能を分け与えるプログラム部分を意味する場合もある。ドライバは、多くの場合、ある形態のハードウェアと関連づけられているが、必ずしもそうである必要はない。
【００２５】
本明細書で用いられている「フィルタ(filter)」という用語はソフトウェア・ドライバ内に置かれている機能部分のことであり、この中には、ドライバ自体も含まれ、そこでは、接続ポイントがフィルタを通してデータを送信するために公開されている。例えば、ソフトウェア・ドライバはいくつかの異なるフィルタをサポートする場合もあれば、１つの単一機能をもっている場合もある。さらに、内部的には１つに接続され、外部的には入出力用に接続ポイントを公開している異なるドライバからの複数のフィルタは単一フィルタとして集合的に参照される場合もある。また、もっと総称的な意味では、フィルタという用語は、伸張(decompression) などのように、それがカーネル・モードで実行されるソフトウェア・ドライバ・フィルタで起こるか、ユーザ・モードで実行される別のプログラム・コードで起こるかに関係なく、実行されるオペレーションを意味する場合もある。
【００２６】
本明細書で用いられている「ドライバ・オブジェクト(driver object) 」という用語は、ソフトウェア・ドライバを管理し、これをシステム・リソースとして知らせるオペレーティング・システムによって定義されているオペレーティング・システムのエンティティのことである。
【００２７】
本明細書で用いられている「デバイス・オブジェクト(device object) 」という用語はシステムによって定義されたシステム・レベルのエンティティのことであり、これは利用が可能であるドライバの機能の一部をシステム・リソースとして知らせ、ドライバの機能と他のシステム・コンポーネントが利用できるかどうかを定義している。ドライバ・オブジェクトとデバイス・オブジェクトはどちらも、代表的にドライバ・ソフトウェアのロード時と初期化時に作成される。
【００２８】
本明細書で用いられている「ファイル・オブジェクト(file object) 」という用語は、デバイス・オブジェクトによって指定されたリソースの呼出しを管理するオペレーティング・システムのエンティティのことであり、これはオペレーティング・システムによって定義されている。ファイル・オブジェクトはドライバ・オブジェクトの使用状況に関するコンテキストを提供する。さらに、ファイル・オブジェクトは、以前のファイル・オブジェクトが新しいファイル・オブジェクトの作成時に「親」と指定されていれば、別のファイル・オブジェクトと階層的に関係づけることが可能である。ファイル・オブジェクトは、代表的にデータ・ストリーム上に操作するすべての入出力オペレーションの管理に使用される。
【００２９】
本明細書で用いられている「データ(data)」という用語は、相互接続されたカーネル・モードのフィルタを通して処理される一切の情報のことである。そのようなデータは、ビデオ、オーディオ、テキスト、ＭＩＤＩなどを表すメディア・データを含むが、他のアプリケーションの場合には制御情報やパラメータも含んでいる場合がある。例えば、カーネル・モード・フィルタ・グラフはプロセス制御オペレーションで使用されることがあるが、そこでは、異なるフィルタ間で受け渡しされる制御情報はマシン類をアクチュエートする制御信号を創り出すために使用されている。メディア処理システムの例が示されているが、他のアプリケーションも、本明細書に説明されている相互接続カーネル・モード・フィルタのシステムから、同じような方法で利点を得ることが可能である。
【００３０】
本明細書では、本発明の説明は、Microsoft(登録商標）社から提供されているWindows NT（商標）オペレーティング・システムのコンテキスト内で記載されている。さらに、本明細書に説明されている好適実施の形態を理解するためには、Windows NTの入出力アーキテクチャの知識が前提になっている。入出力システムおよび NT オペレーティング・システム全般について解説した好適書としては、Helen Custer著「Windows NTの内部(Inside Windows NT) 」(Microsoft Press発行）があるが、本書は引用により本明細書の一部を構成するものである。
【００３１】
ドライバおよびファイル・オブジェクト、デバイス・オブジェクト、ドライバ・オブジェクトなどのシステム・エンティティの以下の説明では、Windows NTオペレーティング・システム上でこれらがどのような働き方をするかが解説されているが、この分野の精通者ならば理解されるように、本発明は、類似のコンポーネントを持つ他のオペレーティング・システム上で実装することが可能であり、これらのオペレーティング・システムが同じ用語を使用しているかどうかとは無関係である。例えば、別のオペレーティング・システムがファイル・オブジェクトとして動作するエンティティを持っていれば、そのエンティティはその実際の名称に関係なく、ファイル・オブジェクトと解釈することができる。
【００３２】
まず、図１を参照して説明すると、図示のシステム例は、サウンド・データのストリームをディスク・ドライブから読み取り、そのサウンド・データをレンダリング(rendering) して、従来のモデルに従ってスピーカから聞こえるようにするものである。あるデータ量はハード・ドライブ２０にストアされるが、これはディジタル化されたサウンド・サンプルの形態でサウンドを表している。ほかにも、サウンド・データ・ストリームのソースとしては、電話回線を利用して送られてくるディジタル化情報、ネットワークや他の通信パケットからのディジタル化情報、この分野で公知の他のソースが考えられる。データ・ストリームはディジタル化サンプルから構成され、これらのサンプルはデータ・フォーマットと規則によって、または各サンプルに付加される明示的タイムスタンプ情報によってタイム・インターバル情報が関連づけられている。カーネル・モードのディスク・ドライバ２２はディスク・ドライブ・ハードウェア２０と相互作用し、ユーザ・モードのリーダ(reader)プログラム・コンポーネント２４の制御下に置かれている。制御エージェント(controlling agent) ２６はサウンド・データのレンダリングを行うために異なるコンポーネントを管理するが、動的グラフ作成機能(dynamic graph building capability) を備えている場合は、異なるソフトウェア・コンポーネントが動的に割当てられて、エンド・ユーザの指定に従ってカスタム・フィルタリングまたは他の処理経路を提供できるようにする。
【００３３】
リーダ・コンポーネント２４はオペレーティング・システムの標準入出力制御インタフェースを使用してディスク・ドライバ２２と相互作用し、圧縮サウンド・データをディスク・ドライブ２０から読み取って、ユーザ・モード・プロセスのアドレス空間(address space) の一部としてユーザ・モードで割当てたバッファに入れる働きをする。次に、デコンプレッサ(decompressor)・コンポーネント２８は圧縮データを処理に適した伸張(decompressed)フォーマットに伸張する。図示のように、このステップ全体は、付随の低優先度の、プロセス動作(process behavior)安全メカニズムを使用してユーザ・モードで実行される。
【００３４】
効果フィルタ(effects filter)３０はデータに操作を加えて、ある種の特殊効果が得られるようにし、カーネル・モードで動作する附属の効果フィルタ３２をもっている。さらに、効果プロセッサ３４が存在する場合もあれば、効果フィルタ全体が実際のハードウェア・プロセッサをエミュレートするソフトウェアで動作する場合もある。効果フィルタ３２をアクセスするためには、効果コンポーネント３０はシステム入出力制御メカニズムを使用して、データと制御を効果フィルタに転送する。この場合も、カーネル・モード／ユーザ・モード境界を交差して、この遷移が行われる。
【００３５】
効果フィルタ３２は効果プロセッサ３４を制御し、必要または望ましいとされる特殊効果がそのデータ上に作られるようにする。これは、効果コンポーネント３０から全データをコピーし、そのコピーを効果フィルタ３２に、実際のシステム構成によっては、再度効果プロセッサ３４にも移すことにより行われる。多くのソフトウェア効果コンポーネントはハードウェア・プロセッサが関連づけられているが、他のコンポーネントは、ホスト・プロセッサ上で実行されるシステム・ソフトウェア内で完全に機能している。
【００３６】
効果コンポーネント３０の処理の完了時にコントロールとデータがユーザ・モードに戻されると、これは、次に、サウンド・レンダリング・コンポーネント３６に転送される。サウンド・レンダリング・コンポーネント３６はコントロールとデータをサウンド・レンダリング・ドライバ３８に転送し、これを受けてサウンド・レンダリング・ドライバは、処理され、フィルタリングされたデータをスピーカ４２からのサウンドとしてレンダリングするようにサウンド・カード４０を制御する。以上から容易に理解されるように、ユーザ・モードとカーネル・モード間の転送は多種類存在するために、サウンド・データのレンダリングを非効率化している。連続するサウンドまたはビデオ・ストリームのように、マルチメディア・データはタイミングに影響されやすい性質のため、これらの非効率性とコントロールの遷移を少なくすると共に、異なるバッファ間でなん度もデータをコピーすることを少なくすると、好都合である。
【００３７】
本明細書で用いられている本発明の一実施の形態は、Windows NTオペレーティング・システム・アーキテクチャ上で提供されるサービスから構成されている。このサービスはシステムのユーザがアクセスする、いくつかの異なるソフトウェア・コンポーネントに分割されている。第１は、ユーザ・モードのＡＰＩであり、これは、接続ピン・インスタンスと、クロック・メカニズムやバッファ割当てメカニズムなどの特定の機能を表している他のファイル・オブジェクトとを作成するためのルーチンを含んでいる。ほかにも、もっと重要なものとして、ドライバ開発者が標準化アーキテクチャに従うドライバを作成するのを支援するルーチンとデータ構造が完備されている。システムに用意されているこれらの機能を利用すると、異なるドライバ開発者は特定のアーキテクチャに準拠して相互に相互作用するコンプライアント・ドライバを作成することができる。ユーザ・モード・エージェントはＮＴエグゼクティブおよび入出力マネージャのシステム・サービスと通信する、ユーザ・モードで実行中の環境サブシステムを通してコンプライアント・ドライバと通信する。これは、他のすべての入出力に対する同じ標準入出力メカニズムであり、好適実施の形態の本実装では、既存のシステム・サービスを可能な限り利用するようになっている。
【００３８】
本発明を利用する図１のシステムのアーキテクチャは図２に示すようになっている。制御エージェント４４は知らされているドライバに照会し、データ・フォーマットと接続フォーマットに従って相互接続を行い、レンダリングを完全にカーネル・モードで行うようにする。さらに、制御エージェントは重要なイベントの通知を受けるので、必要に応じて制御を行うことができる。このようなイベントの例としては、処理の終了、データ・スターベーション事態などを含む。
【００３９】
この構成では、サウンド・データは前述したように、ディスク・ドライバ４８によってディスク・ドライブ４６から読み取られる。リーダ・ドライバ５０はディスク・ドライバ４８を制御し、従来の使い方と同じようにＮＴ層(NT layered)入出力アーキテクチャに従ってディスク・ドライバ４８と「垂直方向」に関連づけられている。「垂直方向」と「水平方向」の用語は、ＮＴ層入出力アーキテクチャの一部として現在行われているドライバ接続（垂直方向）と、サード・パーティ制御エージェントによって動的に行われる相互接続カーネル・モード・ドライバに従う接続（水平方向）とを区別するために用いられている。
【００４０】
リーダ・ドライバ５０は以下で説明する接続メソッドに従ってデコンプレッサ・ドライバ５２とも「水平方向」に相互接続され、制御エージェント４４によって管理されている。デコンプレッサ５２は伸張をカーネル・モードで行ってから、データとコントロールを効果フィルタ５４に引き渡す。効果フィルタは必要に応じて効果プロセッサ５６を利用して特殊効果を適用してからデータとコントロールをサウンド・レンダリング・ドライバ５８に引き渡し、このドライバはサウンド・カードを制御し、データをスピーカ６２からのサウンドとしてレンダリングする。図２から理解されるように、処理をカーネル・モードのままにしておくと、ユーザ・モードとカーネル・モードとの間の複数の遷移がなくなり、処理をユーザ・モードで行うと通常起こるオーバヘッド量が減少するので、効率面の利点が得られる。
【００４１】
次に、図３を参照して説明する。図３は、本発明の一実施の形態に従う相互接続ソフトウェア・ドライバに関係するシステム・オブジェクトの階層的性質を示すロジック図である。ドライバ・オブジェクト６４は、メモリにロードされるときの、実行可能ソフトウェア・コード・イメージを表すために作成される。ドライバ・コード・イメージはドライバの機能全体を含んでおり、ドライバ・オブジェクト６４はシステムに置かれている場所、サポートされるドライバの種類などのイメージに関する情報を含んでいる。
【００４２】
制御エージェントによって独立にアクセスできる機能の各タイプ別に、デバイス・オブジェクト６６a 〜６６N が入出力ディレクトリ構造に作成され、これらのオブジェクトは利用可能で、ユーザ・モードのクライアントによってアクセスされる異なる機能を表している。これらは、フィルタまたは独立に利用できる他の機能部分を表しているのが代表的である。ドライバ・オブジェクト６４とデバイス・オブジェクト６６a 〜６６N は囲みボックス６８で示すように、ドライバ・コードのインストール時に作成される。
【００４３】
歴史的には、デバイス・オブジェクトは物理ハードウェアの各エレメントごとに存在する。しかるに、最新の入出力システムの柔軟性は、デバイス・オブジェクトが完全にソフトウェアで実装されたフィルタを表すことを可能にさせている。そのため、デバイス・オブジェクトは専らソフトウェアで実装されたフィルタの各インスタンスごとに作成することが容易になっている。従って、ソフトウェア・フィルタは、デバイス・オブジェクトで表された各インスタンスがデバイス・オブジェクトと１対１の対応関係をもつように実装することも、単一のデバイス・オブジェクトがより伝統的な手法に従い、各々がフィルタのクライアント・インスタンスを表している複数のファイル・オブジェクトを管理するように実装することも可能になっている。
【００４４】
デバイス・オブジェクト、図示の例では、デバイス・オブジェクト６６a 上には、ファイル・オブジェクトが作成され、これはデバイス・オブジェクトで表された機能の独立インスタンスを表している。デバイス・オブジェクトはフィルタを表し、そのフィルタの複数のインスタンスを管理するのに対し、ファイル・オブジェクトは特定のエンティティによって使用される、そのフィルタの実際のインスタンスを表している。従って、ファイル・オブジェクト７０はデバイス・オブジェクト６６a によって定義されたフィルタのインスタンスである。
【００４５】
フィルタを使用するには、制御エージェントまたは他のユーザ・モード・クライアントは入出力ディレクトリ構造内で利用可能なデバイス上でファイルをオープンする。適切なコンテキスト情報を収めているファイル・オブジェクトが作成され、そのファイルへのハンドルがユーザ・モード・クライアントに返される。ファイル・オブジェクトは、作成時に「親」ファイル・オブジェクトを指定することによって階層的に関係づけることが可能であるが、ファイル・オブジェクトはすべてが同一デバイス・オブジェクトの子であるような、兄弟(sibling) 関係も持っている。
【００４６】
ファイル・オブジェクト内のコンテキスト情報は、ユーザ・モード・クライアントとの入出力インタフェースを管理する情報、ファイル・オブジェクトが表わしているエンティティの「状態(state) 」などからなっている。コンテキスト情報には、システムが必要とする情報があり、さらに、特殊な意味をもたせることができる、ユーザ定義可能エリアも含まれている。ユーザ定義可能エリアの使い方の例は、下述するバリデーション(validation)とＩＲＰルーチング(routing) ・メソッドのインプリメーテンションの説明個所に示されている。
【００４７】
接続ピン・インスタンスを提供するためには、フィルタ・インスタンスを表すファイル・オブジェクト７０が親として使用され、特定フィルタの接続ピン・インスタンスを表す子ファイル・オブジェクトが作成される。ファイル・オブジェクト７０は接続ピン・ファクトリの定義と可用性に関して照会されるのに対し、実際のファイル・オブジェクトは特定のファイル・オブジェクトを適切な情報コンテキストとして使用して、ピン・ファクトリの各インスタンスごとに作成され、接続ピン・インスタンスが有効に、かつ正しく作成されるようにする。例えば、ファイル・オブジェクト７２と７４はファイル・オブジェクト７０で表されたフィルタの接続ピン・インスタンスを表し、ファイル・オブジェクト７０と階層的に関係づけられている。それぞれファイル・オブジェクト７２と７４で表された接続ピン・インスタンスはフィルタ・インスタンス（ファイル・オブジェクト７０で表されている）に入ったあとで、そこから出るデータ・パスにすることができ、これは一連のチェイン・フィルタまたは他のドライバ機能を形成するときに他の接続ピン・インスタンスと接続するために使用できる。
【００４８】
ピン・インスタンスがフィルタ・インスタンスを表す別のファイル・オブジェクトと階層関係をもつファイル・オブジェクトで表されて、ピン・インスタンスのコンテキスト情報を提供するようにするのとまったく同じように、他のファイル・オブジェクトをピン・インスタンスと階層的に関係づけて他の機能を表すようにすると、正しいコンテキスト情報が得られるようになる。コンテキスト情報は、ピン・データ・フォーマット、通信タイプなどのように、作成時に使用される個々のパラメータに従って、あるピン・インスタンスを他のピン・インスタンスと区別するために必要である。
【００４９】
バッファ割当てメカニズム、タイミング・メカニズムなどのように、個別コンテキストかユーザ・モードのコントロールのどちらかをハンドルを通して要求する他の操作エンティティも、ファイル・オブジェクトで表すことができる。さらに、ファイル・オブジェクト（例えば、特定の接続ピン・インスタンスと関連づけられたバッファ割当てメカニズム）間の階層関係は、必要ならば、子ファイル・オブジェクトの作成時に親ファイル・オブジェクトを指定することにより確立することができる。これらの親子関係は、操作エンティティを表すファイル・オブジェクト間の関係と構造を決定するために存在する。さらに、特定タイプの「親」ファイル・オブジェクトはある種のタイプの「子」ファイル・オブジェクトだけを作ることができるので、以下で説明するように作成バリデーション・メカニズムが必要になる。この場合も、このようなファイル・オブジェクトは対応するハンドルがユーザ・モードで利用可能になっており、これらのハンドルはNtCreateFileなどのシステムＡＰＩコールを通してクライアントに返される。
【００５０】
ファイル・オブジェクトへのハンドルはカーネル・モード・ドライバと通信するために、制御エージェントなどのユーザ・モード・クライアントによって使用される。ファイル・オブジェクト、デバイス・オブジェクト、およびドライバ・オブジェクトの階層的チェインは、入出力サブシステムが階層関係をもつファイル・オブジェクトとデバイス・オブジェクトを通ってドライバ・オブジェクトまで戻り、実際のドライバ・コードに入るエントリ・ポイント(entry point) に到達することができるようにする。このようなエントリ・ポイントはソフトウェア・ドライバ・コードの中の機能を指す参照（例えば、ポインタ）になっている。さらに、特定のファイル・オブジェクトと、ソフトウェア・ドライバ・コードへのエントリ・ポイントをもつドライバ・オブジェクトとの間のオブジェクト通路(pathway) 上にあるオブジェクトの各々は、入出力サブシステムがＩＲＰを作成するときに重要なコンテキスト情報のほかに、下述するルーチングおよびバリデーション・メカニズムに従ってＩＲＰを正しくルーチングするときに使用されるデータ構造への参照も提供する。
【００５１】
ファイル・オブジェクトと他のシステム・オブジェクトに対するハンドルはプロセス専用であり、ユーザ・モード・プロセスが基礎となるオブジェクトと通信するときの手段となる。注目すべきことは、ファイル・オブジェクトなどの、基礎となる単一システム・オブジェクトを参照するために複数のハンドルが作成できることである。このことは、複数のアプリケーションがファイル・オブジェクトで表されたピン・インスタンスに情報を供給できることを意味する。
【００５２】
異なるドライバを相互接続するとき重要となる情報エレメントの１つとして、デバイス・オブジェクト・スタックの深さ(depth) パラメータがある。これは特定のドライバ・オブジェクトのＩＲＰスタック・ロケーションを示している。このようにすると、入出力マネージャを使用して、相互接続されたドライバ間で単一のＩＲＰを使用し受け渡しできるので、ＩＲＰを別々に作成し、それを種々の相互接続ドライバ間で送信するよりもパフォーマンス向上を提供できることになる。別の方法として、各ドライバは適切な入出力マネージャのコールを通して、各連続通信ごとに新しいＩＲＰを作成し、各々の新ＩＲＰを相互接続されたドライバのチェイン上の次のドライバへ送信させることも可能である。
【００５３】
次に、図４〜図６を参照して説明する。図は、異なるタイプのファイル・オブジェクト作成のバリデーションと適切なハンドラへの入出力要求パケット（I/O Request Packet：ＩＲＰ）のルーチングを可能にするシステム・ドライバ・オブジェクト、デバイス・オブジェクト、およびファイル・オブジェクトのエクステンションを示している。図４は、１つまたは２つ以上のフィルタまたは他のドライバ機能を実装している実行可能コードを表すドライバ・オブジェクト７６を示している。ドライバ・オブジェクト内では、Windows NTアーキテクチャはソフトウェア・ドライバ開発者が用意した作成ハンドラへの参照を要求している。この実施の形態によれば、マルチプレクシング・ディスパッチ機能(multiplexing dispatch function)７８は作成ハンドラとしてドライバ・オブジェクト７６から参照され、メッセージを作成されるファイル・オブジェクトのタイプに応じて特定の作成ハンドラへルーチングするために使用される。マルチプレクシング・ディスパッチ機能７８のオペレーションは図８に示すフローチャートを参照して以下で説明する。
【００５４】
同じように、ドライバ・オブジェクトからの他のハンドラはマルチプレクシング・ディスパッチ機能を示し、どのように実装するかに応じて、これらは同じ機能にすることが可能である。言い換えれば、以下で詳しく説明するように、各タイプの入出力ハンドラ参照（例えば、読取り、書込み、デバイス制御など）はデバイス・オブジェクト内のエクステンション・データとファイル・オブジェクト内のコンテキスト情報を使用して、メッセージを適切なハンドラへルーチングするマルチプレクシング・ディスパッチ機能を指している。バリデーション・テーブルを参照するデバイス・オブジェクト内のエクステンション・データは、作成オペレーションで親ファイル・オブジェクトの指定がないとき使用される。指定があれば、親ファイル・オブジェクトのコンテキスト情報は正しいバリデーション・テーブルを示している。
【００５５】
図５は、ドライバ開発者によって所望により利用でき、ドライバ専用情報を含んでいる特定のデバイス・エクステンション・エリア８２をもつドライバ・オブジェクト８０を示している。ドライバ・オブジェクト８０のデバイス・エクステンション・エリア８２内の定義されたロケーションには、ファイル・タイプ・バリデーション・テーブル８４と呼ばれ、ファイル・オブジェクト・タイプ８６のストリング表現を含んでいるデータ構造への参照と、表現される各ファイル・タイプ別の関連する作成ハンドラ８８への参照が置かれている。作成マルチプレクシング・ディスパッチ機能はファイル・タイプ・バリデーション・テーブル８４を使用して、作成されるファイル・オブジェクト・タイプを検査し、そのあと、コントロールを適切な作成ハンドラへ引き渡す。これについては、以下の図８の説明個所で詳しく説明する。検査されるストリングはＩＲＰ作成要求に見出され、ユーザ・モードのNtCreateFile関数コールと共に使用されるファイル名ストリングから創られる。NtCreateFile関数コールは、ピン・インスタンスまたは他のメカニズムを作成するためにユーザ・モード関数セルの中で行われる。
【００５６】
図６は、ソフトウェア・ドライバ開発者が使用するために解放されているファイル・コンテキスト・エリア９２をもつファイル・オブジェクト９０を示している。参照はファイル・コンテキスト・エリア９２からＩＲＰ要求ハンドラ・テーブル９４へ行われる。ＩＲＰ要求９６の異なるタイプは特定のハンドラ９８と関連づけられ、適切なマルチプレクシング・ディスパッチ機能はこの情報を使用して正しいハンドラにアクセスする。正しい作成ハンドラを決定する場合には、ファイル・タイプ・バリデーション・テーブル１００と呼ばれるデータ構造が参照され、そこには、ファイル・オブジェクト・タイプ１０２のストリング表現と、表現される各ファイル・タイプ別の関連する作成ハンドラへの参照１０４が入っている。子ファイル・オブジェクト（つまり、デバイス・オブジェクトではなく別のファイル・オブジェクトを親としてもつファイル・オブジェクト）の場合は、タイプはファイル・オブジェクト・タイプ１０２内のストリングと比較されるストリングで表されている。一致するものが見つかると、関連する作成ハンドラは、参照１０４のうち、一致したファイル・オブジェクト・タイプ・ストリングと関連づけられている参照を使用してアクセスされる。一致するものが見つからなければ、要求は無効であるので、エラー表示が出されることになる。
【００５７】
次に、図７を参照して説明すると、図は作成バリデーションとメカニズムをセットアップするためのインストレーション・プロシージャを示している。ステップ１０６で、インストール・プログラムは適切なマルチプレクシング・ディスパッチ機能への参照をドライバ・オブジェクトの中に作成する。図４に示すように、作成ハンドラは汎用マルチプレクシング・ディスパッチ機能を指している。同様に、ドライバ・オブジェクト７６の中の他のすべてのハンドラ参照は、特定ハンドラと密接な関係をもつ他の汎用(generic) マルチプレクシング・ディスパッチ機能を必要に応じて指している。別の方法として、各ハンドラ参照は同一マルチプレクシング・ディスパッチ機能を指すことも可能であり、その場合は、このディスパッチ機能はＩＲＰ要求を処理したあと、それを適切なハンドラへルーチングすることができる。この方法によるマルチプレクシング機能は異なる種類の要求（例えば、作成、書込みなど）を受け付ける必要があるため、複雑化することが避けられない。
【００５８】
次に、ステップ１０８で、ソフトウェア・ドライバ実行可能コードのインストールの一部として作成された各デバイス・オブジェクトは、図５に示すようにファイル・タイプ・バリデーション・テーブル８４を参照するように調整される。最後に、ステップ１１０で、ＩＲＰ要求の処理は、適切なデバイス・オブジェクト８０から参照されたファイル・タイプ・バリデーション・テーブル８４を使用してマルチプレクシング・ディスパッチ機能から開始される。
【００５９】
ファイル・オブジェクトが作成されると、適切なＩＲＰディスパッチ・テーブル９４が作成され、必要ならば、インデックスされたファイル・オブジェクト・タイプ・バリデーション・テーブル１００と一緒に参照される。ファイル・オブジェクト・タイプ・バリデーション・テーブルの作成は、ファイル・オブジェクト・タイプに従って用意された作成ハンドラ内で行われる。データ構造が作成され、これはＩＲＰディスパッチ・テーブル９４とファイル・オブジェクト・タイプ・バリデーション・テーブル１００を表しており、それを指す参照は作成される特定ファイル・オブジェクト９０のファイル・コンテキスト情報９２と一緒に特定ロケーションにストアされる。
【００６０】
次に、図８を参照して説明すると、図は作成マルチプレクシング・ディスパッチ機能のオペレーションとそのバリデーション・メカニズムを示すフローチャートであり、そこには、システム・ドライバ・オブジェクト、デバイス・オブジェクト、およびファイル・オブジェクトから参照されるデータ構造との相互作用も示されている。ステップ１１２で、ユーザ・モード・プロセスはファイル・オブジェクトを作成する入出力要求を送信する。この入出力作成要求はNtCreateFileのシステムＡＰＩを呼び出すことによって行われる。ステップ１１４で、入出力マネージャはドライバ・オブジェクト７６内の参照に基づいてＩＲＰをマルチプレクシング・ディスパッチ機能７８に送信する（図４参照）。
【００６１】
マルチプレクシング・ディスパッチ機能７８が作成要求のＩＲＰを受け取ると、ステップ１１６でテストが行われ、親ファイル・オブジェクトがあるかどうかが判断される。この判断を行うために必要な情報はＩＲＰ自体の中にあるが、これはユーザ・モード・プロセスによって元来用意されたものである。ユーザ・モード・プロセスは「親」ファイル・オブジェクトを参照するハンドルを作成要求の一部として用意し、ＮＴシステムは「親」ファイル・オブジェクトへの正しい参照をもつＩＲＰを作成する。
【００６２】
親ファイル・オブジェクトがなければ、右へのブランチがとられ、マルチプレクシング・ディスパッチ機能７８は適切なデバイス・オブジェクト８０からのデバイス・エクステンション８２を使用して、ファイル・タイプ・バリデーション・テーブル８４をステップ１１８で参照する（図５参照）。バリデーション・テーブル８４を使用して、マルチプレクシング・ディスパッチ機能７８は要求の中のストリングをファイル・オブジェクト・タイプ８６のストリングと比較することによって、ステップ１２０でファイル・オブジェクト・タイプを検査する。
【００６３】
ステップ１２２でストリングが一致していると判断されると、適切な作成ハンドラがステップ１２４でアクセスされる。一致していなければ、作成要求はステップ１２６で拒否される。ステップ１２４でアクセスされた作成ハンドラはステップ１２６でファイル・オブジェクトを作成するか、あるいは作成させる。作成されたファイル・オブジェクトを使用して、適切な作成ハンドラは、以前に作成していたＩＲＰディスパッチ・テーブル９４を指すファイル・オブジェクト参照をファイル・コンテキスト９２の中に作成する。
【００６４】
再びステップ１１６に戻って、親ファイル・オブジェクトが存在するかどうかが判断される。親ファイル・オブジェクトが存在するとステップ１１６で判断され、それが作成要求に関連するＩＲＰに入っていれば、マルチプレクシング・ディスパッチ機能７８は親ファイル・オブジェクト９０からのファイル・コンテキスト９２を使用して、ステップ１３０でＩＲＰディスパッチ・テーブル９２を参照する（図６）。作成要求の場合は、マルチプレクシング・ディスパッチ機能７８はステップ１３２でファイル・タイプ・バリデーション・テーブル１００を参照する。ファイル・タイプ・バリデーション・テーブル１００を使用して、マルチプレクシング・ディスパッチ機能７８は、上記と同じように、要求の中のストリングをファイル・オブジェクト・タイプ１０２のストリングと比較することによってステップ１３３でファイル・オブジェクト・タイプを検査する。
【００６５】
ストリングが一致しているとステップ１３４で判断されると、適切な作成ハンドラがステップ１３８でアクセスされる。一致していなければ、作成要求はステップ１３６で拒否される。適切な作成ハンドラを使用して、ファイル・オブジェクトは１４０で作成され、作成ハンドラは新しく作成されたファイル・オブジェクトの新しいＩＲＰディスパッチ・テーブル９４を作成し、新しく作成されたＩＲＰディスパッチ・テーブル９４を指す参照を新しく作成されたファイル・オブジェクト９０のファイル・コンテキスト・エリア９２の中にステップ１４２で作成する。注意すべきことは、親ファイル・オブジェクトおよび有効に作成された子ファイル・オブジェクトとの相互作用を説明するために、どちらの場合も、図６に示す同じファイル・オブジェクト構造が使用されていることである。どちらの場合も同じ構造が存在するが（新しいファイル・オブジェクトが作成されたあと）、これらはその使い方が異なり、含んでいる情報も異なっている。
【００６６】
接続ピン・インスタンスが作成されるといつでも、接続ピンＩＤが引き渡され、これはピン・インスタンスの作成を「サポート」するファイル内のピン・ファクトリを示している。この分野の精通者ならば理解されるように、接続ピンＩＤは、ファイル・オブジェクトが検査されるのとまったく同じように、バリデーションテーブルでストリングとして検査することも可能であり、また、その実装方法もさまざまである。
【００６７】
異なるドライバ間の接続を行うためには、あるドライバがそのような相互接続をサポートしていることを確かめるための共通メカニズムが必要である。この共通メカニズムは、接続ピン・ファクトリ機能を含むフィルタ機能を明らかにすることを可能にするものでなければならない。さらに、この種のメカニズムは、ドライバ開発者の柔軟性を向上するように拡張可能であることも必要である。
【００６８】
コンプライアント・ドライバを定義し、機能を明らかにすることを可能にするために本実施の形態で選択されている１つのメカニズムは関連アイテムの「集合」と名づけられている。これは既存の入出力通信メカニズムと一緒に使用すると便利なメカニズムである。集合は集合全体を特定するＧＵＩＤ（グローバルにユニークな識別子）と集合内の各機能エレメントのＲＵＩＤ（相対的にユニークな識別子、例えば、集合自体内の相対的な識別子）を持つものとして論理的に定義されている。集合識別子および選択されたＲＵＩＤアイテムと一緒にオペレーションするために必要な他のデータ構造は、フィルタ・ハンドルをパラメータとして使用して入出力制御コールの一部として引き渡される。機能の完全なシステムを実装するためには、少数のＩＯＣＴＬを割当てるだけで十分である。実装されるとき、３つの異なる種類の集合がその機能に応じて確立されるので、必要になるＩＯＣＴＬは総計４個である。他の実装では、集合の使い方が異なる場合がある。特定のＩＯＣＴＬは、選択されたエレメント（ＲＵＩＤを使用する）をなんらかの方法で解釈または使用するように入出力制御のハンドラに通知する。さらに、制御フラグをＧＵＩＤおよびＲＵＩＤと一緒に渡して、制御情報をもっと詳しく指定することができる。
【００６９】
最初の集合タイプはプロパティ集合であり、これはドライバ内または関連ハードウェア上に置かれている値または設定値と一緒に使用される。そのような設定値の例としては、転送レート、ボリューム・レベル（音量）などがある。１つのＩＯＣＴＬがプロパティ集合と関連づけられ、制御フラグは"get" プロパティ・コマンドと"set" プロパティ・コマンドとを区別している。このようにすると、同じデータ構造が特定のプロパティを設定または取得するように使用でき、ドライバは必要なアクションを使用されたＩＯＣＴＬに基づいて決定することができる。正しいプロパティは、ユニークなＧＵＩＤとＲＵＩＤの組合せからなる集合識別子(set identifier)によって特定される。
【００７０】
メソッド集合は使用されるもう１つの集合タイプであり、これはドライバによって実行できるアクションの集合である。メソッド集合を特定するために必要なＩＯＣＴＬは１つだけであり、アクチュエートされる正しいメソッドは集合識別子のユニークなＧＵＩＤとＲＵＩＤの組合せによって特定される。メソッドはドライバを制御するために使用され、ドライバを使用するための初期化、バッファのクリアといった機能を含んでいる。
【００７１】
イベント集合は、デバイス変更通知、データ・スターベーション通知などのドライバ処理や、ユーザ・モード・アプリケーションで使用すると便利である集合によって定義された他の通知に関連するイベントを管理するために使用される。２つのＩＯＣＴＬが使用され、１つは特定のイベントをイネーブルにするためのものであり、もう１つは特定のイベントをディスエーブルにするためのものである。ＲＵＩＤで識別された、与えられたイベントに必要なデータ構造は、イベントをイネーブルにするか、ディスエーブルにするかに関係なく共用することができる。
【００７２】
集合を使用するには、入出力制御オペレーションは特定のＩＯＣＴＬおよび集合ＧＩＤ、 ＲＵＩＤをもつデータ構造と他の必要なデータ（例えば、制御フラグ、データ構造など）を指す参照を使用して開始される。例えば、サウンド・カード・ドライバでボリューム・プロパティを設定することは、入出力制御オペレーションをプロパティ集合ＩＯＣＴＬ、集合プロパティ・オペレーションを示す制御フラグ、ボリューム設定値をもつプロパティ集合の適切なＧＵＩＤ、ボリューム・プロパティを示しているその集合内の特定ＲＵＩＤ、および新しいボリューム設定値を使用することを必然的に伴なう。
【００７３】
サポートされる集合についてタイプ別に照会するには、ヌルＧＵＩＤとサポートされる集合の列挙を示す制御フラグとをもつ、特定の集合タイプのＩＯＣＴＬ（例えば、プロパティＩＯＣＴＬ、メソッドＩＯＣＴＬ、またはイベント・イネーブルＩＯＣＴＬ）が入出力コマンドの一部として出され、サポートされる集合ＧＵＩＤのリストが返される。ある集合内のサポートされるプロパティ、メソッドまたはイベントについて照会するには、集合ＧＵＩＤ、集合タイプＩＯＣＴＬ、ヌルＲＵＩＤ、およびサポートされるエレメントの列挙を示す制御フラグが入出力オペレーションと共に使用される。サポートされるＲＵＩＤのリストは入出力オペレーションの結果として返される。このリストから、サード・パーティ・エージェントは、実装されている集合のどのオプション・エレメント（もしある場合）がサポートされるかを判断することができる。
【００７４】
ＧＵＩＤでユニークに識別された集合の仕様書は、ドライバ開発者とサード・パーティ制御エージェントのどちらもが実装ガイドとして利用できるメカニズムをドキュメント化している。サード・パーティ開発者は、あるドライバの機能を照会に対する応答に基づいて知り、事前プログラムされた知識を抽象的集合定義に基づいて知ることになる。同様に、ドライバ開発者は、知った機能をどのようなサード・パーティ・エージェントに対して提供する集合または集合グループを実装するときのガイドとして抽象的集合定義を使用することができる。
【００７５】
ここで説明している接続機能を提供するためには、コンプライアント・ドライバはある種の集合をサポートしていなければならない。以下の表は、プロパティ集合フォーマットでサポートされ、本発明を実装するときに使用できるいくつかの重要な情報を示している。最初の表は、フィルタによって実装される接続ピン・ファクトリに関するプロパティに関し、２番目の表は、特定の接続ピン・ファクトリをテンプレートとして使用して作成される実際の接続ピン・インスタンスに関するプロパティを示している。
【００７６】
【表１】
0003929554.tif 000002
【００７７】
【表２】
0003929554.tif 000003
【００７８】
【表３】
0003929554.tif 000004
【００７９】
【表４】
0003929554.tif 000005
【００８０】
【表５】
0003929554.tif 000006
【００８１】
【表６】
0003929554.tif 000007
【００８２】
上記の表は単なる例示であり、これに限定されるものではない、この分野の精通者ならば理解されるように、異なるドライバ間の接続を作成するためには多数の異なるプロパティとスキーマを実装することが可能である。１つの重要な要素は標準化係数(standardization factor)であり、異なるドライバ製造者または開発グループは同一のプロパティ集合を実装する能力をもっているので、相互接続できるドライバを作成できるようにすることである。
【００８３】
もう１つの有用なプロパティ集合は、あるフィルタ上の入力と出力の接続ピン・ファクトリの内部関係に関するトポロジ情報を与える。この情報はあるフィルタ上の入力ピン・ファクトリおよび対応する出力ピン・ファクトリの関係だけでなく、入力と出力のピン・ファクトリの間でどのようなタイプの処理が行われるかも記載している。行われる処理の例としては、異なるデータ変換、データ伸張、エコー打消し(cancellation)などがある。このような情報は複数のフィルタを使用して仮定上の接続パスをトレースしてから実際の接続ピン・インスタンスおよび接続を作成する自動化フィルタ・グラフ作成機能で使用すると、便利である。基本的には、トポロジ情報はフィルタの内部構造を説明し、これをプロパティ集合メカニズムを通してサード・パーティ・エージェントからの照会に公開する。
【００８４】
従って、コンプライアント・ドライバは指定されたプロパティ集合を実装しているものにすぎない。そのため、サード・パーティ制御エージェントは、あるプロパティ集合がサポートされていることが分かったとき、コンプライアント・フィルタに対し照会と設定を行うことができる。全体目標は、異なるフィルタを１つに接続してフィルタ・グラフを作る方法に関する十分な情報を得ることである。
【００８５】
汎用集合メカニズムを使用すると、最小限の機能を実装してコンプライアント・ドライバのシステムをサポートできるが、その場合でも、拡張性は無制限である。集合は、特定の集合が実装されている限り、相互操作可能で相互接続可能なドライバのシステムを作成するために多数の異なるドライバ開発者によって独立にコーディングできる仕様書の中で定義することができる。さらに、この仕様書には、サポートしなければならない必須のプロパティ、メソッド、およびイベントを定義できるだけでなく、ドライバ機能と拡張機能に応じて実装できるオプションのプロパティ、メソッド、およびイベントも定義できる。最小限に要求される基本的共通性のほかに、ドライバ開発者は独自の集合を定義し、これらにＧＵＩＤを割当てることにより追加の機能を組み入れることも可能である。
【００８６】
次に、図９および図１０を参照して説明する。図は２つのカーネル・モード・フィルタを接続するプロセスを図形化して示している。図９はロジック・ブロック説明図であり、そこでは各フィルタ・インスタンスと接続ピン・インスタンスはファイル・オブジェクトで表されている。図１０はファイル・オブジェクトおよび適切な接続を作成するときのステップを示すフローチャートである。
【００８７】
ステップ１４４からスタートして、フィルタＡ１４６のインスタンスおよびフィルタＢ１４８のインスタンスはユーザ・モード・エージェントによって作成される。これらは特定のデバイスでファイルを作成する標準ファイル・システムＡＰＩを使用して作成される。フィルタＡ１４６とフィルタＢ１４８がコンプライアント・フィルタまたはドライバとなっているのは、これらが適切なプロパティ、メソッド、およびイベント集合を実装して接続ピン・インスタンスの作成をサポートし、サポートされる集合とそのフィルタ用に定義された接続ピン・ファクトリに関してそれぞれのフィルタの機能に照会するようになっているからである。
【００８８】
サード・パーティ制御エージェントは、ステップ１５０でフィルタＡ１４６とフィルタＢ１４８にそれぞれ照会し、利用可能な接続ピン・ファクトリおよびそれから作成できる接続ピン・インスタンスの属性を判断する。これらの属性には、前述したように、各フィルタ１４６と１４８のそれぞれのピン・ファクトリのタイプ別の接続フォーマットとデータ・フォーマットがある。照会は、以下で詳しく説明する集合ベース照会メカニズムを使用して行われる。
【００８９】
上記情報の照会を終えると、サード・パーティ制御エージェントは、以前に照会したデータ・フォーマットと接続フォーマットの範囲に基づいて最適接続フォーマットを決定する。この決定はステップ１５２で行われ、選択した接続パスの要求事項に応じて同じフィルタをサード・パーティ・エージェントが異なった使い方をできるようにする。サード・パーティ制御エージェントはデータ交差プロパティ(data intersection property)、トポロジ情報、および接続ピン・ファクトリを両方のフィルタで使用して、作成される実際のフィルタ・グラフに応じてデータ・フォーマットと接続配置の最良の選択方法を決定する。
【００９０】
入力フィルタ・ピン・インスタンス１５４はステップ１５２で判断された最適検出情報を使用して、ステップ１５６でサード・パーティ・エージェントによって作成される。入力ピン・インスタンス１５４はファイル・オブジェクトであるので、ハンドルが作成プロセスから返されるが、これは入出力要求を入力インスタンス１５４へ送るために使用できる。さらに、入力ピン・インスタンス１５４の作成が有効性の検査をされているが、この作成には、図４〜図６、図７および図８を参照して前述したルーチングおよびバリデーション・メカニズムが使用される。
【００９１】
接続を完成するために、出力ピン・インスタンス１５８は、以前に作成された入力ピン・インスタンス１５４のハンドルをNtCreateFileコールの中でパラメータとして使用してステップ１６０で作成される。出力ピン・インスタンス１５８がこのようにして作成される効果として、システム・ファイル管理機能と入出力管理機能を使用して内部ＩＲＰスタック構造が作成される。このスタック構造により、オリジナルの書込みコマンドは、さまざまな方法で接続された接続ピン・インスタンスとフィルタによって適当な順序で連続処理することが可能になるので、異なるフィルタ間の直接データ・フローが容易化される。これを行うためには、入力ピン・インスタンスを供給する関連出力ピン・インスタンスの前に入力ピン・インスタンスが作成されていることが必要である。
【００９２】
デバイス・オブジェクトのスタック深さパラメータは、このドライバに送られるＩＲＰ用にスタック・ロケーションをいくつ作成するかを制御する。スタック深さパラメータは、デバイス・オブジェクトが初めて作られるときは１つであると想定されているが、複数のドライバが１つにチェイニングされているかどうかに応じて、あとで変更することも可能である。現システムでは、この変更は、必要ならば、出力ピン・インスタンスが初期「停止」状態から「取得」または他の状態に遷移するとき行われる。接続ピン・インスタンスの状態遷移はＩＲＰを正しく作成し、処理するための正しいスタック深さパラメータ情報を決定するメカニズムである。
【００９３】
チェイニングされた接続ピン・インスタンス集合を正しく割当てるためには、接続ピン・インスタンスを特定の順序で停止状態から出るように遷移させる必要がある。つまり、最後の入力ピン・インスタンス（この例では、入力ピン・インスタンス１５４）から始まって、関連の（例えば、接続された）出力ピン・インスタンス（この例では、出力ピン・インスタンス１５８) まで連続的に逆方向に戻っていく必要がある。多数のフィルタが１つにチェイニングされていれば、最も深いフィルタまたはブリッジの入力ピン・インスタンスが遷移の開始ポイントであって、ブリッジまたはフィルタ上の初期出力ピン・インスタンスが設定されるまで逆方向に連続的に構築していかなければならない。言い換えれば、停止状態から出る遷移はチェインを逆昇るように行われ、各接続ピン・インスタンスが前の接続ピン・インスタンスの後で必要になるスタック・サイズを得るようにしなければならない。代表例として、必ずしもそうする必要はないが、接続ピン・インスタンスは停止状態から取得状態へ遷移するが、以下での説明の便宜上、取得状態への遷移はスタック深さパラメータの調整に関しては、停止状態から出る遷移と同じ目的を果たすようになっている。
【００９４】
すべてのピン・インスタンスが取得状態になったあとは、ストリーム読取りと書込みをフィルタ・グラフに対して出すことができる。なお、注目すべきことは、ここで説明しているシステムが、関連入力と出力ピン・インスタンスの接続をどの順序でも行うことができ、停止状態からの遷移だけはボトムアップ方式、つまり、最も深いものから先に行わなければならないことである。さらに、フィルタ・グラフは初期作成後に変更が行えるように再構成可能になっている。変更が行われるときは、状態遷移は停止状態にある接続ピン・インスタンスだけで行い、正しいスタック深さパラメータ情報が得られるようにする必要がある。
【００９５】
フィルタ上に見出される接続ピン・ファクトリは、フィルタが特定フォーマットでデータを消費および／または作成できる場所を表している。例えば、特定の接続ピン・ファクトリは、１６ビットの４４キロヘルツＰＣＭオーディオや８ビットの２２キロヘルツＰＣＭオーディオなどの、いくつかの異なるデータ・フォーマットをサポートすることができる。前述したように、接続ピン・ファクトリやそのデータ・フォーマットなどの異なる機能については、適切なプロパティ集合メカニズムとシステム入出力機能を使用してフィルタから照会することができる。実際の接続ピン・インスタンスはピン・ファクトリから受信した情報に基づいて作成される。
【００９６】
単一のストリーム書込みまたはストリーム読取りオペレーションがユーザ・モード・エージェントから出されると、接続されたフィルタを通してデータの連続処理が行われるストリーミング環境では、ＩＲＰ制御用の２つのメイン・メソッドがＮＴオペレーティング・システムのネーティブ機能の一部として使用することができる。第１のメソッドでは、個別ＩＲＰは各フィルタによって作成され、次のフィルタへ送られて処理され、このフィルタは新しいＩＲＰを作成し、チェインを下って次々と処理されていく。他のメソッドでは、単一のＩＲＰが使用され、入出力マネージャと相互作用するために用意された標準プロシージャを使用して連続フィルタ間で受け渡しされていく。チェイン上の各連続フィルタごとに新しいＩＲＰを作成していく第１のメソッドが使用される場合は、フィルタ間の相互接続順序が重要でないのは、フィルタはＩＲＰのデスティネーション(destination) だけを知っていればよく、入出力マネージャをコールしてＩＲＰを指定のフィルタへ送ることができるからである。ＩＲＰが再使用される場合に重要なことは、停止状態からの接続ピン・インスタンスの遷移が再使用ＩＲＰを受け取る最後のフィルタから始まるように行われ、再使用ＩＲＰを受け取る最初のフィルタまで、または処理のためにＩＲＰを作成したフィルタまで逆方向に処理していくことである。
【００９７】
相互接続カーネル・モード・フィルタの本実施の形態と実装例は、ＩＲＰ共用を利用してドライバ開発の複雑さを軽減し、より堅牢なドライバが作成されることを可能にし、処理を効率化するという利点がある。「ボトム・アップ」のピン・インスタンス状態遷移パスは、正しいスタック順序が連続ドライバによって処理されるＩＲＰに作成され、各ドライバ・オブジェクトが適切なスタック深さパラメータ集合をもつことを保証する。さらに、受信側入力ピン・ファクトリの現状態は、状態遷移シーケンスを正しくたどっていたかどうかを確かめるためにチェックされる。そのような理由から、特定の接続ピン・ファクトリの通信プロパティは起こり得るフロー方向を判断し、接続ピン・インスタンスの状態遷移を正しく分配する上で支援する。
【００９８】
出力ピン・インスタンス（またはＩＲＰソース）を作成するとき、別のフィルタ上の入力ピン・インスタンス（またはＩＲＰシンク(sink)）を表すファイル・オブジェクトへの参照はNtCreateFileコールの一部として引き渡される。適切な作成ハンドラはマルチプレクシング・ディスパッチ機能とデバイス・オブジェクト／ファイル・オブジェクト階層を使用して、前述したように実行される。この作成ハンドラは入力ピン・インスタンスをもつフィルタ（例えば、図９のフィルタＢ１４８）のデバイス・オブジェクトを、入力接続ピン・インスタンス・ファイル・オブジェクト（例えば、入力ピン・インスタンス１５４）を通してアクセスすることができる。デバイス・オブジェクトから、前のスタック深さパラメータを読み取ることができ、出力ピン・インスタンスをもつフィルタのデバイス・オブジェクトのスタック深さパラメータが増加される。例えば、フィルタＡ１４６に関連するデバイス・オブジェクトは、図９に示す接続ではフィルタＢ１４８に関連するデバイス・オブジェクトのそれから増加されるスタック深さパラメータをもっている。これは停止状態から出る遷移のとき行われるのが通常であり、ＩＲＰは接続ピン・インスタンスが停止状態にある間はルーチングされない。
【００９９】
フィルタがＩＲＰを処理するとき、その特定フィルタ用に指定された情報を含んでいる、ＩＲＰスタック内のどのスタック・フレームまたはロケーションをアクセスすべきかを、関連デバイス・オブジェクトのスタック深さパラメータを参照するか、あるいはそれを使用することによって知る。さらに、現フィルタは、デバイス・オブジェクトのスタック深さパラメータを減らして次のフィルタのＩＲＰスタック・ロケーションに位置づけることによって、処理チェイン上の次のフィルタ用のＩＲＰを準備する。
【０１００】
フィルタ・コードはＩＲＰスタック内の次のロケーションを準備し、入出力マネージャをコールしてＩＲＰを、指定された通りに次のフィルタに渡すことを受け持っている。このようにすると、フィルタは、特定の接続ピン・インスタンスを表す、どのファイル・オブジェクトがＩＲＰと関連データを受け取って処理するかを指定することができる。従って、ＩＲＰの順次処理のためにそれぞれのデバイス・オブジェクトをスタックするためのIoAttachDeviceのような標準入出力マネージャ・コールは使用されない。
【０１０１】
注目すべきことは、接続ピン・インスタンス間の接続を作成することは、その接続を表すために新しいデバイス・オブジェクトを作成することを意味しないことである。基礎となる単一のデバイス・オブジェクトはフィルタのインスタンスとそのフィルタ上のすべての接続ピン・インスタンスをサポートするために使用される。正しいデータ処理のために必要な具体的情報はファイル・オブジェクトのコンテキスト・エリアに保存されていて、コンテキスト情報はそのまま残されているが、非ページ・メモリ使用量は最小限に保たれている。さらに注目すべきことは、ＩＲＰベースの媒体について説明してきたが、相互接続フィルタ間の通信のための他の媒体も使用できることである。そのようなものとして、非ホスト・ハードウェアとハードウェア間通信での直接関数コールがある。
【０１０２】
次に、図１１と図１２および図１３を参照して、図１（従来技術）と図２（相互接続カーネル・モード・ドライバのハイレベル・ロジック図）に示すソフトウェア・ドライバの正しい作成、接続、および状態遷移順序について説明する。図１１はボックス１６２で囲んだロジック構造とそこに含まれる処理ステップを示している。図１２は接続ピン・インスタンスを作成して、カーネル・モード・フィルタの相互接続を完成する様子を示し、図１３に示すフローチャートにボックス１６４で囲んだ処理ステップを含んでいる。
【０１０３】
すべての相互接続が行われている図１２の状態にあるとき、カーネル・モード・フィルタ・システムは処理を行うために読み書きの準備状態にある。入出力システムは正しい状態遷移プロセスによって正しく設定されたＩＲＰスタック情報を使用して、ストリーム読取りと書込みをそれぞれの接続ピン・インスタンスを通して異なるフィルタ・エレメントに引き渡す。なお、グラフを作成するために使用されたエージェント以外の、ある種の外部ソフトウェアは、ブリッジまたはフィルタ自体とハードウェアも含めて、ストリーム読取りとライトのデータを提供する。
【０１０４】
ステップ１６８からスタートしたあと、制御エージェント１７０はステップ１８０で、リーダ・フィルタ１７２、デコンプレッサ・フィルタ１７４、効果フィルタ１７６、およびサウンド・レンダリング・フィルタ１７８のインスタンスを作成する。さらに、リーダ・フィルタ１７２とディスク・ドライバ１８２との間の接続が行われて、データがディスク・ドライブから持ち込まれるようにする。各フィルタ・インスタンスの作成は標準入出力コールを使用してデバイス入出力ディレクトリ階層に見出される適切なデバイス上のファイルをオープンすることにより、ユーザ・モード制御エージェント１７０によって行われる。このコールからは、各フィルタのインスタンスを表すファイル・オブジェクトへのハンドルが返される。
【０１０５】
ステップ１８４で、サード・パーティ・エージェントは効果フィルタ１７２、デコンプレッサ・フィルタ１７４、効果フィルタ１７６、およびサウンド・レンダリング・フィルタ１７８に照会し、接続ピン・ファクトリの機能を判断する。これらの機能は、どのような種類の入出力ピン・インスタンスが作成できるか、特定のフィルタは各接続ピン・ファクトリのインスタンスをいくつサポートするか、各接続ピン・ファクトリでサポートされるデータ・フォーマット、通信パスの媒体またはタイプなどがある。これらの機能は以前に詳しく説明したプロパティ集合メカニズムを使用して照会され、カーネル・モード・フィルタは、適切な「集合」（例えば、プロパティ集合）をサポートしているのでアーキテクチャに従っていることが前提になっている。
【０１０６】
ステップ１８４でのこのようなすべての照会情報は、チェインニングされた接続パスが、適切な接続ピン・インスタンスを作成し、接続することによりそれぞれのフィルタ間で可能であるかどうかを判断するために使用される。サード・パーティ・エージェントは、相互接続のために必要なピン・インスタンスのタイプを判断し、与えられた目的を達成するフィルタ・グラフを作成する。
【０１０７】
サポートされるデータ・フォーマットに基づく接続フォーマットの決定はステップ１８６で行われる。フィルタ上のトポロジ情報、データ・フォーマット、およびデータ交差プロパティを使用すると、仮定上の(hypothetical)フィルタ・グラフを作成することができる。接続順序は重要でないので、そのようにする必要はないが、フィルタ・グラフを作成しようとするとき時間を節約することができる。この仮定上のフィルタ・グラフがエラーなしで作成されるのであれば、サード・パーティ・エージェントは、相互接続する接続ピン・インスタンスの作成を信頼して行うことができるという安心が得られる。実際のピン・インスタンスが作成されていなければ、ある種の照会からはエラーが返されるので、かかる接続ピン・インスタンスを作成してから仮定上のフィルタ・グラフを作成するようにすると、実行可能であるとの信頼できる指示が返されることになる。この場合も、仮定上のフィルタ・グラフは相互接続を行う前にテストすることが可能である。
【０１０８】
正しい接続情報が分かっているとステップ１８６で決定されると、入力ピン・インスタンスを作成し、相互接続して、図１３のボックス１６４で囲まれた処理ステップのループで表すことができる。このループはデータ・ストリームのソースから最も遠くに離れた入力ピン・インスタンスから始まる処理ステップを含んでいる。この最後の入力ピン・インスタンスは「最も深い」ピン・インスタンスと呼ばれ、これは最初に作成され、そのあとに関連する出力ピン・インスタンスを続けることができる。従って、接続は、以前に作成された入力ピン・インスタンスのハンドルを使用して出力ピン・インスタンスを作成したものである。
【０１０９】
このパターンは、すべての入力ピン・インスタンスが関連出力ピン・インスタンスとの接続の前に、それ以後連続して作成されるように続けられる。このような接続シナリオは単なる例示であり、それぞれの出力と入力ピン・インスタンスを接続して、本発明によるカーネル・モード・フィルタ間の接続を形成する他の可能な方法を限定するものではない。フィルタは、入力ピン・インスタンスからのハンドルが別のフィルタ上の接続された出力ピン・インスタンスの作成期間に使用される限り、実装に従ってどの順序でも接続することが可能である。さらに、前述したように、初期作成後（および使用後も）フィルタ・グラフに変更を行うことが可能である。
【０１１０】
ループの最初の繰り返しでは、入力ピン・インスタンス１８８はステップ１９０で作成される。作成機能からハンドルを受け取ると、サード・パーティ制御エージェント１７０はそのハンドルをNtCreateFileコールでパラメータとして使用してステップ１９４で出力ピン・インスタンス１９２を作成する。最初の繰り返しでこれを行うと、サウンド・レンダリング・フィルタ１７８は、それぞれ対応する接続ピン・インスタンス１８８と１９２を通して効果フィルタ１７６に実効的に接続される。現実装では、NtCreateFileコールはユーザ・モード・クライアントが利用できるＡＰＩの関数コールの一部として「ラップ(wrapped) 」される。これにより、サード・パーティ・エージェントのユーザ・モード開発者は詳細を知る必要から解放されるので、すべての関係機能を単一ユーザ・モードＡＰＩに集中させることができる。
【０１１１】
ステップ１９６で、サード・パーティ・エージェントは作成すべき入力ピン・インスタンスが他にも残っているかどうかを判断する。残っていれば、入力ピン・インスタンスを作成し、そのあとに別のフィルタ上の対応する出力ピン・インスタンスを続けなければならない。最終的には、すべての接続が行われ、サード・パーティ制御エージェント１７０はストリーム化データ処理に対してフィルタ・グラフを準備する。
【０１１２】
以上のようにして、入力ピン・インスタンス２０２はステップ１９０でボックス１６４で囲まれたループの２回目の繰り返しで作成され、他方、出力ピン・インスタンス２０４は入力ピン・インスタンス２０２のハンドルをステップ１９４でその作成の一部として使用する。最後に、この特定の例では、３回目と最後の繰り返しで、入力ピン・インスタンス２０６が作成され、そのあとに出力ピン・インスタンス２０８が続いて接続が完結する。
【０１１３】
ステップ１９７で、サード・パーティ制御エージェント１７０は、フィルタ・グラフによるストリーム化データ処理に備えて各接続ピン・インスタンスを停止状態から取得状態へ遷移させる。それぞれのフィルタのデバイス・オブジェクトの各々でスタック深さパラメータを正しく設定するためには、状態遷移は「最も深い」または最後の接続ピン・インスタンス（例えば、処理のためのデータを受け取る最後の入力ピン・インスタンス）から始めて、最初の接続ピン・インスタンス（例えば、データをグラフに送り込む最初の出力ピン・インスタンス）に到達するまで相互接続カーネル・モード・フィルタのチェインを順次に「さかのぼる」ように行う必要がある。最初のフィルタまたはブリッジはＩＲＰを作成し、スタック・ロケーションはＩＲＰがグラフ内の各カーネル・モード・フィルタに効率よく連続して受け渡されるように十分に割当てられる。
【０１１４】
最後に、サード・パーティ制御エージェント１７０はストリーム読取りと書込みを出し、ステップ１９８でデータを処理してからステップ２００で終了する。
【０１１５】
前述したように、出力ピン・インスタンスの各作成には、そこに接続された入力ピン・インスタンスを表すファイル・オブジェクトのハンドルが必要である。このファイル・オブジェクト参照は、出力ピン・インスタンスの作成ハンドラが入力ピン・インスタンスに対応するデバイス・オブジェクトへの参照を、現在または将来のアクセスのためにセーブしておくことができるようにする。
【０１１６】
もっと具体的に説明すると、これにより、入力ピン・インスタンスを管理するデバイス・オブジェクトのスタック深さパラメータは、停止状態から取得または他の状態へ状態遷移するとき出力ピン・インスタンスのドライバによってアクセスすることが可能になる。入力ピン・インスタンスに関連するスタック深さパラメータの値はアクセスされ、増加され、出力ピン・インスタンスに対応するデバイス・オブジェクトのスタック深さパラメータの中にセーブされる。
【０１１７】
スタック深さパラメータは、共用ＩＲＰスタック構造のどこに特定フィルタ用のスタック・フレーム情報が置かれているかを判断するために使用されるが、これは各フィルタごとに異なっている。フィルタをこのように相互接続し、状態遷移を正しいシーケンスで行うと、通信をユーザ・モードにしなくても、カーネル・モードの相互接続フィルタのチェインを下るように単一ＩＲＰを受け渡してくことができる。
【０１１８】
以上の説明から理解されるように、同一の接続ピン・ファクトリを基礎にした複数のインスタンスをもつことが可能である。例えば、オーディオ・ミキシング・フィルタは複数のピン・インスタンスをミックスして単一の出力ピン・インスタンスにしてから処理することができる。各入力インスタンスは同一タイプであり、フィルタは１つのタイプの入力ピンだけをサポートすることができる。このような構成の別の例として、複数の入力を１つの出力にする例がある。
【０１１９】
逆のことを行うことも可能である。つまり、スプリッタ・フィルタは単一入力接続ピン・インスタンスをもち、複数の出力ピン・インスタンスを提供することによりデータ・ストリームを倍にすることが可能である。この分野の精通者ならば理解されるように、上述してきた接続メカニズムから実際の実装とその要求条件に応じて種々態様に変形し、種々態様に組み合わせることが可能である。
【０１２０】
ドライバ開発者が独立に実装できる共通メカニズム（例えば、プロパティ集合、メソッド集合、およびイベント集合）を、すべてのコンプライアント・フィルタにサポートさせることによって均一性と標準化が達成されているので、制御エージェントは異種ソフトウェア・プロバイダから提供されるコンプライアント・フィルタを都合よく接続することができる。さらに、接続ピン・ファクトリの観点から見た機能の多くはある状況では必要であっても、別の状況では必要でない場合がある。必要とされる接続ピン・インスタンスの決定は異なるフィルタ間の相互接続を実際に行うサード・パーティ制御エージェントによって最初に行われる。
【０１２１】
この分野の精通者ならば理解されるように、本発明の種々方法はコンピュータ・プログラム・コード手段として、磁気ディスク、CD-ROM、およびこの分野で共通している他の媒体やまだ未開発の他の共通媒体などの、コンピュータ読取り可能媒体上にストアされるコンピュータ命令として組み込んでおくことが可能である。さらに、コンピュータ・ハードウェア・メモリに置かれる重要なデータ構造は、上記のようなコンピュータ・プログラム・コード手段のオペレーションにより作成することができる。
【０１２２】
本発明は本発明の基本的特徴の精神から逸脱しない限り、他の実施形態で実現することも可能である。上述してきた各種実施の形態はすべての点で説明した通りであるが、これらの実施の形態に限定されるものではない。従って、本発明の範囲は上述してきた説明によってではなく、特許請求の範囲に記載されている事項によってのみ限定されるものである。特許請求の範囲の均等の意味と範囲に属する一切の変更は本発明の範囲に属するものである。
【図面の簡単な説明】
【図１】制御エージェントの指示を受けてサウンド・データをディスク・ファイルから持ち込み、サウンド・データをなんらかの形態で処理し、サウンド・データをレンダリングしてスピーカから再生させる相互接続フィルタとドライバのシステムを示す従来技術のデータ・フロー図である。
【図２】図１に示すシステムと目的が同じであり、サウンド・データをディスク・ドライバから読み取り、そのデータを処理し、そのデータをレンダリングしてスピーカから聞こえるようにし、処理フィルタとレンダリングは、この場合も制御エージェントの指示を受けて相互接続カーネル・モード・ドライバによって処理されるようした本発明によるシステムを示す図である。
【図３】オペレーティング・システムで作成され、使用されるドライバ・オブジェクト、デバイス・オブジェクトおよびファイル・オブジェクト間の関係を示す垂直関係モデルを示す図である。
【図４】ドライバ・オブジェクトのロジック・ブロック図であり、本発明のシステムに従ってメッセージを適切なプロセス・ハンドリング・コードへ転送し、新しいファイル・オブジェクトの作成をバリデーションするためのデータ構造およびプログラム・コードとの論理的関係を示す図である。
【図５】デバイス・オブジェクトのロジック・ブロック図であり、本発明のシステムに従ってメッセージを適切なプロセス・ハンドリング・コードへ転送し、新しいファイル・オブジェクトの作成をバリデーションするためのデータ構造およびプログラム・コードとの論理的関係を示す図である。
【図６】ファイル・オブジェクトのロジック・ブロック図であり、本発明のシステムに従ってメッセージを適切なプロセス・ハンドリング・コードへ転送し、新しいファイル・オブジェクトの作成をバリデーションするためのデータ構造およびプログラム・コードとの論理的関係を示す図である。
【図７】ルーチングとバリデーション・コンポーネントリの初期セットアップとカーネル・モード・ドライバによる入出力メッセージの処理を示すフローチャートである。
【図８】制御エージェントの処理、ルーチングとバリデーション・メカニズム、および新しいファイル・オブジェクトを作成する具体的な作成ハンドラ・ルーチンを示す詳細フローチャートである。
【図９】オペレーティング・システムでファイル・オブジェクト構造を利用して、接続を標準化された方法で行う接続フィルタ間の水平関係を示すロジック図である。
【図１０】図９のカーネル・モード・フィルタまたはドライバを作成し、接続するためにユーザ・モードの制御エージェントによってとられる処理ステップを示すフローチャートであり、制御エージェントから受け取った入出力要求を処理するために接続を行い、その処理が異なるドライバ（フィルタ）間で続けられる様子を示している。
【図１１】ユーザ・モードの制御エージェントの指示を受けてカーネル・モード・フィルタのチェインを作成するために使用され、サウンド・データをハード・ドライブから読み取り、カーネル・モード・フィルタでそのデータを処理し、そのデータをレンダリングしてスピーカから聞こえるようにするシステムを実装するためのカーネル・モード・ドライバと接続を示す概要ロジック図である。
【図１２】ユーザ・モードの制御エージェントの指示を受けてカーネル・モード・フィルタのチェインを作成するために使用され、サウンド・データをハード・ドライブから読み取り、カーネル・モード・フィルタでそのデータを処理し、そのデータをレンダリングしてスピーカから聞こえるようにするシステムを実装するためのカーネル・モード・ドライバと接続を示す概要ロジック図である。
【図１３】図１１と図１２に示すシステム用に相互接続カーネル・モード・ドライバを作成するための処理ステップを示すフローチャートである。
【符号の説明】
４４  制御エージェント
４６  ディスク・ドライブ
４８  ディスク・ドライバ
５０  リーダ・ドライバ
５２  デコンプレッサ・ドライバ
５４  効果フィルタ
５６  効果プロセッサ
５８  レンダリング・ドライバ
６２  スピーカ
６４，７６，８０  ドライバ・オブジェクト
６６  デバイス・オブジェクト
７０，７２，７４，９０  ファイル・オブジェクト
７８  汎用マルチプレクシング・ディスパッチ機能
８２  デバイス・エクステンション・エリア
８４，１００  ファイル・タイプ・バリデーション・テーブル
８６，１０２  ファイル・オブジェクト・タイプ
８８  作成ハンドラ
９２  ファイル・コンテキスト・エリア
９４  ＩＲＰ要求ハンドラ・テーブル
９６  ＩＲＰ要求
９８  ハンドラ
１０４  参照
１４６  フィルタＡ
１４８  フィルタＢ
１５４  入力フィルタ・ピン・インスタンス
１５８  出力ピン・インスタンス
【図１】
0003929554.tif 000008
【図２】
0003929554.tif 000009
【図３】
0003929554.tif 000010
【図４】
0003929554.tif 000011
【図５】
0003929554.tif 000012
【図６】
0003929554.tif 000013
【図７】
0003929554.tif 000014
【図８】
0003929554.tif 000015
【図９】
0003929554.tif 000016
【図１０】
0003929554.tif 000017
【図１１】
0003929554.tif 000018
【図１２】
0003929554.tif 000019
【図１３】
0003929554.tif 000020