(57)【要約】【課題】  AVデータの記録または再生を、リアルタイムで行う。【解決手段】  アプリケーションからのアクセス要求をフィルタリングし、PD_FS５４（ファイルシステムドライバ）に渡すファイルシステムフィルタドライバであるPDフィルタ５３は、AVアプリケーション３３以外のアプリケーション３１や３２からのアクセス要求に対する処理の許可または不許可を表すポーズフラグを設定し、アプリケーション３１乃至３３それぞれからのアクセス要求を、キューに記憶させる。そして、PDフィルタ５３は、キューに記憶されたアクセス要求のうちの、AVアプリケーション３３からのアクセス要求を、常時処理し、他のアプリケーション３１や３２からのアクセス要求を、ポーズフラグが許可を表しているときのみ処理する。本発明は、例えば、ファイルシステムフィルタドライバに適用できる。【選択図】図４
2005302221.tif 000002
【特許請求の範囲】
【請求項１】
アプリケーションからの記録媒体へのアクセスの要求であるアクセス要求を処理する情報処理装置において、
アプリケーションからの前記アクセス要求に対する処理の許可または不許可を表す許可情報を設定する許可情報設定手段と、
アプリケーションからの前記アクセス要求を、キューに記憶させるキュー制御手段と、
前記キューに記憶されたアクセス要求を、前記許可情報にしたがって処理するアクセス要求処理手段と
を備えることを特徴とする情報処理装置。
【請求項２】
前記アクセス要求処理手段は、特定のアプリケーションからの前記アクセス要求を、常時処理し、他のアプリケーションからのアクセス要求を、前記許可情報が処理の許可を表しているときのみ処理する
ことを特徴とする請求項１に記載の情報処理装置。
【請求項３】
キャッシュ機能の利用の有無を設定するキャッシュ機能設定手段をさらに備え、
前記アクセス要求処理手段は、さらに、前記キャッシュ機能設定手段によるキャッシュ機能の利用の有無の設定結果にしたがって、前記アクセス要求を処理する
ことを特徴とする請求項１に記載の情報処理装置。
【請求項４】
前記アクセス要求処理手段は、特定のアプリケーションからの前記アクセス要求のみを、前記キャッシュ機能の利用の有無の設定結果にしたがって処理する
ことを特徴とする請求項３に記載の情報処理装置。
【請求項５】
前記アクセス要求をフィルタリングし、ファイルシステムドライバに渡すフィルタドライバである
ことを特徴とする請求項１に記載の情報処理装置。
【請求項６】
前記記録媒体に対して読み書きされるデータは、AV(Audio Visual)データを、少なくとも含む
ことを特徴とする請求項１に記載の情報処理装置。
【請求項７】
前記記録媒体は、その記録領域上の所定の大きさ以上の連続した空き領域のうち、直前にデータが記録された記録領域に最も近い位置の空き領域が予約され、データが記録されるものである
ことを特徴とする請求項１に記載の情報処理装置。
【請求項８】
アプリケーションからの記録媒体へのアクセスの要求であるアクセス要求を処理する情報処理方法において、
アプリケーションからの前記アクセス要求に対する処理の許可または不許可を表す許可情報を設定する許可情報設定ステップと、
アプリケーションからの前記アクセス要求を、キューに記憶させるキュー制御ステップと、
前記キューに記憶された前記アクセス要求を、前記許可情報にしたがって処理するアクセス要求処理ステップと
を含むことを特徴とする情報処理方法。
【請求項９】
アプリケーションからの記録媒体へのアクセスの要求であるアクセス要求の処理を、コンピュータに行わせるプログラムにおいて、
アプリケーションからの前記アクセス要求に対する処理の許可または不許可を表す許可情報を設定する許可情報設定ステップと、
アプリケーションからの前記アクセス要求を、キューに記憶させるキュー制御ステップと、
前記キューに記憶された前記アクセス要求を、前記許可情報にしたがって処理するアクセス要求処理ステップと
を含むことを特徴とするプログラム。
【請求項１０】
アプリケーションからの記録媒体へのアクセスの要求であるアクセス要求の処理を、コンピュータに行わせるプログラムが記録されているプログラム記録媒体において、
アプリケーションからの前記アクセス要求に対する処理の許可または不許可を表す許可情報を設定する許可情報設定ステップと、
アプリケーションからの前記アクセス要求を、キューに記憶させるキュー制御ステップと、
前記キューに記憶された前記アクセス要求を、前記許可情報にしたがって処理するアクセス要求処理ステップと
を含むことを特徴とするプログラムが記録されているプログラム記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置および情報処理方法、並びにプログラムおよびプログラム記録媒体に関し、特に、例えば、AV(Audio Visual)データなどを、リアルタイムで記録媒体に記録し、再生することができるようにする情報処理装置および情報処理方法、並びにプログラムおよびプログラム記録媒体に関する。
【背景技術】
【０００２】
近年、例えば、光ディスクに、高ビットレートのAVデータを記録し、再生することが要請されている。
【０００３】
そこで、例えば、ビデオデータや、それに付随するオーディオデータなどの複数のデータ系列それぞれを、周期的に、かつ、その境界が光ディスクのセクタ等の境界に一致するように、光ディスクに記録するディスクドライブを本件出願人は先に提案している（例えば、特許文献１参照）。
【０００４】
このディスクドライブによれば、ビデオデータやオーディオデータが、ある程度まとめて、光ディスク上の連続した記録領域に記録されるので、そのまとまったデータを、シークなしで読み書きすることができる。
【０００５】
さらに、ビデオデータとオーディオデータとの境界が、光ディスクのセクタの境界に一致するので、１つのセクタに、ビデオデータとオーディオデータとが混在しない。このため、例えば、ビデオデータだけ、またはオーディオデータだけを読み出すことができる。即ち、例えば、ビデオデータだけを必要とするときに、光ディスクから、ビデオデータだけを読み出すことができ、１つのセクタに、ビデオデータとオーディオデータとが混在する場合に比較して、ビデオデータだけを効率良く（高速に）読み出すことができる。オーディオデータについても同様である。
【０００６】
【特許文献１】特開2004-005895号公報。
【発明の開示】
【発明が解決しようとする課題】
【０００７】
本件出願人は、さらに、例えば、光ディスクの記録領域上の所定の大きさ以上の連続した空き領域のうち、直前にデータが記録された記録領域に最も近い位置の空き領域を予約し、その空き領域に、データを記録するディスクドライブも提案している。
【０００８】
この場合、理想的には、ある一連のデータは、光ディスク上の連続した記録領域に記録される。従って、データの記録再生時に、シークの発生を抑制することができ、高ビットレートのAVデータを、リアルタイムで光ディスクに記録し、また、光ディスクから高ビットレートのAVデータを、リアルタイムで再生することができる。
【０００９】
ここで、このように、光ディスクの記録領域上の所定の大きさ以上の連続した空き領域のうち、直前にデータが記録された記録領域に最も近い位置の空き領域を予約し、データを記録することによって、データの記録再生時に生じるシークの発生を抑制したディスクドライブを、以下、適宜、プロフェッショナルディスクドライブという。
【００１０】
また、プロフェッショナルディスクドライブによって、データが記録された光ディスクを、以下、適宜、プロフェッショナルディスクという。さらに、プロフェッショナルディスクを、以下、適宜、PD(Professional Disc)と略す。
【００１１】
ところで、最近では、高速なCPU(Central Processing Unit)や、大容量のメモリの低価格化等に伴い、高機能で低価格のコンピュータが実現されている。さらに、そのようなコンピュータにおいて、大容量のAVデータの編集その他の処理を行うアプリケーション（プログラム）（以下、適宜、AVアプリケーションという）も実現されている。
【００１２】
そして、コンピュータに対して、例えば、内蔵する形で、または外付けの形で、PD ドライブを接続し、AVアプリケーションから、PDドライブにアクセスして、PDに対するAVデータの読み書きを行うことの要請が高まってきている。
【００１３】
しかしながら、この場合、PDに対して、AVデータをリアルタイムで読み書きすることが保証されなくなることがある。
【００１４】
即ち、最近のコンピュータでは、一般に、マルチタスクにより、複数のアプリケーションを同時に実行することができる。しかしながら、複数のアプリケーションを同時に実行するといっても、正確には、複数のアプリケーションそれぞれに対応する処理が、時分割で行われるため、例えば、AVアプリケーションがPDにアクセスする前に、他のアプリケーションが、PDにアクセスしていると、AVアプリケーションがPDにアクセスするときに、PDドライブで予定されていないシークが発生する。
【００１５】
また、AVアプリケーションがPDにアクセスしようとするときに、他のアプリケーションが、PDにアクセスしていると、AVアプリケーションは、PDへのアクセスを待たされることになる。
【００１６】
このように、PDドライブで予定されていないシークが発生し、あるいは、AVアプリケーションによるPDへのアクセスが待たされると、PDに対して、AVデータをリアルタイムで読み書きすることが困難となる。
【００１７】
本発明は、このような状況に鑑みてなされたものであり、光ディスク等の記録媒体に対するデータの記録または再生を、リアルタイムで行うことができるようにするものである。
【課題を解決するための手段】
【００１８】
本発明の情報処理装置は、アプリケーションからのアクセス要求に対する処理の許可または不許可を表す許可情報を設定する許可情報設定手段と、アプリケーションからのアクセス要求を、キューに記憶させるキュー制御手段と、キューに記憶されたアクセス要求を、許可情報にしたがって処理するアクセス要求処理手段とを備えることを特徴とする。
【００１９】
アクセス要求処理手段には、特定のアプリケーションからのアクセス要求を、常時処理させ、他のアプリケーションからのアクセス要求を、許可情報が処理の許可を表しているときのみ処理させることができる。
【００２０】
情報処理装置には、キャッシュ機能の利用の有無を設定するキャッシュ機能設定手段をさらに設けることができ、アクセス要求処理手段には、さらに、キャッシュ機能設定手段によるキャッシュ機能の利用の有無の設定結果にしたがって、アクセス要求を処理させることができる。
【００２１】
アクセス要求処理手段には、特定のアプリケーションからのアクセス要求のみを、キャッシュ機能の利用の有無の設定結果にしたがって処理させることができる。
【００２２】
情報処理装置は、アクセス要求をフィルタリングし、ファイルシステムドライバに渡すフィルタドライバとすることができる。
【００２３】
記録媒体に対して読み書きされるデータには、AV(Audio Visual)データが、少なくとも含まれるものとすることができる。
【００２４】
記録媒体は、その記録領域上の所定の大きさ以上の連続した空き領域のうち、直前にデータが記録された記録領域に最も近い位置の空き領域が予約され、データが記録されるものとすることができる。
【００２５】
本発明の情報処理方法は、アプリケーションからのアクセス要求に対する処理の許可または不許可を表す許可情報を設定する許可情報設定ステップと、アプリケーションからのアクセス要求を、キューに記憶させるキュー制御ステップと、キューに記憶されたアクセス要求を、許可情報にしたがって処理するアクセス要求処理ステップとを含むことを特徴とする。
【００２６】
本発明のプログラムは、アプリケーションからのアクセス要求に対する処理の許可または不許可を表す許可情報を設定する許可情報設定ステップと、アプリケーションからのアクセス要求を、キューに記憶させるキュー制御ステップと、キューに記憶されたアクセス要求を、許可情報にしたがって処理するアクセス要求処理ステップとを含むことを特徴とする。
【００２７】
本発明のプログラム記録媒体に記録されているプログラムは、アプリケーションからのアクセス要求に対する処理の許可または不許可を表す許可情報を設定する許可情報設定ステップと、アプリケーションからのアクセス要求を、キューに記憶させるキュー制御ステップと、キューに記憶されたアクセス要求を、許可情報にしたがって処理するアクセス要求処理ステップとを含むことを特徴とする。
【００２８】
本発明においては、アプリケーションからのアクセス要求に対する処理の許可または不許可を表す許可情報が設定される。そして、アプリケーションからのアクセス要求が、キューに記憶され、キューに記憶されたアクセス要求が、許可情報にしたがって処理される。
【発明の効果】
【００２９】
本発明によれば、ある特定のアプリケーションからのアクセス要求のみを許可することができ、その結果、例えば、データの記録または再生を、リアルタイムで行うことが可能となる。
【発明を実施するための最良の形態】
【００３０】
以下に本発明の実施の形態を説明するが、請求項に記載の構成要件と、発明の実施の形態における具体例との対応関係を例示すると、次のようになる。この記載は、請求項に記載されている発明をサポートする具体例が、発明の実施の形態に記載されていることを確認するためのものである。従って、発明の実施の形態中には記載されているが、構成要件に対応するものとして、ここには記載されていない具体例があったとしても、そのことは、その具体例が、その構成要件に対応するものではないことを意味するものではない。逆に、具体例が構成要件に対応するものとしてここに記載されていたとしても、そのことは、その具体例が、その構成要件以外の構成要件には対応しないものであることを意味するものでもない。
【００３１】
さらに、この記載は、発明の実施の形態に記載されている具体例に対応する発明が、請求項に全て記載されていることを意味するものではない。換言すれば、この記載は、発明の実施の形態に記載されている具体例に対応する発明であって、この出願の請求項には記載されていない発明の存在、すなわち、将来、分割出願されたり、補正により追加される発明の存在を否定するものではない。
【００３２】
請求項１に記載の情報処理装置は、
アプリケーションからの記録媒体へのアクセスの要求であるアクセス要求を処理する情報処理装置（例えば、図４のPDフィルタ５３など）において、
アプリケーションからの前記アクセス要求に対する処理の許可または不許可を表す許可情報を設定する許可情報設定手段（例えば、図１５のステップＳ１５７やＳ１５９の処理を行う図６のフィルタコア５３Ａなど）と、
アプリケーションからの前記アクセス要求を、キューに記憶させるキュー制御手段（例えば、図１５のステップＳ１６５の処理を行う図６のフィルタコア５３Ａなど）と、
前記キューに記憶された前記アクセス要求を、前記許可情報にしたがって処理するアクセス要求処理手段（例えば、図１６のステップＳ１７３やＳ１７５の処理を行う図６のフィルタコア５３Ａ）と
を備えることを特徴とする。
【００３３】
請求項３に記載の情報処理装置は、
キャッシュ機能の利用の有無を設定するキャッシュ機能設定手段（例えば、図２３のステップＳ３０４やＳ３０５の処理を行う図１９のフィルタコア５３Ａなど）をさらに備え、
前記アクセス要求処理手段は、さらに、前記キャッシュ機能設定手段によるキャッシュ機能の利用の有無の設定結果にしたがって、前記アクセス要求を処理する
ことを特徴とする。
【００３４】
請求項５に記載の情報処理装置は、
前記アクセス要求をフィルタリングし、ファイルシステムドライバに渡すフィルタドライバ（例えば、図４のPDフィルタ５３など）である
ことを特徴とする。
【００３５】
請求項８に記載の情報処理方法は、
アプリケーションからの記録媒体へのアクセスの要求であるアクセス要求を処理する情報処理方法において、
アプリケーションからの前記アクセス要求に対する処理の許可または不許可を表す許可情報を設定する許可情報設定ステップ（例えば、図１５のステップＳ１５７やＳ１５９など）と、
アプリケーションからの前記アクセス要求を、キューに記憶させるキュー制御ステップ（例えば、図１５のステップＳ１６５など）と、
前記キューに記憶された前記アクセス要求を、前記許可情報にしたがって処理するアクセス要求処理ステップ（例えば、図１６のステップＳ１７３やＳ１７５など）と
を含むことを特徴とする。
【００３６】
請求項９に記載のプログラムおよび請求項１０に記載のプログラム記録媒体に記録されているプログラムは、
アプリケーションからの記録媒体へのアクセスの要求であるアクセス要求の処理を、コンピュータに行わせるプログラムにおいて、
アプリケーションからの前記アクセス要求に対する処理の許可または不許可を表す許可情報を設定する許可情報設定ステップ（例えば、図１５のステップＳ１５７やＳ１５９など）と、
アプリケーションからの前記アクセス要求を、キューに記憶させるキュー制御ステップ（例えば、図１５のステップＳ１６５など）と、
前記キューに記憶された前記アクセス要求を、前記許可情報にしたがって処理するアクセス要求処理ステップ（例えば、図１６のステップＳ１７３やＳ１７５など）と
を含むことを特徴とする。
【００３７】
以下、図面を参照して、本発明の実施の形態について説明する。
【００３８】
図１は、本発明を適用した情報処理システムの一実施の形態の構成例を示している。
【００３９】
図１において、情報処理システムは、PC(Personal Computer)１とドライブ２とで構成されている。
【００４０】
PC１は、OS(Operating System)や、アプリケーション（プログラム）を記憶しており、OSの制御の下、アプリケーションを実行することで、各種の処理を行う。
【００４１】
ドライブ２は、例えば、上述したPD(Professional Disc)ドライブで、1394ケーブル４を介して、PC１と接続されている。ドライブ２は、PDである光ディスク３の着脱が可能となっており、PC１との間で、IEEE(Institute of Electronic and Electronics Engineers)1394の規格に準拠した通信を行うことにより、光ディスク３に対して、AVデータその他のデータの読み書きを行う。
【００４２】
なお、ドライブ２は、PDドライブである必要はなく、光ディスクもPDである必要はない。また、PC１とドライブ２との間では、IEEE1394以外の規格に準拠した通信を行うことが可能である。
【００４３】
次に、図２は、図１のPC１のハードウェア構成例を示している。
【００４４】
PC１は、CPU(Central Processing Unit)１２を内蔵している。CPU１２には、バス１１を介して、入出力インタフェース２０が接続されており、CPU１２は、入出力インタフェース２０を介して、ユーザによって、キーボードや、マウス、マイク等で構成される入力部１７が操作等されることにより指令が入力されると、それにしたがって、ROM(Read Only Memory)１３に格納されているプログラムを実行する。あるいは、また、CPU１２は、ハードディスク１５に格納されているプログラム、衛星若しくはネットワークから転送され、通信部１８で受信されてハードディスク１５にインストールされたプログラム、またはドライブ１９に装着されたリムーバブル記録媒体２１から読み出されてハードディスク１５にインストールされたプログラムを、RAM(Random Access Memory)１４にロードして実行する。これにより、CPU１２は、後述するフローチャートにしたがった処理、あるいは後述するブロック図の構成により行われる処理を行う。そして、CPU１２は、その処理結果を、必要に応じて、例えば、入出力インタフェース２０を介して、LCD(Liquid Crystal Display)やスピーカ等で構成される出力部１６から出力、あるいは、通信部１８から送信、さらには、ハードディスク１５に記録等させる。
【００４５】
また、PC１においては、入出力インタフェース２０に、IEEE1394の規格に準拠した通信制御を行うIEEE1394I/F(InterFace)２２が接続されている。IEEE1394I/F２２には、1394ケーブル４を介して、ドライブ２が接続されている。CPU１２は、バス１１、入出力インタフェース２０、IEEE1394I/F２２、および1394ケーブル４を介して、ドライブ２にアクセスし、そのドライブ２に装着されている光ディスク３に対して、データを読み書きすることができる。
【００４６】
ここで、CPU１２は、OSや各種のアプリケーションのプログラムを実行するが、これらのプログラムは、PC１に内蔵されている記録媒体としてのハードディスク１５やＲＯＭ１３に予め記録しておくことができる。
【００４７】
あるいはまた、プログラムは、フレキシブルディスク、CD-ROM(Compact Disc Read Only Memory)，MO(Magneto Optical)ディスク，DVD(Digital Versatile Disc)、磁気ディスク、半導体メモリなどのリムーバブル記録媒体２１に、一時的あるいは永続的に格納（記録）しておくことができる。このようなリムーバブル記録媒体２１は、いわゆるパッケージソフトウエアとして提供することができる。
【００４８】
なお、プログラムは、上述したようなリムーバブル記録媒体２１からPC１にインストールする他、ダウンロードサイトから、ディジタル衛星放送用の人工衛星を介して、PC１に無線で転送したり、LAN(Local Area Network)、インターネットといったネットワークを介して、PC１に有線で転送し、PC１では、そのようにして転送されてくるプログラムを、通信部１８で受信し、内蔵するハードディスク１５にインストールすることができる。
【００４９】
次に、図３は、図２のCPU１２が実行するプログラムを示す図である。
【００５０】
例えば、OS３０、およびアプリケーション３１乃至３３（のプログラム）が、少なくとも、図２のハードディスク１５にインストールされており、CPU１２は、PC１の電源がオンにされると、ハードディスク１５からRAM１４に、OS３０をロードして実行する。さらに、例えば、ユーザが入力部１７を操作するなどして、アプリケーション３１や、３２，３３の起動を要求すると、CPU１２は、ハードディスク１５からRAM１４に、アプリケーション３１や、３２，３３をロードし、OS３０の制御の下で実行する。
【００５１】
そして、アプリケーション３１乃至３３が、例えば、ドライブ２に装着された光ディスク３へのアクセスの要求であるアクセス要求を行うと、OS３０は、そのアクセス要求を処理する。これにより、ドライブ２において、アプリケーション３１乃至３３からのアクセス要求によって記録が要求されたデータが、光ディスク３に記録される。あるいは、ドライブ２において、アプリケーション３１乃至３３からのアクセス要求によって再生（読み出し）が要求されたデータが、光ディスク３から読み出され、OS３０を介して、アクセス要求を行ったアプリケーションに渡される。
【００５２】
なお、図２のハードディスク１５にインストールするアプリケーションは、アプリケーション３１乃至３３の３つに限定されるものではなく、１つや、２つ、４以上であっても良い。
【００５３】
但し、ここでは、ハードディスク１５にインストールされている３つのアプリケーション３１乃至３３のうちの１つであるアプリケーション３３が、外部からのAVデータの取り込みや、AVデータの編集、記録、再生などを行うアプリケーションとなっているものとする。そこで、アプリケーション３３を、以下、適宜、AVアプリケーション３３ともいう。
【００５４】
AVアプリケーション３３は、DLL(Dynamic Link Library)であるPD_API(PD_API.DLL)４１を呼び出し、このPD_API４１を介して、光ディスク３に対するアクセス要求を行う。PD_API４１は、光ディスク３に対するアクセスに関する、後述する固有のAPI(Application Program Interface)を提供するDLLである。
【００５５】
次に、OS３０としては、例えば、Unix(R)や、Linux、さらには、マイクロソフト社のWindows(R)と呼ばれているもの、その他の任意のOSを採用することができるが、ここでは、例えば、Windows(R)のNT系のOSが採用されている。なお、Windows(R)のNT系のOSとしては、現在、"Windows(R) NT", "Windows(R) 2000", "Windows(R) XP"がある。
【００５６】
図４は、OS３０として、Windows(R)のNT系のOSが採用されている場合の、ドライブ２（の光ディスク３）へのアクセスに関する部分のOS３０の構成例を示している。
【００５７】
なお、図４では、特に、OS３０におけるデバイスドライバのレイヤ(layer)構成を、アプリケーション３１乃至３３との関係が分かるように示してある。
【００５８】
Windows(R)のNT系のOSであるOS３０は、マイクロカーネル技術とオブジェクト指向技術をベースとし、各サービスを、サブシステムによって実装している。
【００５９】
Win32サブシステム(Win32 SubSystem)５１は、サブシステムの１つで、アプリケーション３１乃至３３に対して、各種のAPI（関数）を提供し、例えば、メモリ管理、プロセス管理、グラフィックス描画などを行う。
【００６０】
即ち、Win32サブシステム５１は、アプリケーション３１乃至３３から、例えば、I/O(Input/Output)関係のAPI関数が呼び出されると、そのAPI関数に応じたI/O要求を、NT入出力マネージャ(NT I/O Manager)５２に出力する。
【００６１】
なお、Win32サブシステム５１が提供するAPI関数としては、例えば、ファイルの生成を行うCreateFile()、ファイル（ファイルに記録されたデータ）の読み出しを行うReadFile()、ファイル（ファイルへのデータ）の書き込みを行うWriteFile()、その他の各種の処理を行うDeviceIoControl()などがある。
【００６２】
NT入出力マネージャ５２は、レイヤ構造のデバイスドライバ(Device Driver)に対して、IRP(I/O Request Packet)を渡すためのサービスを提供する。
【００６３】
ここで、IRPは、デバイスドライバに対して要求する処理の情報を有するパケットで、IRPには、例えば、要求の内容を分類するコード(code)、データ（ファイル）の読み出し（再生）を要求するIRP_MJ_READ、データの書き込み（記録）を要求するIRP_MJ_WRITE、ファイルの生成を要求するIRP_MJ_CREATE、その他の各種の処理を要求するIRP_MJ_DEVICE_CONTROLなどがある。IRP_MJ_DEVICE_CONTROLのIRPでは、サブコード(sub code)として、IOCTL(I/O Control)が指定されるが、このIOCTLは、ユーザ(User)定義が可能になっている。
【００６４】
NT入出力マネージャ５２では、Win32サブシステム５１による、例えば、CreateFile()に応じたI/O要求は、IRP_MJ_CREATEのIRPに変換される。また、例えば、ReadFile()とWriteFile()は、それぞれ、IRP_MJ_READとIRP_MJ_WRITEのIRPに変換され、DeviceIoControl()は、IRP_MJ_DEVICE_CONTROLのIRPに変換される。
【００６５】
ここで、Windows(R)のNT系のOSでは、IRPは、ストレージクラスドライバ(Storage Class Driver)のレイヤ以上のレイヤで使用される。
【００６６】
図４では、ストレージクラスドライバのレイヤ以上のレイヤのデバイスドライバとして、ストレージクラスドライバであるPDストレージ５５、ストレージクラスドライバの１つ上位のレイヤのファイルシステムドライバ(FileSystem Driver)であるPD_FS５４、およびファイルシステムドライバの１つ上位のレイヤのファイルシステムフィルタドライバ(FileSystem Filter Driver)であるPDフィルタ５３の３つのデバイスドライバが存在する。
【００６７】
従って、本実施の形態では、NT入出力マネージャ５２は、これらのPDフィルタ５３、PD_FS５４、PDストレージ５５に対して、IRPを渡すためのサービスを提供する。
【００６８】
具体的には、NT入出力マネージャ５２は、Win32サブシステム５１からのI/O要求を、IRPに変換し、例えば、PDフィルタ５３に出力する。そして、PDフィルタ５３が、NT入出力マネージャ５２からのIRPに応じた要求を、例えば、NT入出力マネージャ５２に出力し、NT入出力マネージャ５２は、PDフィルタ５３からの要求を、IRPに変換して、その１つ下位のレイヤのPD_FS５４に出力する。さらに、PD_FS５４が、NT入出力マネージャ５２からのIRPに応じた要求を、例えば、NT入出力マネージャ５２に出力すると、NT入出力マネージャ５２は、PD_FS５４からの要求を、IRPに変換し、その１つ下位のレイヤのPDストレージ５５に出力する。
【００６９】
PDフィルタ５３は、PDドライブであるドライブ２用のファイルシステムフィルタドライバであり、かつ、後述するPD_FS５４の上位のファイルシステムフィルタドライバである。PDフィルタ５３は、アプリケーション３１乃至３３から、Win32サブシステム５１およびNT入出力マネージャ５２を介して供給される、ファイルシステムに関連するファイルシステム要求その他の要求(request)のフィルタリングを行い、そのフィルタリングの結果、PD_FS５４に渡すべき要求を得て、NT入出力マネージャ５２を介して、PD_FS５４に出力する等の処理を行う。
【００７０】
なお、PDフィルタ５３は、フィルタコア５３Ａを有し、アプリケーション３１乃至３３からの要求のフィルタリングなどのPDフィルタ５３における主要な処理は、フィルタコア５３Ａが行う。また、PDフィルタ５３は、例えば、Windows(R)レジストリであるレジストリ５８に設定（記憶）されている情報を参照して、要求のフィルタリングを行う。
【００７１】
PD_FS５４は、PDドライブであるドライブ２用のファイルシステムドライバで、ドライブ２に装着されたPDである光ディスク３に記録された（記録される）ファイルの管理を行う。即ち、PD_FS５４は、例えば、光ディスク３に記録されたデータ（ファイル）の管理情報としてのファイルシステムに基づき、PDフィルタ５３からNT入出力マネージャ５２を介して要求されたファイルの書き込みや読み出しの要求を、NT入出力マネージャ５２を介して、PDストレージ５５に出力する。
【００７２】
ここで、ファイルシステムドライバは、一般に、ファイルストリーム(File Stream)（ファイルに記録される（記録された）データのファイル）やファイルメタ(File Meta)情報のキャッシュ(Cache)機能を有し、このキャッシュ機能によれば、例えば、キャッシュされたファイルストリームやファイルメタ情報については、光ディスク３に実際にアクセスせずに、高速に得ることができる。
【００７３】
Windows(R)のNT系のOSでは、NTキャッシュマネージャ(NT Cache Manager)５９が、キャッシュ機能を有しており、PD_FS５４は、NTキャッシュマネージャ５９を利用して、キャッシュ機能を提供する。
【００７４】
なお、PD_FS５４は、FSコア５４Ａを有し、PD_FS５４における主要な処理は、FSコア５４Ａが行う。
【００７５】
PDストレージ５５は、PDドライブであるドライブ２の実際のデバイスドライバにあたるストレージクラスドライバで、上位のレイヤのデバイスドライバであるPD_FS５４から、NT入出力マネージャ５２を介して供給される要求としてのIRPを、例えば、SCSI(Small Computer System Interface)コード(SCSI Code)に変換し、SBP(Serial Bus Protocol)2ドライバ５６に出力する。
【００７６】
ここで、PDストレージ５５において、IRPをSCSIコードに変換するのは、SCSIコードが、後段のSBP2ドライバ５６で扱われるSBP2と、いわば親和性が良いからである。
【００７７】
SBP２ドライバ５６は、PDストレージ５５からのSCSIコードを、SBP2に準拠したデータであるSBP2データに変換し（SBP2プロトコルに変換し）、1394バスドライバ(IEEE1394 bus Driver)５７に供給する。
【００７８】
ここで、本実施の形態では、SBP２ドライバ５６の後段の1394バスドライバ５７により制御されるIEEE1394の規格に準拠した通信においてファイルシステムを扱うことができるプロトコルとして、SBP2を採用しているが、SBP2以外のプロトコルを採用することも可能である。
【００７９】
1394バスドライバ５７は、IEEE1394I/F２２（図２）を制御することにより、SBP2ドライバ５６からのSBP2データなどを、ドライブ２に送信し、また、ドライブ２から送信されてくる、光ディスク３から読み出されたデータを受信する。
【００８０】
ここで、本実施の形態では、PC１とドライブ２との間で、IEEE1394の規格に準拠した通信を行うこととしているが、PC１とドライブ２との間では、その他の通信を行うことが可能である。この場合、1394バスドライバ５７に代えて、PC１とドライブ２との間の通信に対応したバスドライバが用いられる。
【００８１】
なお、図４において、アプリケーション３１乃至３３のうちのAVアプリケーション３３が利用するPD_API４１は、上述したように、固有のAPI（API関数）を提供する。即ち、PD_API４１は、AVアプリケーション３３から、その固有のAPI関数が呼び出されると、そのAPI関数に応じて、Win32サブシステム５１が提供するAPI関数DeviceIoCotrol()を使用することにより、ユーザ定義のIOCTLが指定されたIRP_MJ_DEVICE_CONTROLのIRPを、NT入出力マネージャ５２を介して、PDフィルタ５３に供給する。これにより、PD_API４１は、PDフィルタ５３の固有の機能、即ち、ユーザ定義のIOCTLが表す機能を制御する。
【００８２】
このようなPD_API４１を含むAVアプリケーション３３は、PDドライブであるドライブ２を使用するのに必要なPDフィルタ５３、PD_FS５４、およびPDストレージ５５とともに、例えば、リムーバブル記録媒体２１（図２）に記録して販売することができる。また、PD_API４１を含むAVアプリケーション３３、PDフィルタ５３、PD_FS５４、およびPDストレージ５５が記録されたリムーバブル記録媒体２１は、単体で販売する他、例えば、ドライブ２に同梱し、ドライブ２の付属品として販売することができる。
【００８３】
ここで、図４において、アプリケーション３１乃至３３と、Win32サブシステム５１とは、ユーザモード(User Mode)で動作し、NT入出力マネージャ５２、PDフィルタ５３、PD_FS５４、PDストレージ５５、SBP2ドライバ５６、および1394バスドライバ５７は、カーネルモード(Kernel Mode)で動作する。
【００８４】
さらに、図４では、NT入出力マネージャ５２が、IRPを、ファイルシステムフィルタドライバであるPDフィルタ５３や、ファイルシステムドライバであるPD_FS５４を渡すことによって、ファイルシステムフィルタドライバやファイルシステムドライバに対して、処理の要求を行うこととしたが、Windows(R)のNT系のOSのNT入出力マネージャ５２は、IRPの他、FastIOを、ファイルシステムフィルタドライバやファイルシステムドライバに渡すことにより、処理の要求を行うことが可能である。
【００８５】
即ち、NT入出力マネージャ５２は、ファイルシステムフィルタドライバやファイルシステムドライバに対して、IRPの他、FastIOを渡すためのサービスも提供し、これにより、ファイルシステムフィルタドライバやファイルシステムドライバに対して、処理の要求を行う。
【００８６】
従って、Windows(R)のNT系のOSのファイルシステムフィルタドライバやファイルシステムドライバは、一般に、IRPとFastIOの両方をサポートする。
【００８７】
なお、FastIOによれば、例えば、ファイルの読み出し(Read)や書き込み(Write)が、NTキャッシュマネージャ５９に対して直に行われる。
【００８８】
また、以下では、IRPとFastIOのうちの、例えば、IRPを用いることとする。但し、以下、説明する機能は、FastIOによっても実現することができる。
【００８９】
次に、図５のフローチャートを参照して、アプリケーション３１乃至３３から光ディスク３に対するアクセスが要求されたときに図４のOS３０内におけるPDフィルタ５３，PD_FS５４，PDストレージ５５，SBP2ドライバ５６，1394バスドライバ５７の処理の概要について説明する。
【００９０】
なお、以下の説明と図５以降の図面においては、それぞれ、Win32サブシステム５１およびNT入出力マネージャ５２の説明と図示を、適宜省略する。
【００９１】
アプリケーション３１乃至３３が、例えば、光ディスク３に対するアクセスを要求するAPI関数を呼び出すと、そのAPI関数に応じた要求が、Win32サブシステム５１からNT入出力マネージャ５２に供給され、NT入出力マネージャ５２は、Win32サブシステム５１からの要求に応じたIRPが、PDフィルタ５３に供給される。
【００９２】
PDフィルタ５３は、ステップＳ１において、NT入出力マネージャ５２からのIRPを受信し、ステップＳ２に進む。PDフィルタ５３は、ステップＳ２において、NT入出力マネージャ５２からのIRPをフィルタリングして、ステップＳ３に進み、PD_FS５４に供給すべきIRPをキューイングする。即ち、PDフィルタ５３は、図４には図示していないキューに、NT入出力マネージャ５２からのIRPを供給して記憶させる。
【００９３】
さらに、PDフィルタ５３は、キューに記憶されたIRPを読み出し、NT入出力マネージャ５２を介して、PD_FS５４に供給して、ステップＳ４に進む。
【００９４】
ステップＳ４では、PD_FS５４は、PDフィルタ５３からのIRPによって要求されているデータについて、NTキャッシュマネージャ５９のキャッシュ機能を利用するのに必要な処理としてのキャッシュ処理を行い、ステップＳ５に進み、例えば、PDフィルタ５３からのIRPによって要求されているデータが、NTキャッシュマネージャ５９にキャッシュされているかどうかを判定する。
【００９５】
ステップＳ５において、PDフィルタ５３からのIRPによって要求されているデータが、NTキャッシュマネージャ５９にキャッシュされていると判定された場合、ステップＳ６に進み、PD_FS５４は、PDフィルタ５３からのIRPによって要求されているデータを、NTキャッシュマネージャ５９から受信する等し、そのIRPに対する応答を、PDフィルタ５３およびWin３２サブシステムを介して、そのIRPに対応するAPI関数を呼び出したアプリケーション（図４では、アプリケーション３１乃至３３のうちのいずれか）に返す。
【００９６】
一方、ステップＳ５において、PDフィルタ５３からのIRPによって要求されているデータが、NTキャッシュマネージャ５９にキャッシュされていないと判定された場合、ステップＳ７に進み、PD_FS５４は、PDフィルタ５３からのIRPを、NT入出力マネージャ５２を介して、PDストレージ５５に供給して、ステップＳ８に進む。
【００９７】
ステップＳ８では、PDストレージ５５は、PD_FS５４からのIRPを、対応するSCSIコードに変換し、SBP2ドライバ５６に供給して、ステップＳ９に進む。ステップＳ９では、SBP2ドライバ５６は、PDストレージ５５からのSCSIコードを、SBP2データに変換し、1394バスドライバ５７に供給して、ステップＳ１０に進む。
【００９８】
ステップＳ１０では、1394バスドライバ５７は、IEEE1394I/F２２（図２）を制御することにより、SBP2ドライバ５６からのSBP2データを、ドライブ２に送信する。
【００９９】
そして、1394バスドライバ５７は、ドライブ２から、ステップＳ１０で送信したSBP2データに対する応答が送信されてくるのを待って、ステップＳ１１において、その応答を受信し、SBP2ドライバ５６、PDストレージ５５、PD_FS５４、PDフィルタ５３、およびWin32サブシステム５１を介して、ステップＳ１で受信されたIRPを送信してきたアプリケーション（図４では、アプリケーション３１乃至３３のうちのいずれか）に返す。
【０１００】
ところで、図４において、アプリケーション３１乃至３３のうちのいずれか１のアプリケーションが光ディスク３にアクセスする前に、他の１のアプリケーションが光ディスク３にアクセスしていると、１のアプリケーションが光ディスク３にアクセスするときに、ドライブ２においてシークが発生する。
【０１０１】
また、１のアプリケーションが光ディスク３にアクセスしようとするときに、他の１のアプリケーションが光ディスク３にアクセスしていると、１のアプリケーションは、光ディスク３へのアクセスを待たされることになる。
【０１０２】
一方、図４において、アプリケーション３１乃至３３のうちのアプリケーション３３は、PDである光ディスク３に対するAVデータの書き込み（記録）や読み出し（再生）などを行うAVアプリケーションである。
【０１０３】
従って、PDドライブであるドライブ２が、AVアプリケーション３３のみのアクセスに対して、AVデータをリアルタイムで読み書きすることができるように設計されている場合には、アプリケーション３１や３２による光ディスク３のアクセスによって、シークが発生し、あるいは、AVアプリケーション３３のアクセスが待たされると、AVアプリケーション３３がAVデータをリアルタイムで読み書きすることが妨げられることになる。
【０１０４】
そこで、PDフィルタ５３は、以下の第１乃至第３の機能の１以上を実装しており、その実装しているいずれか１の機能によって、光ディスク３に対するAVデータのリアルタイムでの読み書きが妨げられることを防止し、AVデータをリアルタイムで読み書きすることを保証するようになっている。
【０１０５】
即ち、第１の機能によれば、PDフィルタ５３は、アプリケーション３１乃至３３からの、光ディスク３に対するアクセス要求に対応するIRPに対して、特有のプライオリティを設定し、その特有のプライオリティが設定されたIRPをキューに記憶させる。そして、PDフィルタ５３は、キューに記憶されたIRPを、そのIRPに設定されたプライオリティにしたがって処理する。これにより、PDフィルタ５３は、例えば、AVアプリケーション３３からのIRP（AVアプリケーション３３からのアクセス要求に対応するIRP）を優先的に処理し、AVアプリケーション３３によるAVデータのリアルタイムでの読み書きを保証する。
【０１０６】
図６は、以上のような第１の機能を実装したPDフィルタ５３の構成例を示している。なお、図６においては、アプリケーション３１乃至３３も図示してある。
【０１０７】
Windows(R)のNT系のOSであるOS３０では、アプリケーションの実行は、プロセスと呼ばれる単位で行われる。さらに、プロセスの実行には、１以上のスレッドが割り当てられ、そのスレッドにおいて、プロセスが実行される。
【０１０８】
図６では、アプリケーション３１は、プロセス７１と７２の２つのプロセスから構成されている。そして、プロセス７１は、２つのスレッド７１Ａと７１Ｂで実行されており、プロセス７２は、１つのスレッド７２Ａで実行されている。
【０１０９】
また、アプリケーション３２は、１つのプロセス７３で構成されており、プロセス７３は、２つのスレッド７３Ａと７３Ｂで実行されている。
【０１１０】
さらに、AVアプリケーション３３は、プロセス７４と７５の２つのプロセスから構成されている。そして、プロセス７４は、２つのスレッド７４Ａと７４Ｂで実行されており、プロセス７５は、１つのスレッド７５Ａで実行されている。なお、プロセス７５は、PD_API４１のプロセスとなっている。
【０１１１】
Win32サブシステム５１に対するAPI関数の呼び出しは、スレッド単位で行うことができる。従って、図６の実施の形態では、API関数の呼び出しは、スレッド７１Ａ，７１Ｂ，７２Ａ，７３Ａ，７３Ｂ，７４Ａ，７４Ｂ，７５Ａそれぞれにおいて行うことができる。
【０１１２】
なお、スレッドからのAPI関数の呼び出しは、そのスレッドで実行されているプロセスからのAPI関数の呼び出しと捉えることができる。
【０１１３】
スレッド７１Ａ乃至７５Ａにおいて、API関数の呼び出しが行われると、そのAPI関数に対応するIRPが、NT入出力マネージャ５２からPDフィルタ５３に供給される。
【０１１４】
PDフィルタ５３では、フィルタコア５３Ａが、NT入出力マネージャ５２からのIRPに対して、光ディスク３へのアクセスに関する特有のプライオリティ（以下、適宜、IRPプライオリティという）を設定する。
【０１１５】
即ち、Windows(R)のNT系のOSであるOS３０は、プロセス、さらにはスレッドにプライオリティを設定し、そのプライオリティにしたがって、プロセスまたはスレッドを処理する、いわば標準的なプライオリティ機能を有する。この標準的なプライオリティ機能によれば、例えば、CPU１２や、RAM１４、その他のPC１の資源は、OS３０によって設定されたプライオリティが高いプロセスまたはスレッドに、優先的に割り当てられる。
【０１１６】
従って、OS３０の標準的なプライオリティ機能によって、例えば、AVアプリケーション３３のプロセス７４および７５に対して、アプリケーション３１のプロセス７１および７２、並びにアプリケーション３２のプロセス７３よりも高いプライオリティを設定することにより、AVアプリケーション３３は、アプリケーション３１および３２よりも優先的に、光ディスク３にアクセスすることが可能となる。
【０１１７】
しかしながら、OS３０の標準的なプライオリティ機能は、光ディスク３に対するアクセスの他、CPU１２の使用や、RAM１４へのアクセスなども影響を与える。
【０１１８】
従って、OS３０の標準的なプライオリティ機能によって、AVアプリケーション３３（のプロセス）のプライオリティを高く設定した場合には、OS３０が提供する重要なサービスのプロセスがCPU１２やRAM１４を使用するのに、長時間待たされることがある。これにより、サービスが停止したのと等価な状態となり、最悪の場合には、例えば、PC１がハングアップすることになる。
【０１１９】
そこで、PDフィルタ５３では、フィルタコア５３Ａが、NT入出力マネージャ５２からのIRPに対して、標準的なプライオリティ機能によるプライオリティとは独立した（関係のない）IRPプライオリティを設定する。
【０１２０】
IRPプライオリティは、光ディスク３に対するアクセスのプライオリティである。従って、AVアプリケーション３３（のプロセス）に対して、高いIRPプライオリティを設定した場合に、そのIRPプライオリティによって、OS３０が提供するサービスのプロセスを含む他のプロセスが制限されるのは、光ディスク３に対するアクセスだけであり、CPU１２やRAM１４の使用は制限されない。このため、IRPプライオリティによれば、OS３０が提供する重要なサービスが停止して、PC１がハングアップすることなどを防止することができる。
【０１２１】
PDフィルタ５３のフィルタコア５３Ａは、NT入出力マネージャ５２からのIRPに対して、IRPプライオリティを設定すると、そのIRPを、キュー８１Ａまたは８１Ｂに供給して記憶させる。即ち、キュー８１Ａと８１Ｂは、フィルタコア５３Ａから供給される、IRPプライオリティが設定されたIRPを記憶する。
【０１２２】
ここで、図６の実施の形態では、PDドライブであるドライブ２に、例えば、２つのボリューム(Volume)が存在するものとして、その２つのボリュームそれぞれに対するキューとして、２つのキュー８１Ａと８１Ｂが設けられている。PDフィルタ５３は、２つのボリュームのうちの、キュー８１Ａに対応するボリュームに対してのIRPを、キュー８１Ａに供給し、キュー８１Ｂに対応するボリュームに対してのIRPを、キュー８１Ｂに供給する。なお、以下、キュー８１Ａと８１Ｂとを特に区別する必要がない限り、単に、キュー８１と記述する
【０１２３】
PDフィルタ５３は、キュー８１に記憶されたIRPを、そのIRPに設定されたIRPプライオリティにしたがって処理する。即ち、PDフィルタ５３は、IRPプライオリティのより高いIRPを、キュー８１から優先的に読み出し、NT入出力マネージャ５２を介して、下位のレイヤのPD_FS５４に供給する。
【０１２４】
なお、PDフィルタ５３が、以上のような第１の機能（後述する第２および第３の機能についても同様）の処理を行うためのスレッドは、PDフィルタ５３のレイヤであるファイルシステムドライバのレイヤで作成する。IRPを記憶させるキュー８１も、ファイルシステムドライバのレイヤで作成する。
【０１２５】
PDフィルタ５３は、第１の機能により、AVアプリケーション３３からのIRPを、アプリケーション３１および３２からのIRPよりも優先的に処理するために、例えば、自身に登録されたプロセスID(ProcessID)のIRPには、最大のIRPプライオリティ（IRPプライオリティがとりうる値の最大値）を設定し、登録されていないプロセスIDのIRPには、最小のIRPプライオリティ（IRPプライオリティがとりうる値の最小値）を設定する。
【０１２６】
即ち、OS３０は、プロセスに対してユニークなプロセスIDを付して、各プロセスを管理するようになっており、各プロセスからのIRP（各プロセスが呼び出したAPI関数に対応するIRP）は、そのプロセスのプロセスIDを有している。そして、PDフィルタ５３は、NT入出力マネージャ５２から受信したあるプロセスからのIRPが有するプロセスIDが、自身に登録されたプロセスIDに一致する場合には、そのIRPに対して、最大のIRPプライオリティを設定し、一致しない場合（プロセスIDが登録されていない場合も含む）には、そのIRPに対して、最小のIRPプライオリティを設定する。
【０１２７】
ここで、IRPプライオリティを表すデータとしては、例えば、５ビットを採用することができる。この場合、最大のIRPプライオリティは３１となり、最小のIRPプライオリティは０となる。
【０１２８】
一方、AVアプリケーション３３で利用（ロード）されるPD_API４１は、PDフィルタ５３の第１の機能を利用するために、そのロード(load)時に、Win32サブシステム５１が提供するAPI関数DeviceIoControl()によって、AVアプリケーション３３のプロセス７４と７５のうちの、自身をロードするプロセス７５のプロセスIDの登録を要求する。即ち、PD_API４１は、AVアプリケーション３３が起動され、そのAVアプリケーション３３のプロセス７５によってロードされると、そのプロセス７５に割り当てられたプロセスIDの登録を、PDフィルタ５３に対して要求するAPI関数DeviceIoControl()を呼び出す。
【０１２９】
また、PD_API４１は、自身をロードしたプロセス７５の終了時に、そのプロセス７５に割り当てられたプロセスIDの削除（登録されたプロセスIDの削除）を、PDフィルタ５３に対して要求するAPI関数DeviceIoControl()を呼び出す。
【０１３０】
従って、PD_API４１のプロセス７５が存在する限りは、PDフィルタ５３において、そのプロセス７５からのIRP（プロセス７５（PD_API４１）が呼び出したWin３２サブシステム５１が提供するAPI関数に対応するIRP）に対しては、最大のIRPプライオリティが設定される。
【０１３１】
次に、図７は、PDフィルタ５３が第１の機能の処理を行うときに、PD_API４１が、PDフィルタ５３を制御するために、AVアプリケーション３３に提供する制御用（PDフィルタ５３の制御用）のAPI（関数）を示している。
【０１３２】
図７においては、PD_API４１が、PDフィルタ５３を制御するために、AVアプリケーション３３に提供する制御用のAPI関数として、PdGetPriority()と、PdSetPriority()とが用意されている。
【０１３３】
API関数PdGetPriority()とPdSetPriority()とは、いずれも、プロセスIDとIRPプライオリティとを、引数としてとる。
【０１３４】
そして、API関数PdGetPriority()は、引数のプロセスIDを指定して呼び出すことにより、引数で指定されているプロセスIDのプロセスに対してPDフィルタ５３が設定するIRPプライオリティを、その引数にセットして返す。さらに、API関数PdGetPriority()は、引数で指定されているプロセスIDのプロセスに対してPDフィルタ５３が設定するIRPプライオリティの取得に成功した場合、戻り値として１を返し、失敗した場合、戻り値として０を返す。
【０１３５】
従って、API関数PdGetPriority()によれば、任意のプロセスからのIRPに対して、PDフィルタ５３が設定するIRPプライオリティを認識することができる。
【０１３６】
API関数PdSetPriority()は、引数のプロセスIDとIRPプライオリティを指定して呼び出すことにより、引数で指定されているプロセスIDのプロセスに対してPDフィルタ５３が設定するIRPプライオリティを、その引数で指定されているIRPプライオリティに変更する。さらに、API関数PdSetPriority()は、PDフィルタ５３が設定するIRPプライオリティの変更に成功した場合、戻り値として１を返し、失敗した場合、戻り値として０を返す。
【０１３７】
従って、API関数PdSetPriority()によれば、例えば、PDフィルタ５３に登録されているプロセスIDと一致するプロセスID、または一致しないプロセスIDのプロセスからのIRPに対して、PDフィルタ５３が設定するIRPプライオリティを変更することができる。
【０１３８】
PD_API４１は、API関数PdGetPriority()が呼び出されると、PDフィルタ５３で設定されるIRPプライオリティを、PDフィルタ５３に対して要求するAPI関数DeviceIoControl()を呼び出す。
【０１３９】
また、PD_API４１は、API関数PdSetPriority()が呼び出されると、PDフィルタ５３で設定されるIRPプライオリティの変更を、PDフィルタ５３に対して要求するAPI関数DeviceIoControl()を呼び出す。
【０１４０】
以上のように、PD_API４１は、PDフィルタ５３の第１の機能を利用するために、プロセスIDの登録を要求するAPI関数DeviceIoControl()、およびプロセスIDの削除を要求するAPI関数DeviceIoControl()、さらには、必要に応じて、PDフィルタ５３で設定されるIRPプライオリティを要求するAPI関数DeviceIoControl()や、PDフィルタ５３で設定されるIRPプライオリティの変更を要求するAPI関数DeviceIoControl()を呼び出す。
【０１４１】
API関数DeviceIoControl()が呼び出されると、Win32サブシステム５１は、NT入出力マネージャ５２に対して、そのAPI関数DeviceIoControl()に応じた要求を行い、NT入出力マネージャ５２は、その要求を、IRP_MJ_DEVICE_CONTROLのIRPに変換し、PDフィルタ５３に供給する。
【０１４２】
このIRP_MJ_DEVICE_CONTROLのIRPでは、上述したように、ユーザ定義が可能なサブコードとしてのIOCTLが指定される。
【０１４３】
図８は、PDフィルタ５３が第１の機能の処理を行うときに、IRP_MJ_DEVICE_CONTROLで指定されるユーザ定義のIOCTLを示している。
【０１４４】
図８では、IOCTL_PD_SET_PROCESSID, IOCTL_PD_DELETE_PROCESSID, IOCTL_PD_SET_RRIORITY, IOCTL_PD_GET_RRIORITYの４つのIOCTLが、ユーザ定義のIOCTLとして用意されている。
【０１４５】
IOCTL_PD_SET_PROCESSIDは、プロセスIDの登録を要求するAPI関数DeviceIoControl()（に応じた要求）に対応するIRP_MJ_DEVICE_CONTROLのIRPのサブコードとなるIOCTLである。プロセスIDの登録を要求するAPI関数DeviceIoControl()は、例えば、その登録を要求するプロセスIDを、その引数としてとり、IOCTL_PD_SET_PROCESSIDは、その引数となっているプロセスIDのPDフィルタ５３への登録を要求するIOCTLである。
【０１４６】
IOCTL_PD_DELETE_PROCESSIDは、プロセスIDの削除を要求するAPI関数DeviceIoControl()に対応するIRP_MJ_DEVICE_CONTROLのIRPのサブコードとなるIOCTLである。プロセスIDの削除を要求するAPI関数DeviceIoControl()は、例えば、その削除を要求するプロセスIDを、その引数としてとり、IOCTL_PD_DELETE_PROCESSIDは、その引数となっているプロセスIDの、PDフィルタ５３からの削除を要求するIOCTLである。
【０１４７】
IOCTL_PD_SET_RRIORITYは、PDフィルタ５３で設定されるIRPプライオリティの変更を要求するAPI関数DeviceIoControl()に対応するIRP_MJ_DEVICE_CONTROLのIRPのサブコードとなるIOCTLで、PDフィルタ５３で設定されるIRPプライオリティの変更を要求するAPI関数DeviceIoControl()に対応する図７のAPI関数PdSetPriority()の引数となっているプロセスIDのIRPに設定するIRPプライオリティを、同じく、その引数となっているIRPプライオリティに変更することを要求するIOCTLである。
【０１４８】
IOCTL_PD_GET_RRIORITYは、PDフィルタ５３で設定されるIRPプライオリティを要求するAPI関数DeviceIoControl()に対応するIRP_MJ_DEVICE_CONTROLのIRPのサブコードとなるIOCTLで、PDフィルタ５３で設定されるIRPプライオリティを要求するAPI関数DeviceIoControl()に対応する図７のAPI関数PdGetPriority()の引数となっているプロセスIDのIRPに設定されるIRPプライオリティを要求するIOCTLである。
【０１４９】
なお、上述したような、IRP_MJ_DEVICE_CONTROLのIRPのサブコードとなるユーザ定義のIOCTLは、Win32サブシステム５１が提供するAPI関数DeviceIoControl()を利用して、Win32サブシステム５１からNT入出力マネージャ５２に渡され、NT入出力マネージャ５２において、IRP_MJ_DEVICE_CONTROLのIRPのサブコードとして指定される。
【０１５０】
次に、図９のフローチャートを参照して、PDフィルタ５３が第１の機能を実装している場合の、図６におけるAVアプリケーション３３、PD_API４１、およびPDフィルタ５３の処理の概要について説明する。
【０１５１】
AVアプリケーション３３が起動されると、AVアプリケーション３３は、ステップＳ２１において、AVアプリケーション３３のプロセス７４と７５のうちのプロセス７５によってPD_API４１をロードする。PD_API４１は、プロセス７５によってロードされると、ステップＳ３１において、自身をロードしたプロセス７５のプロセスIDの登録を要求するAPI関数DeviceIoControl()を呼び出し、このAPI関数DeviceIoControl()の呼び出しによって、プロセス７５のプロセスIDの登録を要求するIOCTL_PD_SET_PROCESSIDがIOCTLとして指定されているIRP_MJ_DEVICE_CONTROLのIRPが、NT入出力マネージャ５２からPDフィルタ５３に供給される。
【０１５２】
PDフィルタ５３は、ステップＳ４１において、NT入出力マネージャ５２からのIRPを受信し、そのIRPのIOCTL_PD_SET_PROCESSIDにしたがい、PD_API４１のプロセス７５のプロセスIDを登録する。
【０１５３】
従って、この後は、PDフィルタ５３において、PD_API４１のプロセス７５のプロセスIDが削除されない限り、そのプロセス７５からのIRPには、最大のIRPプライオリティが設定され、他のプロセスからのIRPには、最小のIRPプライオリティが設定される。これにより、PDフィルタ５３では、PD_API４１のプロセス７５からのIRPが優先的に（最優先で）処理される。
【０１５４】
即ち、例えば、AVアプリケーション３３が、ステップＳ２２において、光ディスク３に対するアクセス要求としての、例えば、ファイルの読み出しを要求するAPI関数ReadFile()などを呼び出すと、PD_API４１は、ステップＳ３２において、そのAPI関数ReadFile()の呼び出しを受信し、ステップＳ３３に進む。
【０１５５】
ステップＳ３３では、PD_API４１は、AVアプリケーション３３からのAPI関数ReadFile()の呼び出しに応じて、同一のAPI関数ReadFile()（Win３２サブシステム５１が提供するAPI関数ReadFile()）を呼び出し、この呼び出しによって、ファイルの読み出しを要求するIRP_MJ_READのIRPが、NT入出力マネージャ５２からPDフィルタ５３に供給される。
【０１５６】
PDフィルタ５３は、ステップＳ４２において、NT入出力マネージャ５２からのIRP_MJ_READのIRPを受信し、そのIRP_MJ_READのIRPに対して、IRPプライオリティを設定する。
【０１５７】
即ち、いまの場合、PDフィルタ５３が受信したIRP_MJ_READのIRPは、PD_API４１（のプロセス７５）からのものである。また、ステップＳ４１において、PDフィルタ５３には、PD_API４１のプロセス７５のプロセスIDが登録されている。従って、ステップＳ４２においてPDフィルタ５３が、PD_API４１のプロセス７５から受信したIRP_MJ_READのIRPには、最大のIRPプライオリティが設定される。
【０１５８】
その結果、PDフィルタ５３では、PD_API４１のプロセス７５からのIRP_MJ_READのIRPが、他に、最大のIRPプライオリティが設定されているIRPが存在しない限り、即座に処理される。
【０１５９】
即ち、PDフィルタ５３では、ステップＳ４３において、PD_API４１のプロセス７５からのIRP_MJ_READのIRPが、優先的に、PD_FS５４に供給される。
【０１６０】
その後、AVアプリケーション３３が、例えば終了等されると、ステップＳ２３において、AVアプリケーション３３は、PD_API４１（のプロセス７５）に対してアンロードを要求する。
【０１６１】
PD_API４１は、アンロードの要求があると、ステップＳ３４において、自身のプロセス７５のプロセスIDの削除を要求するAPI関数DeviceIoControl()を呼び出し、このAPI関数DeviceIoControl()の呼び出しによって、プロセス７５のプロセスIDの削除を要求するIOCTL_PD_DELETE_PROCESSIDがIOCTLとして指定されているIRP_MJ_DEVICE_CONTROLのIRPが、NT入出力マネージャ５２からPDフィルタ５３に供給される。
【０１６２】
PDフィルタ５３は、ステップＳ４４において、NT入出力マネージャ５２からのIRPを受信し、そのIRPのIOCTL_PD_DELETE_PROCESSIDにしたがい、PD_API４１のプロセス７５のプロセスIDを削除する。
【０１６３】
従って、この後は、PDフィルタ５３において、IRPは、OS３０の標準的なプライオリティ機能によって設定されるプライオリティにしたがって処理される。
【０１６４】
次に、図１０および図１１のフローチャートを参照して、図６のPDフィルタ５３による第１の機能の処理について説明する。
【０１６５】
まず、図１０のフローチャートを参照して、第１の機能を実装する図６のPDフィルタ５３において、IRPが受信されてから、そのIRPがキュー８１に記憶されるまでの処理（キュー８１への入力処理）について説明する。
【０１６６】
アプリケーション３１乃至３３のうちのいずれかのプロセス（図６では、プロセス７１乃至７５のうちのいずれか）において、ドライブ２に対するI/O関係の処理を要求する（I/O要求を行う）API関数が呼び出されると、そのAPI関数の呼び出し（によってWin３２サブシステム５１が出力する要求）に応じて、NT入出力マネージャ５２は、そのAPI関数に対応するIRPを、PDフィルタ５３に供給する。
【０１６７】
PDフィルタ５３では、フィルタコア５３Ａが、ステップＳ５１において、API関数を呼び出したプロセスからのIRP（プロセスによるAPI関数の呼び出しに応じて、NT入出力マネージャ５２から供給されたIRP）を受信して、ステップＳ５２に進み、そのIRPが、IOCTLとして、IOCTL_PD_SET_PROCESSID（図８）が指定されているIRP(IRP_MJ_DEVICE_CONTROLのIRP)であるかどうかを判定する。
【０１６８】
ステップＳ５２において、プロセスからのIRP（ステップＳ５１でフィルタコア５３Ａが受信したIRP）が、IOCTL_PD_SET_PROCESSIDが指定されているIRPであると判定された場合、ステップＳ５３に進み、フィルタコア５３Ａは、そのIRPに含まれるプロセスID、つまり、そのIRPに対応するAPI関数を呼び出したプロセスのプロセスIDを登録（記憶）し、ステップＳ５１に戻る。
【０１６９】
即ち、IOCTL_PD_SET_PROCESSIDが指定されているIRPには、そのIRPに対応するAPI関数を呼び出したプロセスのプロセスIDが含まれており、フィルタコア５３Ａは、そのプロセスIDを登録する。ここで、フィルタコア５３Ａにおいて登録されたプロセスIDを、以下、適宜、登録プロセスIDという。
【０１７０】
一方、ステップＳ５２において、プロセスからのIRPが、IOCTL_PD_SET_PROCESSIDが指定されているIRPでないと判定された場合、ステップＳ５４に進み、フィルタコア５３Ａは、そのIRPが、IOCTLとして、IOCTL_PD_DELETE_PROCESSID（図８）が指定されているIRP(IRP_MJ_DEVICE_CONTROLのIRP)であるかどうかを判定する。
【０１７１】
ステップＳ５４において、プロセスからのIRPが、IOCTL_PD_DELETE_PROCESSIDが指定されているIRPであると判定された場合、ステップＳ５５に進み、フィルタコア５３Ａは、登録プロセスIDを削除（消去）し、ステップＳ５１に戻る。
【０１７２】
また、ステップＳ５４において、プロセスからのIRPが、IOCTL_PD_DELETE_PROCESSIDが指定されているIRPでないと判定された場合、ステップＳ５６に進み、フィルタコア５３Ａは、そのIRPが、光ディスク３へのアクセスを要求するアクセス要求のIRPであるかどうかを判定する。
【０１７３】
ステップＳ５６において、プロセスからのIRPが、アクセス要求のIRPでないと判定された場合、即ち、プロセスからのIRPが、例えば、PDフィルタ５３で設定されるIRPプライオリティの変更を要求するIOCTL_PD_SET_RRIORITY（図８）が、IOCTLとして指定されているIRP_MJ_DEVICE_CONTROLのIRPや、PDフィルタ５３で設定されるIRPプライオリティを要求するIOCTL_PD_GET_RRIORITY（図８）が、IOCTLとして指定されているIRP_MJ_DEVICE_CONTROLのIRPなどである場合、ステップＳ５７に進み、フィルタコア５３Ａは、そのIRPに応じた処理を行い、その処理結果に対応する応答を、NT入出力マネージャ５２およびWin32サブシステム５１を介して、IRPに対応するAPI関数を呼び出したプロセスに返し、ステップＳ５１に戻る。
【０１７４】
ここで、ステップＳ５７では、例えば、プロセスからのIRPが、IOCTL_PD_SET_RRIORITY（図８）が指定されているIRPである場合、フィルタコア５３Ａは、そのIOCTL_PD_SET_RRIORITYで指定されているプロセスIDのプロセスからのIRPに設定するIRPプライオリティを、同じくIOCTL_PD_SET_RRIORITYで指定されているIRPプライオリティに変更する処理を行う。また、ステップＳ５７では、例えば、プロセスからのIRPが、IOCTL_PD_GET_RRIORITY（図８）が指定されているIRPである場合、フィルタコア５３Ａは、そのIOCTL_PD_GET_RRIORITYで指定されているプロセスIDのプロセスからのIRPに設定するIRPプライオリティを、応答として返す。
【０１７５】
一方、ステップＳ５６において、プロセスからのIRPが、アクセス要求のIRPであると判定された場合、即ち、プロセスからのIRPが、例えば、ファイルの読み出しを要求するIRP_MJ_READのIRPや、ファイルの書き込みを要求するIRP_MJ_WRITEのIRPである場合、ステップＳ５８に進み、フィルタコア５３Ａは、プロセスからのIRPに含まれるプロセスID、即ち、そのIRPに対応するAPI関数を呼び出したプロセスのプロセスIDが、登録プロセスIDに一致するかどうかを判定する。
【０１７６】
ステップＳ５８において、プロセスからのIRPに含まれるプロセスIDが、登録プロセスIDに一致しないと判定された場合、ステップＳ５９に進み、フィルタコア５３Ａは、プロセスからのIRPに対して、最小のIRPプライオリティ（IRPプライオリティが取り得る値のうちの最小値）を設定（セット）し、ステップＳ６１に進む。
【０１７７】
また、ステップＳ５８において、プロセスからのIRPに含まれるプロセスIDが、登録プロセスIDに一致すると判定された場合、ステップＳ６０に進み、フィルタコア５３Ａは、プロセスからのIRPに対して、最大のIRPプライオリティ（IRPプライオリティが取り得る値のうちの最大値）を設定し、ステップＳ６１に進む。
【０１７８】
ステップＳ６１では、フィルタコア５３Ａは、ステップＳ５９またはＳ６０でIRPプライオリティを設定した、プロセスからのIRPを、キュー８１へ出力して記憶させ（キューイングし）、次のIRPが供給されるのを待って、ステップＳ５１に戻る。
【０１７９】
なお、図１０では、プロセスからのIRPに含まれるプロセスIDが、登録プロセスIDに一致しない場合、そのプロセスからのIRPに対して、最小のIRPプライオリティを設定し、プロセスからのIRPに含まれるプロセスIDが、登録プロセスIDに一致する場合、そのプロセスからのIRPに対して、最大のIRPプライオリティを設定するようにしたが、登録プロセスIDに一致しないプロセスIDのIRP、または登録プロセスIDに一致するプロセスIDのIRPに対して設定するIRPプライオリティは、その他の値のIRPプライオリティとすることができる。
【０１８０】
また、登録プロセスIDに一致するプロセスIDのIRPなどの、あるプロセスIDのIRPに対して設定するIRPプライオリティは、例えば、図７で説明したAPI関数PdSetPriority()によって指定することが可能である。
【０１８１】
さらに、登録プロセスIDとしては、１つのプロセスIDだけではなく、複数のプロセスIDを登録することが可能である。この場合、複数の登録プロセスIDそれぞれに対して、固有のIRPプライオリティを対応付け、ある登録プロセスIDに一致するプロセスIDのIRPには、その登録プロセスIDに対応付けられた固有のIRPプライオリティを設定するようにすることが可能である。
【０１８２】
次に、図１１のフローチャートを参照して、第１の機能を実装する図６のPDフィルタ５３において、キュー８１に記憶されたIRPを対象に行われる処理（キュー８１からの出力処理）について説明する。
【０１８３】
PDフィルタ５３では、フィルタコア５３Ａが、ステップＳ７１において、キュー８１に記憶されたIRPから、IRPプライオリティが最も高い（最も大きい）ものを検索し、ステップＳ７２に進む。
【０１８４】
ステップＳ７２では、フィルタコア５３Ａは、ステップＳ７１の検索によって得られたIRPプライオリティが最も高いIRPを処理し、ステップＳ７１に戻る。即ち、ステップＳ７２では、フィルタコア５３Ａは、IRPプライオリティが最も高いIRPを、優先的に、キュー８１から読み出し、NT入出力マネージャ５２を介して、PD_FS５４に出力する。
【０１８５】
なお、ステップＳ７１の検索によって、複数のIRPが、IRPプライオリティが最も高いIRPとして得られた場合、フィルタコア５３Ａは、その複数のIRPを、例えば、OS３０の標準的なプライオリティ機能や、IRPがキュー８１に記憶された記憶時刻などにしたがって処理する。即ち、フィルタコア５３Ａは、例えば、標準的なプライオリティ機能によるプライオリティが高いプロセスからのIRPや、記憶時刻が早いIRPなどから、優先的に、キュー８１から読み出し、PD_FS５４に出力する。
【０１８６】
以上のように、PDフィルタ５３では、IRPに対して、OS３０の標準的なプライオリティ機能によるプライオリティとは別のIRPプライオリティを設定する。具体的には、登録プロセスIDと一致するプロセスIDのプロセスからのIRPには、最大のIRPプライオリティを設定し、登録プロセスIDと一致しないプロセスIDのプロセスからのIRPには、最小のIRPプライオリティを設定する。
【０１８７】
そして、PDフィルタ５３は、IRPプライオリティが設定されたIRPを、キュー８１に記憶させ、さらに、キュー８１に記憶されたIRPを、IRPプライオリティにしたがって処理する。
【０１８８】
一方、AVアプリケーション３３（図６）では、そのプロセス７５によってPD_APL４１がロードされると、PD_APL４１が、そのプロセス７５のプロセスIDの登録を、PDフィルタ５３に要求し、PDフィルタ５３は、その要求に応じて、PD_APL４１のプロセス７５のプロセスIDを登録する。
【０１８９】
そして、AVアプリケーション３３は、PD_APL４１のプロセス７５から、光ディスク３へのアクセス要求を行う。
【０１９０】
従って、PDフィルタ５３では、AVアプリケーション３３による光ディスク３へのアクセス要求としてのIRPが、他のアプリケーション３１や３２（のプロセス）からのIRPよりも優先的に処理されるので、アプリケーション３１や３２からのIRPの処理を待つことや、そのIRPの処理によって生じるドライブ２のシーク等によって、AVアプリケーション３３による光ディスク３に対するデータの読み書きが妨げられることを防止（低減）することができる。これにより、AVアプリケーション３３において、AVデータを、リアルタイムで光ディスク３に記録し、また再生することができる。
【０１９１】
なお、AVデータを、リアルタイムで光ディスク３に記録し、また再生するには、最低限、AVアプリケーション３３において、AVデータの記録と再生が行われている間、そのAVアプリケーション３３による光ディスク３へのアクセス要求としてのIRPが、優先的に処理されれば良い。
【０１９２】
一方、上述の実施の形態では、図９で説明したように、PDフィルタ５３において、PD_APL４１がロードされている間だけ、AVアプリケーション３３による光ディスク３へのアクセス要求としてのIRPが、優先的に処理される。
【０１９３】
従って、PD_APL４１は、図９で説明したように、AVアプリケーション３３の起動時にロードし、その終了時にアンロードする他、例えば、AVアプリケーション３３において、AVデータの記録または再生が行われるときにロードし、その記録または再生が停止されたときにアンロードするようにしても良い。
【０１９４】
次に、AVデータをリアルタイムで読み書きすることを保証するためのPDフィルタ５３の第２の機能について説明する。
【０１９５】
即ち、第２の機能によれば、PDフィルタ５３は、アプリケーション３１乃至３３からの、光ディスク３に対するアクセス要求に対応するIRPの処理の許可または不許可を表すポーズフラグ（許可情報）を設定する一方、アプリケーション３１乃至３３からのIRPをキュー８１に記憶させる。そして、PDフィルタ５３は、キュー８１に記憶されたIRPを、ポーズフラグにしたがって処理する。これにより、PDフィルタ５３は、例えば、AVアプリケーション３３以外のアプリケーションからのIRPの処理を停止して、AVアプリケーション３３からのIRP（AVアプリケーション３３からのアクセス要求に対応するIRP）だけを処理し、AVアプリケーション３３によるAVデータのリアルタイムでの読み書きを保証する。
【０１９６】
即ち、第２の機能を実装したPDフィルタ５３は、ポーズフラグによって、特定のIRPのみを処理して、他のIRPの処理を停止する状態であるポーズ(Pause)状態と、すべてのIRPを処理する状態であるラン(Run)状態とのうちのいずれか一方の状態となる。
【０１９７】
以上のような第２の機能を実装したPDフィルタ５３は、例えば、図６に示したように構成される。
【０１９８】
但し、第２の機能を実装したPDフィルタ５３（図６）では、フィルタコア５３Ａにおいて、プロセスIDの登録と、IRPに対するIRPプライオリティの設定の他、ポーズフラグの設定が行われる。さらに、第２の機能を実装したPDフィルタ５３では、フィルタコア５３Ａにおいて、キュー８１に記憶されたIRPが、IRPプライオリティの他、ポーズフラグにしたがって処理される。
【０１９９】
AVアプリケーション３３で利用されるPD_API４１は、PDフィルタ５３の第２の機能を利用するために、PDフィルタ５３の状態をポーズ状態またはラン状態にする、PDフィルタ５３の制御用のAPI（関数）を、AVアプリケーション３３に提供する。
【０２００】
図１２は、PDフィルタ５３が第２の機能の処理を行うときに、PD_API４１が、PDフィルタ５３を制御するために、AVアプリケーション３３に提供する制御用（PDフィルタ５３の制御用）のAPI関数を示している。
【０２０１】
なお、図１２には、いままで説明したPDフィルタ５３の制御用のAPI関数を除くAPI関数（はじめて説明するAPI関数）を示してある。
【０２０２】
図１２においては、PD_API４１が、PDフィルタ５３を制御するために、AVアプリケーション３３に提供する制御用のAPI関数として、PdPauseOtherAppIrp()と、PdRunOtherAppIrp()とが用意されている。
【０２０３】
API関数PdPauseOtherAppIrp()によれば、PDフィルタ５３が、特定のIRPのみを処理し、他のIRPの処理を停止するポーズ状態となる。一方、API関数PdRunOtherAppIrp()によれば、PDフィルタ５３が、すべてのIRPを処理するラン状態となる。
【０２０４】
なお、API関数PdPauseOtherAppIrp()とPdRunOtherAppIrp()とは、いずれも、ボリュームを特定するためのボリュームネームを、引数としてとる。
【０２０５】
そして、API関数PdPauseOtherAppIrp()が、引数のボリュームネームを指定して呼び出されることにより、PDフィルタ５３は、その引数で指定されているボリュームネームによって特定されるボリュームに対するアクセス要求に対応するIRPのうち、特定のIRPのみを処理し、他のIRPの処理を停止するポーズ状態となる。
【０２０６】
また、API関数PdRunOtherAppIrp()が、引数のボリュームネームを指定して呼び出されることにより、PDフィルタ５３は、その引数で指定されているボリュームネームによって特定されるボリュームに対するアクセス要求に対応するIRPをすべて処理する（処理対象とする）ラン状態となる。
【０２０７】
従って、PDフィルタ５３をポーズ状態またはラン状態とすることは、ボリュームごとに、即ち、ボリュームに対応するキューごとに行うことができる。例えば、図６のPDフィルタ５３においては、キュー８１Ａと８１Ｂそれぞれについて独立に、ポーズ状態またはラン状態を設定することができる。
【０２０８】
但し、以下では、説明を簡単にするために、キュー８１Ａと８１Ｂの両方について、ポーズ状態またはラン状態が設定されるものとする。
【０２０９】
なお、API関数PdPauseOtherAppIrp()は、PDフィルタ５３をポーズ状態とすることに成功した場合、戻り値として１を返し、失敗した場合、戻り値として０を返す。同様に、API関数PdRunOtherAppIrp()も、PDフィルタ５３をラン状態とすることに成功した場合、戻り値として１を返し、失敗した場合、戻り値として０を返す。
【０２１０】
PD_API４１は、API関数PdPauseOtherAppIrp()が呼び出されると、ポーズ状態となることを、PDフィルタ５３に対して要求するAPI関数DeviceIoControl()を呼び出す。
【０２１１】
また、PD_API４１は、API関数PdRunOtherAppIrp()が呼び出されると、ラン状態となることを、PDフィルタ５３に対して要求するAPI関数DeviceIoControl()を呼び出す。
【０２１２】
API関数DeviceIoControl()が呼び出されると、Win32サブシステム５１は、NT入出力マネージャ５２に対して、そのAPI関数DeviceIoControl()に応じた要求を行い、NT入出力マネージャ５２は、その要求を、IRP_MJ_DEVICE_CONTROLのIRPに変換し、PDフィルタ５３に供給する。
【０２１３】
IRP_MJ_DEVICE_CONTROLでは、上述したように、ユーザ定義が可能なサブコードとしてのIOCTLが指定される。
【０２１４】
図１３は、PDフィルタ５３が第２の機能の処理を行うときに、IRP_MJ_DEVICE_CONTROLで指定されるユーザ定義のIOCTLを示している。
【０２１５】
なお、図１３には、図１２と同様に、いままで説明したユーザ定義のIOCTLを除くIOCTL（はじめて説明するユーザ定義のIOCTL）を示してある。
【０２１６】
図１３では、IOCTL_PD_PAUSE_OTHERAPPIRP, IOCTL_PD_RUN_OTHERAPPIRPの２つのIOCTLが、ユーザ定義のIOCTLとして用意されている。
【０２１７】
IOCTL_PD_PAUSE_OTHERAPPIRPは、ポーズ状態となることを要求するAPI関数DeviceIoControl()（に応じた要求）に対応するIRP_MJ_DEVICE_CONTROLのIRPのサブコードとなるIOCTLで、PDフィルタ５３をポーズ状態とすることを要求するIOCTLである。
【０２１８】
IOCTL_PD_RUN_OTHERAPPIRPは、ラン状態となることを要求するAPI関数DeviceIoControl()に対応するIRP_MJ_DEVICE_CONTROLのIRPのサブコードとなるIOCTLで、PDフィルタ５３をラン状態とすることを要求するIOCTLである。
【０２１９】
なお、上述したように、IRP_MJ_DEVICE_CONTROLのIRPのサブコードとなるユーザ定義のIOCTLは、Win32サブシステム５１が提供するAPI関数DeviceIoControl()を利用して、Win32サブシステム５１からNT入出力マネージャ５２に渡され、NT入出力マネージャ５２において、IRP_MJ_DEVICE_CONTROLのIRPのサブコードとして指定される。
【０２２０】
次に、図１４のフローチャートを参照して、PDフィルタ５３が第２の機能を実装している場合の、図６におけるAVアプリケーション３３、PD_API４１、およびPDフィルタ５３の処理の概要について説明する。
【０２２１】
AVアプリケーション３３は、例えば、ユーザが入力部１７（図２）を操作することによって、光ディスク３に記録されたAVデータの再生や、光ディスク３へのAVデータの記録などが要求されると、ステップＳ９１において、API関数PdPauseOtherAppIrp()を呼び出す。
【０２２２】
PD_API４１は、ステップＳ１０１において、AVアプリケーション３３によるAPI関数PdPauseOtherAppIrp()の呼び出しを受信して、ステップＳ１０２に進み、そのAPI関数PdPauseOtherAppIrp()の呼び出しに応じて、ポーズ状態となることを要求するAPI関数DeviceIoControl()を呼び出す。このAPI関数DeviceIoControl()の呼び出しによって、ポーズ状態となることを要求するIOCTL_PD_PAUSE_OTHERAPPIRPがIOCTLとして指定されているIRP_MJ_DEVICE_CONTROLのIRPが、NT入出力マネージャ５２からPDフィルタ５３に供給される。
【０２２３】
PDフィルタ５３は、ステップＳ１１１において、NT入出力マネージャ５２からのIRPを受信し、そのIRPのIOCTL_PD_PAUSE_OTHERAPPIRPにしたがい、ポーズフラグを、ポーズ状態を表す、例えば、１にセットし、これにより、ポーズ状態となる。
【０２２４】
PDフィルタ５３は、ポーズ状態となっている間、PD_API４１のプロセス７５（図６）以外のプロセスからのIRPの処理を停止し、PD_API４１のプロセス７５からのIRPのみを処理する。
【０２２５】
即ち、例えば、AVアプリケーション３３が、ステップＳ９２において、光ディスク３に対するアクセス要求としての、例えば、ファイルの読み出しを要求するAPI関数ReadFile()などを呼び出すと、PD_API４１は、ステップＳ１０３において、そのAPI関数ReadFile()の呼び出しを受信し、ステップＳ１０４に進む。
【０２２６】
ステップＳ１０４では、PD_API４１は、AVアプリケーション３３からのAPI関数ReadFile()の呼び出しに応じて、同一のAPI関数ReadFile()を呼び出し、この呼び出しによって、ファイルの読み出しを要求するIRP_MJ_READのIRPが、NT入出力マネージャ５２からPDフィルタ５３に供給される。
【０２２７】
PDフィルタ５３は、ステップＳ１１２において、NT入出力マネージャ５２からのIRP_MJ_READのIRPを受信して、ステップＳ１１３に進む。ステップＳ１１３では、PDフィルタ５３は、ステップＳ１１２で受信したIRP、即ち、AVアプリケーション３３におけるPD_API４１のプロセス７５からのIRPを、キュー８１（図６）に記憶させ、さらに、キュー８１から読み出し、PD_FS５４に供給する。
【０２２８】
以上のように、PDフィルタ５３では、AVアプリケーション３３のプロセス７５からのIRPは、即座に処理される。
【０２２９】
一方、AVアプリケーション３３以外のアプリケーション３１や３２のプロセス７１乃至７３が、それぞれ、ステップＳ８１乃至Ｓ８３において、光ディスク３に対するアクセス要求としての、例えば、ファイルの読み出しを要求するAPI関数ReadFile()などを呼び出すと、この呼び出しによって、ファイルの読み出しを要求するIRP_MJ_READのIRPが、NT入出力マネージャ５２からPDフィルタ５３に供給される。
【０２３０】
PDフィルタ５３は、ステップＳ１１４乃至Ｓ１１６において、それぞれ、プロセス７１乃至７３がステップＳ８１乃至Ｓ８３で行ったAPI関数ReadFile()の呼び出しに対応するIRPを受信し、キュー８１に記憶させる。
【０２３１】
そして、いまの場合、PDフィルタ５３はポーズ状態となっているので、PDフィルタ５３は、ステップＳ１１４乃至Ｓ１１６でキュー８１に記憶させたIRP、即ち、AVアプリケーション３３のプロセス７５以外のプロセスであるプロセス７１乃至７３からのIRPを処理しない。つまり、PDフィルタ５３では、アプリケーション３１のプロセス７１および７２や、アプリケーション３２のプロセス７３からのIRPは、PD_FS５４に供給されず、キュー８１に記憶されたままとされる。
【０２３２】
その後、例えば、ユーザが入力部１７（図２）を操作することによって、光ディスク３に記録されたAVデータの再生などの停止、あるいは、AVアプリケーション３３の終了などが要求されると、AVアプリケーション３３は、ステップＳ９３において、API関数PdRunOtherAppIrp()を呼び出す。
【０２３３】
PD_API４１は、ステップＳ１０５において、AVアプリケーション３３によるAPI関数PdRunOtherAppIrp()の呼び出しを受信して、ステップＳ１０６に進み、そのAPI関数PdRunOtherAppIrp()の呼び出しに応じて、ラン状態となることを要求するAPI関数DeviceIoControl()を呼び出す。このAPI関数DeviceIoControl()の呼び出しによって、ラン状態となることを要求するIOCTL_PD_RUN_OTHERAPPIRPがIOCTLとして指定されているIRP_MJ_DEVICE_CONTROLのIRPが、NT入出力マネージャ５２からPDフィルタ５３に供給される。
【０２３４】
PDフィルタ５３は、ステップＳ１１７において、NT入出力マネージャ５２からのIRPを受信し、そのIRPのIOCTL_PD_RUN_OTHERAPPIRPにしたがい、ポーズフラグを、ラン状態を表す、例えば、０にリセットし、これにより、ラン状態となる。
【０２３５】
PDフィルタ５３は、ラン状態となると、PD_API４１のプロセス７５（図６）以外のプロセスからのIRPの処理を開始（再開）する。
【０２３６】
即ち、いまの場合、PDフィルタ５３では、ステップＳ１１４乃至Ｓ１１６で受信したプロセス７１乃至７３それぞれからのIRPが、処理されずにキュー８１に記憶されたままとなっている。
【０２３７】
そこで、PDフィルタ５３は、ステップＳ１１８乃至Ｓ１２０において、それぞれ、キュー８１に記憶されたままとなっていたプロセス７１乃至７３からのIRPを、キュー８１から読み出し、PD_FS５４に供給する。
【０２３８】
そして、その後、AVアプリケーション３３以外のアプリケーション３１や３２のプロセス７１乃至７３のうちのいずれかが、ステップＳ８４において、光ディスク３に対するアクセス要求としての、例えば、ファイルの読み出しを要求するAPI関数ReadFile()などを呼び出すと、この呼び出しによって、ファイルの読み出しを要求するIRP_MJ_READのIRPが、NT入出力マネージャ５２からPDフィルタ５３に供給される。
【０２３９】
PDフィルタ５３は、ステップＳ１２１において、プロセス７１乃至７３のうちのいずれかがステップＳ８４で行ったAPI関数ReadFile()の呼び出しに対応するIRPを受信し、キュー８１に記憶させる。
【０２４０】
そして、いまの場合、PDフィルタ５３はラン状態になっているので、PDフィルタ５３では、ステップＳ１２１でキュー８１に記憶されたIRPが、ステップＳ１２２において読み出され、PD_FS５４に供給される。
【０２４１】
以上のように、PDフィルタ５３は、ポーズ状態では、AVアプリケーション３３からのIRPのみを、PD_FS５４に出力する。そして、PDフィルタ５３は、ポーズ状態が解除されると、即ち、ラン状態となると、AVアプリケーション３３以外のアプリケーションからのIRPも、PD_FS５４に出力する。
【０２４２】
次に、図１５および図１６のフローチャートを参照して、図６のPDフィルタ５３による第２の機能の処理について説明する。
【０２４３】
まず、図１５のフローチャートを参照して、第２の機能を実装する図６のPDフィルタ５３において、IRPが受信されてから、そのIRPがキュー８１に記憶されるまでの処理（キュー８１への入力処理）について説明する。
【０２４４】
図１５のフローチャートにしたがった処理によれば、ポーズフラグの設定に関するステップＳ１５６乃至Ｓ１５９の処理を除き、図１０のフローチャートで説明したのと同様の処理が行われる。
【０２４５】
即ち、アプリケーション３１乃至３３のうちのいずれかのプロセス（図６では、プロセス７１乃至７５のうちのいずれか）において、ドライブ２に対するI/O関係の処理を要求する（I/O要求を行う）API関数が呼び出されると、そのAPI関数の呼び出しに応じて、NT入出力マネージャ５２は、そのAPI関数に対応するIRPを、PDフィルタ５３に供給する。
【０２４６】
PDフィルタ５３では、フィルタコア５３Ａが、ステップＳ１５１において、API関数を呼び出したプロセスからのIRP（プロセスによるAPI関数の呼び出しに応じて、NT入出力マネージャ５２から供給されたIRP）を受信して、ステップＳ１５２に進み、そのIRPが、IOCTLとして、IOCTL_PD_SET_PROCESSID（図８）が指定されているIRP(IRP_MJ_DEVICE_CONTROLのIRP)であるかどうかを判定する。
【０２４７】
ステップＳ１５２において、プロセスからのIRP（ステップＳ１５１でフィルタコア５３Ａが受信したIRP）が、IOCTL_PD_SET_PROCESSIDが指定されているIRPであると判定された場合、ステップＳ１５３に進み、フィルタコア５３Ａは、そのIRPに含まれるプロセスID、つまり、そのIRPに対応するAPI関数を呼び出したプロセスのプロセスIDを登録（記憶）し、次のIRPの供給を待って、ステップＳ１５１に戻る。
【０２４８】
即ち、ステップＳ１５３では、ステップＳ１５１でフィルタコア５３Ａが受信したIRPに対応するAPI関数を呼び出したプロセスのプロセスIDが、登録プロセスIDとされる。
【０２４９】
一方、ステップＳ１５２において、プロセスからのIRPが、IOCTL_PD_SET_PROCESSIDが指定されているIRPでないと判定された場合、ステップＳ１５４に進み、フィルタコア５３Ａは、そのIRPが、IOCTLとして、IOCTL_PD_DELETE_PROCESSID（図８）が指定されているIRP(IRP_MJ_DEVICE_CONTROLのIRP)であるかどうかを判定する。
【０２５０】
ステップＳ１５４において、プロセスからのIRPが、IOCTL_PD_DELETE_PROCESSIDが指定されているIRPであると判定された場合、ステップＳ１５５に進み、フィルタコア５３Ａは、登録プロセスIDを削除（消去）し、次のIRPの供給を待って、ステップＳ１５１に戻る。
【０２５１】
また、ステップＳ１５４において、プロセスからのIRPが、IOCTL_PD_DELETE_PROCESSIDが指定されているIRPでないと判定された場合、ステップＳ１５６に進み、フィルタコア５３Ａは、プロセスからのIRPが、IOCTLとして、IOCTL_PD_PAUSE_OTHERAPPIRP（図１３）が指定されているIRP(IRP_MJ_DEVICE_CONTROLのIRP)であるかどうかを判定する。
【０２５２】
ステップＳ１５６において、プロセスからのIRPが、IOCTL_PD_PAUSE_OTHERAPPIRPが指定されているIRPであると判定された場合、ステップＳ１５７に進み、フィルタコア５３Ａは、変数であるポーズフラグを、ポーズ状態を表す１にセットし、次のIRPの供給を待って、ステップＳ１５１に戻る。これにより、フィルタコア５３Ａ（PDフィルタ５３）は、ポーズ状態となる。
【０２５３】
また、ステップＳ１５６において、プロセスからのIRPが、IOCTL_PD_PAUSE_OTHERAPPIRPが指定されているIRPでないと判定された場合、ステップＳ１５８に進み、フィルタコア５３Ａは、プロセスからのIRPが、IOCTLとして、IOCTL_PD_RUN_OTHERAPPIRP（図１３）が指定されているIRP(IRP_MJ_DEVICE_CONTROLのIRP)であるかどうかを判定する。
【０２５４】
ステップＳ１５８において、プロセスからのIRPが、IOCTL_PD_RUN_OTHERAPPIRPが指定されているIRPであると判定された場合、ステップＳ１５９に進み、フィルタコア５３Ａは、変数であるポーズフラグを、ラン状態を表す０にリセットし、次のIRPが供給されるのを待って、ステップＳ１５１に戻る。これにより、フィルタコア５３Ａは、ラン状態となる。
【０２５５】
また、ステップＳ１５８において、プロセスからのIRPが、IOCTL_PD_RUN_OTHERAPPIRPが指定されているIRPでないと判定された場合、ステップＳ１６０に進み、フィルタコア５３Ａは、そのIRPが、光ディスク３へのアクセスを要求するアクセス要求のIRPであるかどうかを判定する。
【０２５６】
ステップＳ１６０において、プロセスからのIRPが、アクセス要求のIRPでないと判定された場合、即ち、プロセスからのIRPが、例えば、PDフィルタ５３で設定されるIRPプライオリティの変更を要求するIOCTL_PD_SET_RRIORITY（図８）が、IOCTLとして指定されているIRP_MJ_DEVICE_CONTROLのIRPや、PDフィルタ５３で設定されるIRPプライオリティを要求するIOCTL_PD_GET_RRIORITY（図８）が、IOCTLとして指定されているIRP_MJ_DEVICE_CONTROLのIRPなどである場合、ステップＳ１６１に進み、フィルタコア５３Ａは、図１０のステップＳ５７における場合と同様に、そのIRPに応じた処理を行う。さらに、フィルタコア５３Ａは、その処理結果に対応する応答を、NT入出力マネージャ５２およびWin32サブシステム５１を介して、IRPに対応するAPI関数を呼び出したプロセスに返し、次のIRPの供給を待って、ステップＳ１５１に戻る。
【０２５７】
一方、ステップＳ１６０において、プロセスからのIRPが、アクセス要求のIRPであると判定された場合、即ち、プロセスからのIRPが、例えば、ファイルの読み出しを要求するIRP_MJ_READのIRPや、ファイルの書き込みを要求するIRP_MJ_WRITEのIRPである場合、ステップＳ１６２に進み、フィルタコア５３Ａは、プロセスからのIRPに含まれるプロセスID、即ち、そのIRPに対応するAPI関数を呼び出したプロセスのプロセスIDが、登録プロセスIDに一致するかどうかを判定する。
【０２５８】
ステップＳ１６２において、プロセスからのIRPに含まれるプロセスIDが、登録プロセスIDに一致しないと判定された場合、ステップＳ１６３に進み、フィルタコア５３Ａは、プロセスからのIRPに対して、最小のIRPプライオリティを設定し、ステップＳ１６５に進む。
【０２５９】
また、ステップＳ１６２において、プロセスからのIRPに含まれるプロセスIDが、登録プロセスIDに一致すると判定された場合、ステップＳ１６４に進み、フィルタコア５３Ａは、プロセスからのIRPに対して、最大のIRPプライオリティを設定し、ステップＳ１６５に進む。
【０２６０】
ステップＳ１６５では、フィルタコア５３Ａは、ステップＳ１６３またはＳ１６４でIRPプライオリティを設定した、プロセスからのIRPを、キュー８１へ出力して記憶させ、次のIRPの供給を待って、ステップＳ１５１に戻る。
【０２６１】
次に、図１６のフローチャートを参照して、第２の機能を実装する図６のPDフィルタ５３において、キュー８１に記憶されたIRPを対象に行われる処理（キュー８１からの出力処理）について説明する。
【０２６２】
PDフィルタ５３では、フィルタコア５３Ａが、ステップＳ１７１において、ポーズフラグが１にセットされているかどうかを判定する。
【０２６３】
ステップＳ１７１において、ポーズフラグが１にセットされていると判定された場合、即ち、PDフィルタ５３がポーズ状態となっている場合、ステップＳ１７２に進み、キュー８１に、最大のIRPプライオリティ（IRPプライオリティとして取り得る値のうちの最大値））が設定されているIRPがあるかどうかを判定する。
【０２６４】
ステップＳ１７２において、キュー８１に、最大のIRPプライオリティが設定されているIRPがあると判定された場合、即ち、登録プロセスIDと一致するプロセスIDのプロセスからのIRPが、キュー８１に記憶されている場合、ステップＳ１７３に進み、フィルタコア５３Ａは、キュー８１に記憶されている、最大のIRPプライオリティが設定されているIRPを処理し、ステップＳ１７１に戻る。即ち、ステップＳ１７３では、フィルタコア５３Ａは、最大のIRPプライオリティが設定されているIRPを、キュー８１から読み出し、NT入出力マネージャ５２を介して、PD_FS５４に出力する。
【０２６５】
また、ステップＳ１７２において、キュー８１に、最大のIRPプライオリティが設定されているIRPがないと判定された場合、即ち、登録プロセスIDと一致するプロセスIDのプロセスからのIRPが、キュー８１に記憶されていない場合、ステップＳ１７３をスキップして、ステップＳ１７１に戻る。
【０２６６】
従って、PDフィルタ５３がポーズ状態になっている場合は、登録プロセスIDと一致するプロセスIDのプロセスからのIRPが、キュー８１に記憶されているかどうかにかかわらず、登録プロセスIDと一致しないプロセスIDのプロセスからのIRPは、PD_FS５４に出力されない。
【０２６７】
一方、ステップＳ１７１において、ポーズフラグが０にリセットされていると判定された場合、即ち、PDフィルタ５３がラン状態となっている場合、ステップＳ１７４，Ｓ１７５に順次進み、図１１のステップＳ７１，Ｓ７２における場合とそれぞれ同様の処理が行われる。
【０２６８】
即ち、ステップＳ１７４において、フィルタコア５３Ａは、キュー８１に記憶されたIRPから、IRPプライオリティが最も高い（最も大きい）ものを検索し、ステップＳ１７５に進む。
【０２６９】
ステップＳ１７５では、フィルタコア５３Ａは、ステップＳ１７４の検索によって得られたIRPプライオリティが最も高いIRPを処理し、ステップＳ１７１に戻る。即ち、ステップＳ１７５では、フィルタコア５３Ａは、IRPプライオリティが最も高いIRPを、優先的に、キュー８１から読み出し、NT入出力マネージャ５２を介して、PD_FS５４に出力する。
【０２７０】
従って、PDフィルタ５３がラン状態の場合は、PDフィルタ５３では、図１１における場合と同様に、キュー８１からIRPが読み出され、PD_FS５４に出力される。
【０２７１】
以上のように、PDフィルタ５３では、登録プロセスIDと一致するプロセスIDのプロセスからのIRPには、最大のIRPプライオリティを設定し、登録プロセスIDと一致しないプロセスIDのプロセスからのIRPには、最小のIRPプライオリティを設定する。
【０２７２】
そして、PDフィルタ５３は、IRPプライオリティが設定されたIRPを、キュー８１に記憶させ、ラン状態の場合は、キュー８１に記憶されたIRPを、IRPプライオリティにしたがって処理するが、ポーズ状態の場合は、キュー８１に記憶されたIRPのうち、最大のIRPプライオリティが設定されているIRP、即ち、登録プロセスIDと一致するプロセスIDのプロセスからのIRPのみを処理する。
【０２７３】
従って、AVアプリケーション３３（図６）では、そのプロセス７５によってロードされたPD_APL４１において、そのプロセス７５のプロセスIDの登録を、PDフィルタ５３に要求し、さらに、AVアプリケーション３３がAVデータの記録や再生などを行うときに、ポーズ状態となることを、PDフィルタ５３に要求することで、PDフィルタ５３では、PD_APL４１のプロセス７５からのIRPに対して、最大のIRPプライオリティが設定され、さらに、その最大のIPRプライオリティが設定されたIRP、即ち、PD_APL４１のプロセス７５からのIRPのみが処理される（PD_FS５４に出力される）。
【０２７４】
このように、PD_APL４１のプロセス７５からのIRPのみが処理されるので、アプリケーション３１や３２からのIRPの処理を待つことや、そのIRPの処理によって生じるドライブ２のシーク等によって、AVアプリケーション３３による光ディスク３に対するデータの読み書きが妨げられることを防止することができる。これにより、AVアプリケーション３３において、AVデータを、リアルタイムで光ディスク３に記録し、また再生することができる。
【０２７５】
ここで、第１の機能によれば、PD_APL４１のプロセス７５からのIRPが、キュー８１に記憶されていなければ、アプリケーション３１や３２（のプロセス）からのIRPは、PDフィルタ５３からPD_FS５４に出力されうる。これに対して、第２の機能によれば、PDフィルタ５３がポーズ状態となっている場合には、PD_APL４１のプロセス７５からのIRPが、キュー８１に記憶されているときは勿論、記憶されていないときであっても、アプリケーション３１や３２（のプロセス）からのIRPは、PDフィルタ５３からPD_FS５４に出力されない。
【０２７６】
なお、図１５および図１６で説明した場合においては、ポーズ状態となっているPDフィルタ５３において、特定のIRPとして、最大のIRPプライオリティが設定されたIRPのみを、PD_FS５４に出力するようにしたが、その他、例えば、登録プロセスIDと一致するプロセスIDのIRPを、特定のIRPとして、その登録プロセスIDと一致するプロセスIDのIRPのみを、PD_FS５４に出力するようにすることが可能である。即ち、PDフィルタ５３では、IRPプライオリティの設定を行わずに、単に、登録プロセスIDと一致するプロセスIDのIRPのみを、PD_FS５４に出力するようにすることが可能である。
【０２７７】
次に、AVデータをリアルタイムで読み書きすることを保証するためのPDフィルタ５３の第３の機能について説明する。
【０２７８】
即ち、第３の機能によれば、PDフィルタ５３は、AVアプリケーション３３以外のアプリケーション、即ち、アプリケーション３１および３２（のプロセス）からのIRPの、PD_FS５４への出力をオン／オフする機能的なスイッチを有し、その機能的なスイッチによって、アプリケーション３１および３２からのIRPを、PD_FS５４に出力しないようにする。これにより、PDフィルタ５３は、AVアプリケーション３３以外のアプリケーション３１および３２からのIRPを、PD_FS５４に出力せず、AVアプリケーション３３からのIRPだけを、PD_FS５４に出力し、AVアプリケーション３３によるAVデータのリアルタイムでの読み書きを保証する。
【０２７９】
図１７は、以上のような第３の機能を実装したPDフィルタ５３の構成例を示している。
【０２８０】
図１７において、PDフィルタ５３のフィルタコア５３は、AVアプリケーション３３以外のアプリケーション３１および３２からのIRPの、PD_FS５４への出力をオン／オフする機能的なスイッチ(Switch)としてのスイッチ１０１を有している。
【０２８１】
スイッチ１０１は、例えば、OS３０の起動(Boot)時や、ドライブ２への光ディスク３の装着(Inject)時に、レジストリ５８に記憶されたスイッチ設定情報にしたがって、オンまたはオフ状態となる。なお、スイッチ１０１の状態は、例えば、PC１において、ドライブ２に対応するボリュームのマウント(Mount)が行われた後は、切り換えることができないようになっている。
【０２８２】
ここで、スイッチ設定情報は、例えば、AVアプリケーション３３のインストール時などにレジストリ５８に記憶される。即ち、AVアプリケーション３３のインストール時に、スイッチ１０１をオンまたはオフのいずれの状態とするかをユーザに選択してもらうようにし、その選択されたスイッチ１０１の状態が、スイッチ設定情報として、レジストリ５８に記憶される。なお、レジストリ５８に記憶されたスイッチ設定情報は、AVアプリケーション３３のインストール後、そのAVアプリケーション３３のオプション設定を行う画面等において変更することができるようにすることが可能である。
【０２８３】
スイッチ１０１は、オン状態となっている場合、すべてのアプリケーション（図１７では、アプリケーション３１乃至３３）からのIRPを、PD_FS５４に出力する。
【０２８４】
一方、スイッチ１０１は、オフ状態となっている場合、AVアプリケーション３３におけるPD_API４１（のプロセス）からのIRPのみを、PD_FS５４に出力し、他のアプリケーション３１および３２（のプロセス）に対しては、ドライブ２（に装着された光ディスク３）に対応するボリューム（のファイルシステム）を偽装する。これにより、スイッチ１０１は、他のアプリケーション３１および３２からのIRPを、PD_FS５４に出力せずに済むようにする。
【０２８５】
ここで、オフ状態となっているスイッチ１０１は、PD_API４１以外からのIRPに対して、ボリュームがマウントされているが、そのボリュームは、読み出し専用(Read Only)で、さらに、そのボリュームには、ファイル(File)およびディレクトリ(Directory)が存在しない旨のステータス(Status)を、応答として返す。
【０２８６】
これにより、スイッチ１０１がオフ状態の場合においては、ドライブ２は、例えば、Windows(R) Explorer上では、ファイルおよびディレクトリがないボリュームで、さらに、ファイルのドロップ、イジェクト(Eject)操作、フォーマット(Format)操作をすることができないボリュームとして扱われる。
【０２８７】
次に、図１８のフローチャートを参照して、図１７のPDフィルタ５３による第３の機能の処理について説明する。
【０２８８】
例えば、OS３０が起動され、あるいは、光ディスク３がドライブ２に装着されると、ステップＳ１９１において、フィルタコア５３Ａは、レジストリ５８から、スイッチ設定情報を取得し、ステップＳ１９２に進む。
【０２８９】
ステップＳ１９２では、フィルタコア５３Ａは、スイッチ設定情報にしたがって、スイッチ１０１をオンまたはオフ状態に設定する。
【０２９０】
そして、フィルタコア５３Ａは、アプリケーション３１乃至３３のうちのいずれかから、IRPが供給されるのを待って、ステップＳ１９３に進み、そのIRPを受信して、ステップＳ１９４に進む。
【０２９１】
ステップＳ１９４では、フィルタコア５３Ａは、（直前に行われた）ステップＳ１９３で受信されたIRPが、AVアプリケーション３３（のPD_API４１）からのIRPであるかどうかを判定する。ステップＳ１９４において、ステップＳ１９３で受信されたIRPが、AVアプリケーション３３からのIRPであると判定された場合、ステップＳ１９５に進み、フィルタコア５３Ａは、そのIRPを、PD_FS５４に出力し、アプリケーション３１乃至３３のうちのいずれかから、次のIRPが供給されるのを待って、ステップＳ１９３に戻る。
【０２９２】
また、ステップＳ１９４において、ステップＳ１９３で受信されたIRPが、AVアプリケーション３３からのIRPでないと判定された場合、即ち、ステップＳ１９３で受信されたIRPが、アプリケーション３１または３２からのIRPである場合、ステップＳ１９６に進み、フィルタコア５３Ａは、スイッチ１０１がオフ状態になっているかどうかを判定する。
【０２９３】
ステップＳ１９６において、スイッチ１０１がオフ状態になっていないと判定された場合、即ち、スイッチ１０１がオン状態になっている場合、ステップＳ１９５に進み、フィルタコア５３Ａは、ステップＳ１９３で受信されたIRPを、PD_FS５４に出力し、アプリケーション３１乃至３３のうちのいずれかから、次のIRPが供給されるのを待って、ステップＳ１９３に戻る。
【０２９４】
また、ステップＳ１９６において、スイッチ１０１がオフ状態になっていると判定された場合、ステップＳ１９７に進み、スイッチ１０１は、ステップＳ１９３で受信されたIRPの出力元であるアプリケーション３１または３２に対して、ファイルシステムを偽装したファイルシステム偽装応答、即ち、例えば、上述したように、ボリュームがマウントされているが、そのボリュームは、読み出し専用で、さらに、そのボリュームには、ファイルおよびディレクトリが存在しない旨のステータスを返す。そして、アプリケーション３１乃至３３のうちのいずれかから、次のIRPが供給されるのを待って、ステップＳ１９３に戻り、以下、同様の処理が繰り返される。
【０２９５】
以上のように、PDフィルタ５３では、スイッチ１０１がオフ状態の場合、AVアプリケーション３３からのIRPだけが、PD_FS５４に出力されるので、アプリケーション３１や３２からのIRPの処理を待つことや、そのIRPの処理により生じるドライブ２のシークによって、AVアプリケーション３３による光ディスク３に対するデータの読み書きが妨げられることを防止することができる。これにより、AVアプリケーション３３において、AVデータを、リアルタイムで光ディスク３に記録し、また再生することができる。
【０２９６】
なお、ステップＳ１９４において、IRPが、AVアプリケーション３３（のPD_API４１をロードしたプロセス７５）からのIRPかどうかの判定は、例えば、上述したように、プロセス２７５のプロセスIDを、登録プロセスIDとしてPDフィルタ５３にあらかじめ登録しておき、その登録プロセスIDと、IRPのプロセスIDとが一致するか否かによって行うことが可能である。
【０２９７】
また、上述の場合には、第１乃至第３の機能をPDフィルタ５３に実装することとしたが、第１乃至第３の機能は、PDフィルタ５３ではなく、PD_FS５４に実装することも可能である。
【０２９８】
ところで、PD_FS５４（図４）は、図５のステップＳ４で説明したように、PDフィルタ５３からのIRPによって要求されているデータについて、NTキャッシュマネージャ５９のキャッシュ機能を利用するのに必要な処理としてのキャッシュ処理を行う。
【０２９９】
そして、例えば、PDフィルタ５３からのIRPによって要求されているデータが、NTキャッシュマネージャ５９にキャッシュされている場合は、そのキャッシュされているデータが、PD_FS５４から、PDフィルタ５３に返されるが、PDフィルタ５３からのIRPによって要求されているデータが、NTキャッシュマネージャ５９にキャッシュされていない場合は、PDフィルタ５３からのIRPは、PD_FS５４からPDストレージ５５に出力される。
【０３００】
従って、PDフィルタ５３からのIRPによって要求されているデータが、NTキャッシュマネージャ５９にキャッシュされていない場合は、キャッシュ機能がないケースと比較すると、キャッシュ処理の分、即ち、CPU１２（図２）がキャッシュ処理の処理ルーチンを実行する分だけ、いわば余計なオーバヘッドが生じることとなる。
【０３０１】
このオーバヘッドは、PD_FS５４からPDストレージ５５へのIRPの出力を遅延させる。そして、AVアプリケーション３３からのIRPが、PD_FS５４からPDストレージ５５への出力時に遅延することは、AVデータのリアルタイムでの再生や記録を妨げる要因となることから、AVアプリケーション３３からのIRPについては、そのような遅延がないことが望ましい。
【０３０２】
このようなIRPの遅延は、キャッシュ機能を利用しないことによって防止することができる。
【０３０３】
一方、キャッシュ機能一切を利用しない場合には、PDフィルタ５３からのIRPは、すべて、PD_FS５４からPDストレージ５５に出力される。即ち、アプリケーション３１乃至３３からのIRPは、すべて、PDフィルタ５３から、PD_FS５４を介して、PDストレージ５５に出力される。
【０３０４】
即ち、この場合、AVアプリケーション３３からのIRPの他、AVアプリケーション３３以外のアプリケーションであるアプリケーション３１や３２からのIRPも、すべて、PDフィルタ５３から、PD_FS５４を介して、PDストレージ５５に出力される。そして、アプリケーション３１や３２からのIRPによって要求されるデータの読み出し等のために、ドライブ２においてシークが発生する。
【０３０５】
このシークは、AVアプリケーション３３からのIRPによって要求されるAVデータの読み出し等をリアルタイムで行うことを妨げることとなる。
【０３０６】
一方、キャッシュ機能を利用する場合には、アプリケーション３１や３２からのIRPによって要求されているデータが、NTキャッシュマネージャ５９にキャッシュされていれば、そのキャッシュされているデータが、PD_FS５４から、PDフィルタ５３に返される。この場合、ドライブ２では、アプリケーション３１や３２からのIRPによって要求されているデータを光ディスク３から読み出す等のためのシークが発生しない。
【０３０７】
以上から、AVアプリケーション３３においては、キャッシュ機能を利用しないことにより、キャッシュ処理による遅延を防止することができ、その結果、AVデータの再生や記録のリアルタイム性を向上させることができる。
【０３０８】
さらに、AVアプリケーション３３以外のアプリケーション３１および３２においては、キャッシュ機能を利用することにより、ドライブ２でのシークの発生を低減することができ、その結果、やはり、AVデータの再生や記録のリアルタイム性を向上させることができる。
【０３０９】
そこで、PDフィルタ５３には、アプリケーション３１および３２からのIRPについては、キャッシュ機能を利用するように処理する一方、AVアプリケーション３３からのIRPについては、キャッシュ機能の利用の有無を設定し、その設定結果にしたがって処理する、いわばキャッシュオン／オフ(cache ON/OFF)機能を実装することができる。
【０３１０】
図１９は、キャッシュオン／オフ機能を実装したPDフィルタ５３の構成例を示している。
【０３１１】
なお、キャッシュオン／オフ機能は、PD_API４１をロードするAVアプリケーション３３にのみ提供され、アプリケーション３１および３２は、常時、キャッシュ機能を利用する。即ち、キャッシュオン／オフ機能は、アプリケーション３１および３２には、いわば関係ない。このため、図１９では、アプリケーション３１乃至３３のうちの、キャッシュオン／オフ機能が提供されるAVアプリケーション３３だけを図示してある。
【０３１２】
図１９において、PDフィルタ５３は、コマンドバッファ１１１を有している。コマンドバッファ１１１は、例えば、AVアプリケーション３３（のPD_API４１）からのIRP、即ち、AVアプリケーション３３のPD_API４１がAPI関数を呼び出すことによってNT入出力マネージャ５２が出力するIRPを一時記憶する。
【０３１３】
また、図１９のPDフィルタ５３では、フィルタコア５３Ａが、AVアプリケーション３３（のPD_API４１）によるキャッシュ機能の利用の有無を設定し、その設定結果にしたがって、コマンドバッファ１１１に記憶されたAVアプリケーション３３からのIRPを処理する。
【０３１４】
即ち、フィルタコア５３Ａは、キャッシュ機能の利用の有無の設定が、キャッシュ機能を利用する設定になっている場合、コマンドバッファ１１１に記憶されたAVアプリケーション３３からのIRPを、PD_FS５４に出力するに際し、PD_FS５４においてキャッシュ機能を利用するように、IRPの出力制御を行う。
【０３１５】
また、フィルタコア５３Ａは、キャッシュ機能の利用の有無の設定が、キャッシュ機能を利用しない設定になっている場合、コマンドバッファ１１１に記憶されたAVアプリケーション３３からのIRPを、PD_FS５４に出力するに際し、PD_FS５４においてキャッシュ機能を利用せずに、PDストレージ５５に出力されるように、IRPの出力制御を行う。
【０３１６】
次に、図２０は、PDフィルタ５３がキャッシュオン／オフ機能の処理を行うときに、PD_API４１が、PDフィルタ５３を制御するために、AVアプリケーション３３に提供する制御用（PDフィルタ５３の制御用）のAPI（関数）を示している。
【０３１７】
図２０においては、PD_API４１が、PDフィルタ５３を制御するために、AVアプリケーション３３に提供する制御用のAPI関数として、PdOpenFile(), PdCloseFile(), PdReadFile(), PdWriteFile()の４つが用意されている。
【０３１８】
ここで、図２０の４つのAPI関数PdOpenFile(), PdCloseFile(), PdReadFile(), PdWriteFile()は、いずれも、ファイル操作を行うためのファイルストリーム(File Stream)用のAPI関数であり、同様のAPI関数が、Win32サブシステム５１でも提供されている。
【０３１９】
即ち、PD_API４１は、Win32サブシステム５１が提供するファイルストリーム用のAPI関数とは別に、固有のファイルストリーム用のAPI関数PdOpenFile(), PdCloseFile(), PdReadFile(), PdWriteFile()を提供する。
【０３２０】
API関数PdOpenFile()は、ファイルのオープンを要求するAPI関数で、オープンしようとするファイルのファイル名（パス名を含む）、そのファイルをオープンするときのオープンモード（例えば、参照のみ行うモード等）、およびキャッシュ機能の利用の有無を表すキャッシュ情報を、引数としてとる。
【０３２１】
そして、API関数PdOpenFile()を、引数のファイル名、オープンモード、およびキャッシュ情報を指定して呼び出すことにより、引数で指定されているファイル名のファイルが、引数で指定されているオープンモードでオープンされる。さらに、API関数PdOpenFile()は、引数のキャッシュ情報によって、PDフィルタ５３（のフィルタコア５３Ａ）に、キャッシュ機能の利用の有無を設定させる。API関数PdOpenFile()は、ファイルのオープンに成功した場合、戻り値として、そのオープンしたファイルのファイルハンドルを返し、ファイルのオープンに失敗した場合、戻り値として、0xffffffffを返す。なお、0xは、その後に続く値が、１６進数であることを表す。
【０３２２】
API関数PdCloseFile()は、ファイルのクローズを要求するAPI関数で、クローズしようとするファイルのファイルハンドルを、引数としてとる。そして、API関数PdCloseFile()を、引数のファイルハンドルを指定して呼び出すことにより、そのファイルハンドルによって特定されるファイルがクローズする。API関数PdCloseFile()は、ファイルのクローズに成功した場合、戻り値として１を返し、ファイルのクローズに失敗した場合、戻り値として０を返す。
【０３２３】
API関数PdReadFile()は、ファイルからのデータの読み出しを要求するAPI関数で、データを読み出そうとするファイルのファイルハンドル、ファイルから読み出したデータを一時記憶するバッファへのポインタであるバッファポインタ、およびファイルから読み出すデータのデータ量としてのバイト数を、引数としてとる。そして、API関数PdReadFile()を、引数のファイルハンドル、バッファポインタ、およびバイト数を指定して呼び出すことにより、そのファイルハンドルによって特定されるファイルのデータが、そのバイト数だけ読み出され、バッファポインタによって指定された記憶領域に保存される。API関数PdReadFile()は、データの読み出しに成功した場合、戻り値として、その読み出したデータのバイト数を返し、データの読み出しに失敗した場合、戻り値として０を返す。なお、API関数PdReadFile()は、Win32サブシステム５１が提供するAPI関数ReadFile()に相当する。
【０３２４】
API関数PdWriteFile()は、ファイルへのデータの書き込みを要求するAPI関数で、データを書き込もうとするファイルのファイルハンドル、ファイルに書き込むデータを一時記憶するバッファへのポインタであるバッファポインタ、およびファイルに書き込むデータのデータ量としてのバイト数を、引数としてとる。そして、API関数PdWriteFile()を、引数のファイルハンドル、バッファポインタ、およびバイト数を指定して呼び出すことにより、バッファポインタによって指定された記憶領域における、そのバイト数のデータが、ファイルハンドルによって特定されるファイルに書き込まれる。API関数PdWriteFile()は、データの書き込みに成功した場合、戻り値として、その書き込んだデータのバイト数を返し、データの書き込みに失敗した場合、戻り値として０を返す。なお、API関数PdWriteFile()は、Win32サブシステム５１が提供するAPI関数WriteFile()に相当する。
【０３２５】
PD_API４１は、API関数PdOpenFile(), PdCloseFile(), PdReadFile(), PdWriteFile()が呼び出されると、それぞれ、Win32サブシステム５１が提供する、対応するAPI関数DeviceIoControl()を呼び出す。
【０３２６】
API関数DeviceIoControl()が呼び出されると、Win32サブシステム５１は、NT入出力マネージャ５２に対して、そのAPI関数DeviceIoControl()に応じた要求を行い、NT入出力マネージャ５２は、その要求を、IRP_MJ_DEVICE_CONTROLのIRPに変換し、PDフィルタ５３に供給する。
【０３２７】
このIRP_MJ_DEVICE_CONTROLでは、上述したように、ユーザ定義が可能なサブコードとしてのIOCTLが指定される。
【０３２８】
図２１は、API関数PdOpenFile(), PdCloseFile(), PdReadFile(), PdWriteFile()が、それぞれ呼び出されたときに、IRP_MJ_DEVICE_CONTROLで指定されるユーザ定義のIOCTLを示している。
【０３２９】
図２１では、図２０のAPI関数PdOpenFile(), PdCloseFile(), PdReadFile(), PdWriteFile()に、それぞれ対応するIOCTL_PD_OPEN_FILE, IOCTL_PD_CLOSE_FILE, ICCTL_PD_READ_FILE, IOCTL_PD_WRITE_FILEの４つのIOCTLが、ユーザ定義のIOCTLとして用意されている。
【０３３０】
IOCTL_PD_OPEN_FILEは、API関数PdOpenFile()の呼び出しに応じて呼び出されるAPI関数DeviceIoControl()（に応じた要求）に対応するIRP_MJ_DEVICE_CONTROLのIRPのサブコードとなるIOCTLで、ファイルのオープンを要求するIOCTLである。
【０３３１】
IOCTL_PD_CLOSE_FILEは、API関数PdCloseFile()の呼び出しに応じて呼び出されるAPI関数DeviceIoControl()に対応するIRP_MJ_DEVICE_CONTROLのIRPのサブコードとなるIOCTLで、ファイルのクローズを要求するIOCTLである。
【０３３２】
IOCTL_PD_READ_FILEは、API関数PdReadFile()の呼び出しに応じて呼び出されるAPI関数DeviceIoControl()に対応するIRP_MJ_DEVICE_CONTROLのIRPのサブコードとなるIOCTLで、ファイルからのデータの読み出しを要求するIOCTLである。
【０３３３】
IOCTL_PD_WRITE_FILEは、API関数PdWriteFile()の呼び出しに応じて呼び出されるAPI関数DeviceIoControl()に対応するIRP_MJ_DEVICE_CONTROLのIRPのサブコードとなるIOCTLで、ファイルへのデータの書き込みを要求するIOCTLである。
【０３３４】
なお、上述したように、IRP_MJ_DEVICE_CONTROLのIRPのサブコードとなるユーザ定義のIOCTLは、Win32サブシステム５１が提供するAPI関数DeviceIoControl()を利用して、Win32サブシステム５１からNT入出力マネージャ５２に渡され、NT入出力マネージャ５２において、IRP_MJ_DEVICE_CONTROLのIRPのサブコードとして指定される。
【０３３５】
次に、図２２のフローチャートを参照して、PDフィルタ５３がキャッシュオン／オフ機能を実装している場合の、図１９におけるAVアプリケーション３３、PD_API４１、PDフィルタ５３、およびPD_FS５４の処理の概要について説明する。
【０３３６】
AVアプリケーション３３は、光ディスク３に対するAVデータの読み書きを、キャッシュ機能を利用せずに行う場合、ステップＳ２０１において、AVデータの読み書きを行おうとするファイルのオープンを要求するAPI関数PdOpenFile()を、キャッシュ機能を利用しない旨のキャッシュ情報（Cache OFF）を引数として呼び出す。
【０３３７】
PD_API４１は、ステップＳ２１１において、AVアプリケーション３３によるAPI関数PdOpenFile()の呼び出しを受信して、ステップＳ２１２に進み、そのAPI関数PdOpenFile()の呼び出しに応じて、ファイルのオープンを要求するAPI関数DeviceIoControl()を呼び出す。このAPI関数DeviceIoControl()の呼び出しによって、ファイルのオープンを要求するIOCTL_PD_OPEN_FILEがIOCTLとして指定されているIRP_MJ_DEVICE_CONTROLのIRPが、NT入出力マネージャ５２からPDフィルタ５３に供給される。なお、この場合、IOCTL_PD_OPEN_FILEには、キャッシュ機能を利用しない旨のキャッシュ情報が含まれる。
【０３３８】
PDフィルタ５３は、ステップＳ２２１において、NT入出力マネージャ５２からのIRPを受信し、そのIRPのIOCTL_PD_OPEN_FILEにしたがい、キャッシュ機能の利用の有無を表すキャッシュフラグを、キャッシュ機能を利用しない旨を表す、例えば、０にリセットし（設定し）、これにより、AVアプリケーション３３でキャッシュオフを指定してオープンされたファイルについてはキャッシュ機能を利用しないキャッシュオフ状態となる。
【０３３９】
PDフィルタ５３は、キャッシュオフ状態となっている間、PD_API４１からのIRP_MJ_DEVICE_CONTROLのIRP（PD_API４１がAPI関数PdOpenFile(), PdCloseFile(), PdReadFile()、またはPdWriteFile()の呼び出しに応じて呼び出すAPI関数DeviceIoControl()に対応して、IOCTL_PD_OPEN_FILE, IOCTL_PD_CLOSE_FILE, ICCTL_PD_READ_FILE、またはIOCTL_PD_WRITE_FILEがそれぞれ指定されるIRP_MJ_DEVICE_CONTROLのIRP）を、そのIRP_MJ_DEVICE_CONTROLのIRPのまま、PD_FS５４に出力することにより、PD_API４１からのIRPによって要求されるデータの読み書きが、キャッシュ機能を利用しないで行われるように、PD_API４１からのIRPの出力制御を行う。
【０３４０】
即ち、ステップＳ２２１では、PDフィルタ５３は、キャッシュオフ状態となった後、NT入出力マネージャ５２から受信した、PD_API４１からの、IOCTL_PD_OPEN_FILEが指定されているIRP_MJ_DEVICE_CONTROLのIRPを、そのまま、PD_FS５４に出力する。
【０３４１】
PD_FS５４は、ステップＳ２３１において、PDフィルタ５３からの、IOCTL_PD_OPEN_FILEが指定されているIRP_MJ_DEVICE_CONTROLのIRPを受信し、PDストレージ５５に出力する。これにより、光ディスク３上のファイルがオープンされる。
【０３４２】
その後、例えば、AVアプリケーション３３が、ステップＳ２０２において、光ディスク３に対するアクセス要求としての、例えば、ファイル（ファイルストリーム(File Stream)）の読み出し、または書き込みを要求するAPI関数PdReadFile()、またはPdWriteFile()を呼び出すと、PD_API４１は、ステップＳ２１３において、そのAPI関数PdReadFile()、またはPdWriteFile()の呼び出しを受信し、ステップＳ２１４に進む。
【０３４３】
ステップＳ２１４では、PD_API４１は、AVアプリケーション３３からのAPI関数PdReadFile()、またはPdWriteFile()の呼び出しに応じて、ファイルの読み出し、または書き込みを要求するAPI関数DeviceIoControl()を呼び出し、この呼び出しによって、ファイルの読み出しを要求するIOCTL_PD_READ_FILEがIOCTLとして指定されているIRP_MJ_DEVICE_CONTROLのIRP、またはファイルの書き込みを要求するIOCTL_PD_WRITE_FILEがIOCTLとして指定されているIRP_MJ_DEVICE_CONTROLのIRPが、NT入出力マネージャ５２からPDフィルタ５３に供給される。
【０３４４】
PDフィルタ５３は、ステップＳ２２３において、NT入出力マネージャ５２からのIRP_MJ_DEVICE_CONTROLのIRPを受信して、ステップＳ２２４に進み、PD_FS５４に出力する。
【０３４５】
ここで、キャッシュオフ状態のPDフィルタ５３は、上述したように、PD_API４１からのIRP_MJ_DEVICE_CONTROLのIRPを、そのIRP_MJ_DEVICE_CONTROLのIRPのまま、PD_FS５４に出力する。
【０３４６】
従って、いまの場合、PDフィルタ５３では、ステップＳ２２４において、ファイルの読み出しを要求するIOCTL_PD_READ_FILEがIOCTLとして指定されているIRP_MJ_DEVICE_CONTROLのIRP、またはファイルの書き込みを要求するIOCTL_PD_WRITE_FILEがIOCTLとして指定されているIRP_MJ_DEVICE_CONTROLのIRPが、そのIRP_MJ_DEVICE_CONTROLのIRPのまま、PD_FS５４に出力される。
【０３４７】
PD_FS５４は、ステップＳ２３２において、PDフィルタ５３からのIRP_MJ_DEVICE_CONTROLのIRPを受信する。
【０３４８】
ここで、PD_FS５４は、Win32サブシステム５１が提供するAPI関数ReadFile()またはWriteFile()が呼び出されたときに、NT入出力マネージャ５２がPDフィルタ５３に出力するIRP_MJ_READまたはIRP_MJ_WRITEのIRPについて、NTキャッシュマネージャ５９によるキャッシュ機能を提供し、IRP_MJ_DEVICE_CONTROLのIRPについては、キャッシュ機能を提供しないようになっている。
【０３４９】
従って、ステップＳ２３２において、PDフィルタ５３からのIRP_MJ_DEVICE_CONTROLのIRPを受信したPD_FS５４は、そのIRPを、即座に、PDストレージ５５に出力する。即ち、この場合、キャッシュ機能は利用されない。
【０３５０】
その後、AVアプリケーション３３が、ステップＳ２０３において、ステップＳ２０１でオープンを要求したファイルのクローズを要求するAPI関数PdCloseFile()を呼び出すと、PD_API４１は、ステップＳ２１５において、AVアプリケーション３３によるAPI関数PdCloseFile()の呼び出しを受信して、ステップＳ２１６に進み、そのAPI関数PdCloseFile()の呼び出しに応じて、ファイルのクローズを要求するAPI関数DeviceIoControl()を呼び出す。このAPI関数DeviceIoControl()の呼び出しによって、ファイルのクローズを要求するIOCTL_PD_CLOSE_FILEがIOCTLとして指定されているIRP_MJ_DEVICE_CONTROLのIRPが、NT入出力マネージャ５２からPDフィルタ５３に供給される。
【０３５１】
PDフィルタ５３は、ステップＳ２２５において、NT入出力マネージャ５２からのIRPを受信して、ステップＳ２２６に進み、そのまま、PD_FS５４に出力する。
【０３５２】
PD_FS５４は、ステップＳ２３３において、PDフィルタ５３からの、IOCTL_PD_CLOSE_FILEが指定されているIRP_MJ_DEVICE_CONTROLのIRPを受信し、PDストレージ５５に出力する。これにより、光ディスク３上のファイルがクローズされる。
【０３５３】
一方、AVアプリケーション３３が、光ディスク３に対するAVデータの読み書きを、キャッシュ機能を利用して行う場合、ステップＳ２４１において、AVデータの読み書きを行おうとするファイルのオープンを要求するAPI関数PdOpenFile()を、キャッシュ機能を利用する旨のキャッシュ情報（Cache ON）を引数として呼び出す。
【０３５４】
PD_API４１は、ステップＳ２５１において、AVアプリケーション３３によるAPI関数PdOpenFile()の呼び出しを受信して、ステップＳ２５２に進み、そのAPI関数PdOpenFile()の呼び出しに応じて、ファイルのオープンを要求するAPI関数DeviceIoControl()を呼び出す。このAPI関数DeviceIoControl()の呼び出しによって、ファイルのオープンを要求するIOCTL_PD_OPEN_FILEがIOCTLとして指定されているIRP_MJ_DEVICE_CONTROLのIRPが、NT入出力マネージャ５２からPDフィルタ５３に供給される。なお、この場合、IOCTL_PD_OPEN_FILEには、キャッシュ機能を利用する旨のキャッシュ情報が含まれる。
【０３５５】
PDフィルタ５３は、ステップＳ２６１において、NT入出力マネージャ５２からのIRPを受信し、そのIRPのIOCTL_PD_OPEN_FILEにしたがい、キャッシュ機能の利用の有無を表すキャッシュフラグを、キャッシュ機能を利用する旨を表す、例えば、１にセットし（設定し）、これにより、AVアプリケーション３３でキャッシュオンを指定してオープンされたファイルについて、キャッシュ機能を利用するキャッシュオン状態となる。
【０３５６】
PDフィルタ５３は、キャッシュオン状態となっている間、PD_API４１からのIRPによって要求されるデータの読み書きが、キャッシュ機能を利用して行われるように制御する。
【０３５７】
即ち、ステップＳ２６１では、PDフィルタ５３は、キャッシュオン状態となった後、NT入出力マネージャ５２から受信した、PD_API４１からの、IOCTL_PD_OPEN_FILEが指定されているIRP_MJ_DEVICE_CONTROLのIRPを、PD_FS５４に出力する。
【０３５８】
PD_FS５４は、ステップＳ２７１において、PDフィルタ５３からの、IOCTL_PD_OPEN_FILEが指定されているIRP_MJ_DEVICE_CONTROLのIRPを受信し、PDストレージ５５に出力する。これにより、光ディスク３上のファイルがオープンされる。
【０３５９】
その後、例えば、AVアプリケーション３３が、ステップＳ２４２において、光ディスク３に対するアクセス要求としての、例えば、ファイルの読み出し、または書き込みを要求するAPI関数PdReadFile()、またはPdWriteFile()を呼び出すと、PD_API４１は、ステップＳ２５３において、そのAPI関数PdReadFile()、またはPdWriteFile()の呼び出しを受信し、ステップＳ２５４に進む。
【０３６０】
ステップＳ２５４では、PD_API４１は、AVアプリケーション３３からのAPI関数PdReadFile()、またはPdWriteFile()の呼び出しに応じて、ファイルの読み出し、または書き込みを要求するAPI関数DeviceIoControl()を呼び出し、この呼び出しによって、ファイルの読み出しを要求するIOCTL_PD_READ_FILEがIOCTLとして指定されているIRP_MJ_DEVICE_CONTROLのIRP、またはファイルの書き込みを要求するIOCTL_PD_WRITE_FILEがIOCTLとして指定されているIRP_MJ_DEVICE_CONTROLのIRPが、NT入出力マネージャ５２からPDフィルタ５３に供給される。
【０３６１】
PDフィルタ５３は、ステップＳ２６３において、NT入出力マネージャ５２からのIRP_MJ_DEVICE_CONTROLのIRPを受信して、ステップＳ２６４に進み、PD_FS５４に出力する。
【０３６２】
ここで、キャッシュオン状態のPDフィルタ５３は、PD_API４１からのIRP_MJ_DEVICE_CONTROLのIRPのうちの、ファイルの読み出しを要求するIOCTL_PD_READ_FILEが指定されているIRP_MJ_DEVICE_CONTROLのIRPと、ファイルの書き込みを要求するIOCTL_PD_WRITE_FILEが指定されているIRP_MJ_DEVICE_CONTROLのIRPとについては、そのIRPを変換して、PD_FS５４に出力する。
【０３６３】
即ち、ステップＳ２６４では、ファイルの読み出しを要求するIOCTL_PD_READ_FILEが指定されているIRP_MJ_DEVICE_CONTROLのIRPは、Win32サブシステム５１が提供する、ファイルの読み出しを要求するAPI関数ReadFile()が呼び出されたときにNT入出力マネージャ５２がPDフィルタ５３に出力するIRP_MJ_READに変換され、PD_FS５４に出力される。
【０３６４】
また、ファイルの書き込みを要求するIOCTL_PD_WRITE_FILEが指定されているIRP_MJ_DEVICE_CONTROLのIRPは、Win32サブシステム５１が提供する、ファイルの書き込みを要求するWriteFile()が呼び出されたときにNT入出力マネージャ５２がPDフィルタ５３に出力するIRP_MJ_WRITEのIRPに変換され、PD_FS５４に出力される。
【０３６５】
PD_FS５４は、ステップＳ２７２において、PDフィルタ５３からのIRP_MJ_READのIRP、またはIRP_MJ_WRITEのIRPを受信する。
【０３６６】
ここで、上述したように、PD_FS５４は、IRP_MJ_READのIRPまたはIRP_MJ_WRITEのIRPについては、NTキャッシュマネージャ５９によるキャッシュ機能を提供する。
【０３６７】
従って、ステップＳ２７２において、PDフィルタ５３からのIRP_MJ_READのIRP、またはIRP_MJ_WRITEのIRPを受信したPD_FS５４では、そのIRPによって要求されるデータの読み書きがキャッシュ機能を利用して行われる。
【０３６８】
即ち、例えば、PDフィルタ５３からのIRP_MJ_READのIRPによって読み出しが要求されているデータが、NTキャッシュマネージャ５９にキャッシュされている場合には、PD_FS５４は、そのキャッシュされているデータを、応答として、PDフィルタ５３に返す。また、例えば、PDフィルタ５３からのIRP_MJ_READのIRPによって読み出しが要求されているデータが、NTキャッシュマネージャ５９にキャッシュされていない場合には、PD_FS５４は、PDフィルタ５３からのIRP_MJ_READのIRPを、PDストレージ５５に出力する。
【０３６９】
その後、AVアプリケーション３３が、ステップＳ２４３において、ステップＳ２４１でオープンを要求したファイルのクローズを要求するAPI関数PdCloseFile()を呼び出すと、PD_API４１は、ステップＳ２５５において、AVアプリケーション３３によるAPI関数PdCloseFile()の呼び出しを受信して、ステップＳ２５６に進み、そのAPI関数PdCloseFile()の呼び出しに応じて、ファイルのクローズを要求するAPI関数DeviceIoControl()を呼び出す。このAPI関数DeviceIoControl()の呼び出しによって、ファイルのクローズを要求するIOCTL_PD_CLOSE_FILEがIOCTLとして指定されているIRP_MJ_DEVICE_CONTROLのIRPが、NT入出力マネージャ５２からPDフィルタ５３に供給される。
【０３７０】
PDフィルタ５３は、ステップＳ２６５において、NT入出力マネージャ５２からのIRPを受信して、ステップＳ２６６に進み、そのまま、PD_FS５４に出力する。
【０３７１】
PD_FS５４は、ステップＳ２７３において、PDフィルタ５３からの、IOCTL_PD_CLOSE_FILEが指定されているIRP_MJ_DEVICE_CONTROLのIRPを受信し、PDストレージ５５に出力する。これにより、光ディスク３上のファイルがクローズされる。
【０３７２】
なお、ファイルのオープンを要求するAPI関数PdOpenFile()を呼び出すときに、その引数のキャッシュ情報を、キャッシュ機能を利用する旨の情報とするか、またはキャッシュ情報を利用しない旨の情報とするかは、例えば、PC１やドライブ２の性能（例えば、CPU１２の動作クロックや、ドライブ２の最悪シーク時間など）、ユーザの操作などに応じて決定することが可能である。
【０３７３】
次に、図２３のフローチャートを参照して、図１９のPDフィルタ５３によるキャッシュオン／オフの機能の処理について説明する。
【０３７４】
アプリケーション３１乃至３３のうちのいずれか（のプロセス）において、ドライブ２に対するI/O関係の処理を要求する（I/O要求を行う）API関数が呼び出されると、そのAPI関数の呼び出しに応じて、NT入出力マネージャ５２は、そのAPI関数に対応するIRPを、PDフィルタ５３に供給する。
【０３７５】
なお、本実施の形態においては、アプリケーション３１乃至３３（AVアプリケーション３３のPD_API４１も含む）により呼び出されるAPI関数としては、Win32サブシステム３２が提供するものの他、PD_API４１が提供するものがある。
【０３７６】
Win32サブシステム３２が提供するAPI関数の呼び出しに対しては、Win32サブシステム３２が、そのAPI関数に応じた要求を、NT入出力マネージャ５２に対して行い、NT入出力マネージャ５２が、そのAPI関数に対応するIRPを、PDフィルタ５３に供給する。また、PD_API４１が提供するAPI関数の呼び出しに対しては、PD_API４１が、そのAPI関数に応じたAPI関数DeviceIoControl()を呼び出し、さらに、Win32サブシステム３２が、そのAPI関数DeviceIoControl()に応じた要求を、NT入出力マネージャ５２に対して行い、NT入出力マネージャ５２が、そのAPI関数DeviceIoControl()に対応するIRPを、PDフィルタ５３に供給する。
【０３７７】
従って、アプリケーション３１乃至３３により呼び出されたAPI関数が、Win32サブシステム３２が提供するAPI関数であっても、また、PD_API４１が提供するAPI関数であっても、最終的には、そのAPI関数に対応するIRPが、NT入出力マネージャ５２からPDフィルタ５３に供給されることに変わりはない。
【０３７８】
PDフィルタ５３は、ステップＳ３０１において、API関数の呼び出しに応じて、NT入出力マネージャ５２から供給されたIRPを受信し、コマンドバッファ１１１に記憶させて、ステップＳ３０２に進む。ステップＳ３０２では、フィルタコア５３Ａが、（直前のステップＳ３０１で）コマンドバッファ１１１に記憶されたIRPが、IOCTLとして、ファイルのオープンを要求するIOCTL_PD_OPEN_FILE（図２１）が指定されているIRP(IRP_MJ_DEVICE_CONTROLのIRP)であるかどうかを判定する。
【０３７９】
ここで、IOCTL_PD_OPEN_FILEには、上述したように、キャッシュ情報が含まれる。
【０３８０】
ステップＳ３０２において、コマンドバッファ１１１に記憶されたIRPが、IOCTL_PD_OPEN_FILEが指定されているIRPであると判定された場合、ステップＳ３０３に進み、フィルタコア５３Ａは、そのIRPで指定されているIOCTL_PD_OPEN_FILEにおけるキャッシュ情報がキャッシュ機能を利用する旨を表しているかどうかを判定する。
【０３８１】
ステップＳ３０３において、キャッシュ情報がキャッシュ機能を利用する旨を表していると判定された場合、ステップＳ３０４に進み、フィルタコア５３Ａは、変数としてのキャッシュフラグを、キャッシュ機能を利用することを表す１にセットし（設定し）、これにより、キャッシュオン状態となって、ステップＳ３０６に進む。
【０３８２】
また、ステップＳ３０３において、キャッシュ情報がキャッシュ機能を利用しない旨を表していると判定された場合、ステップＳ３０５に進み、フィルタコア５３Ａは、変数としてのキャッシュフラグを、キャッシュ機能を利用しないことを表す０にリセットし（設定し）、これにより、キャッシュオフ状態となって、ステップＳ３０６に進む。
【０３８３】
ステップＳ３０６では、フィルタコア５３Ａは、コマンドバッファ１１１に記憶された、IOCTL_PD_OPEN_FILEが指定されているIRPを、PD_FS５４に出力し、次のIRPが供給されるのを待って、ステップＳ３０１に戻る。
【０３８４】
なお、この場合、PD_FS５４は、フィルタコア５３ＡからのIOCTL_PD_OPEN_FILEが指定されているIRPを受信して、PDストレージ５５に出力し、これにより、ファイルがオープンされる。
【０３８５】
一方、ステップＳ３０２において、コマンドバッファ１１１に記憶されたIRPが、IOCTL_PD_OPEN_FILEが指定されているIRPでないと判定された場合、ステップＳ３０７に進み、フィルタコア５３Ａは、コマンドバッファ１１１に記憶されたIRPが、IOCTLとして、ファイルのクローズを要求するIOCTL_PD_CLOSE_FILE（図２１）が指定されているIRP(IRP_MJ_DEVICE_CONTROLのIRP)であるかどうかを判定する。
【０３８６】
ステップＳ３０７において、コマンドバッファ１１１に記憶されたIRPが、IOCTL_PD_CLOSE_FILEが指定されているIRPであると判定された場合、ステップＳ３０８に進み、フィルタコア５３Ａは、コマンドバッファ１１１に記憶された、IOCTL_PD_CLOSE_FILEが指定されているIRPを、PD_FS５４に出力し、次のIRPが供給されるのを待って、ステップＳ３０１に戻る。
【０３８７】
なお、この場合、PD_FS５４は、フィルタコア５３ＡからのIOCTL_PD_CLOSE_FILEが指定されているIRPを受信して、PDストレージ５５に出力し、これにより、ファイルがクローズされる。
【０３８８】
また、ステップＳ３０７において、コマンドバッファ１１１に記憶されたIRPが、IOCTL_PD_CLOSE_FILEが指定されているIRPでないと判定された場合、ステップＳ３０９に進み、フィルタコア５３Ａは、コマンドバッファ１１１に記憶されたIRPが、IOCTLとして、ファイルの読み出しを要求するIOCTL_PD_READ_FILE、またはファイルの書き込みを要求するIOCTL_PD_WRITE_FILE（図２１）が指定されているIRP(IRP_MJ_DEVICE_CONTROLのIRP)であるかどうかを判定する。
【０３８９】
ステップＳ３０９において、コマンドバッファ１１１に記憶されたIRPが、IOCTL_PD_READ_FILE、またはIOCTL_PD_WRITE_FILEが指定されているIRPでないと判定された場合、ステップＳ３１０に進み、コマンドバッファ１１１に記憶されたIRPを、PD_FS５４に出力し、次のIRPが供給されるのを待って、ステップＳ３０１に戻る。
【０３９０】
また、ステップＳ３０９において、コマンドバッファ１１１に記憶されたIRPが、IOCTL_PD_READ_FILE、またはIOCTL_PD_WRITE_FILEが指定されているIRPであると判定された場合、ステップ３１１に進み、フィルタコア５３Ａは、キャッシュフラグが１であるかどうかを判定する。
【０３９１】
ステップＳ３１１において、キャッシュフラグが１であると判定された場合、即ち、PDフィルタ５３（のフィルタコア５３Ａ）がキャッシュオン状態になっている（設定されている）場合、ステップＳ３１２に進み、フィルタコア５３Ａは、コマンドバッファ１１１に記憶されたIRPを変換する。
【０３９２】
即ち、いまの場合、コマンドバッファ１１１に記憶されているIRPは、IOCTLとして、ファイルの読み出しを要求するIOCTL_PD_READ_FILE、またはファイルの書き込みを要求するIOCTL_PD_WRITE_FILE（図２１）が指定されているIRP_MJ_DEVICE_CONTROLのIRPである。
【０３９３】
フィルタコア５３Ａは、コマンドバッファ１１１に記憶されているIRPが、ファイルの読み出しを要求するIOCTL_PD_READ_FILEが指定されているIRP_MJ_DEVICE_CONTROLのIRPである場合、ステップＳ３１２において、そのIRP_MJ_DEVICE_CONTROLのIRPを、Win32サブシステム５１が提供するAPI関数ReadFile()が呼び出されたときにNT入出力マネージャ５２がPDフィルタ５３に出力するIRP_MJ_READのIRPに変換する。
【０３９４】
また、フィルタコア５３Ａは、コマンドバッファ１１１に記憶されているIRPが、ファイルの書き込みを要求するIOCTL_PD_WRITE_FILEが指定されているIRP_MJ_DEVICE_CONTROLのIRPである場合、ステップＳ３１２において、そのIRP_MJ_DEVICE_CONTROLのIRPを、Win32サブシステム５１が提供するAPI関数WriteFile()が呼び出されたときにNT入出力マネージャ５２がPDフィルタ５３に出力するIRP_MJ_WRITEのIRPに変換する。
【０３９５】
そして、ステップＳ３１３に進み、フィルタコア５３Ａは、ステップＳ３１２での変換後のIRP、即ち、IRP_MJ_READまたはIRP_MJ_WRITEのIRPを、PD_FS５４に出力し、次のIRPが供給されるのを待って、ステップＳ３０１に戻る。
【０３９６】
なお、この場合、PD_FS５４は、フィルタコア５３ＡからのIRP_MJ_READのIRP、またはIRP_MJ_WRITEのIRPを受信し、そのIRPによって要求されるデータの読み出し、または書き込みを、キャッシュ機能を利用して行う。
【０３９７】
即ち、上述したように、PD_FS５４は、IRP_MJ_READのIRPまたはIRP_MJ_WRITEのIRPについては、NTキャッシュマネージャ５９によるキャッシュ機能を提供する。
【０３９８】
従って、例えば、PD_FS５４が、フィルタコア５３Ａから受信したIRPが、IRP_MJ_READのIRPである場合、そのIRPによって読み出しが要求されているデータが、NTキャッシュマネージャ５９にキャッシュされているかどうかが確認される。そして、読み出しが要求されているデータがキャッシュされている場合には、PD_FS５４は、そのキャッシュされているデータを、応答として、PDフィルタ５３に返す。また、例えば、PDフィルタ５３からのIRP_MJ_READのIRPによって読み出しが要求されているデータが、NTキャッシュマネージャ５９にキャッシュされていない場合には、PD_FS５４は、PDフィルタ５３からのIRP_MJ_READのIRPを、PDストレージ５５に出力する。
【０３９９】
ここで、PDストレージ５５には、データの読み書きのための図示せぬリードライトバッファ(Read/Write Buffer)が用意されている。リードライトバッファのサイズは、例えば、ページング時のページサイズ(Page Size)（例えば、4KB(kilo byte)）に等しくなっており、一度に読み書きすることができるデータの最大サイズは、このリードライトバッファのサイズに制限される。
【０４００】
このため、PD_FS５４は、フィルタコア５３ＡからのIRP_MJ_READのIRPによって読み出しが要求されるデータのサイズが、リードライトバッファのサイズを越えている場合には、フィルタコア５３ＡからのIRP_MJ_READのIRPを、リードライトバッファのサイズ以内のデータの読み出しを要求する複数のIRP_MJ_READのIRPに分割し、PDストレージ５５に出力する。フィルタコア５３ＡからのIRP_MJ_WRITEのIRPについても、同様である。
【０４０１】
一方、ステップＳ３１１において、キャッシュフラグが１でないと判定された場合、即ち、キャッシュフラグが０であり、従って、PDフィルタ５３（のフィルタコア５３Ａ）がキャッシュオフ状態になっている（設定されている）場合、ステップＳ３１４に進み、フィルタコア５３Ａは、コマンドバッファ１１１に記憶されたIRP、即ち、ファイルの読み出しを要求するIOCTL_PD_READ_FILE、またはファイルの書き込みを要求するIOCTL_PD_WRITE_FILE（図２１）が指定されているIRP_MJ_DEVICE_CONTROLのIRPを、そのまま、PD_FS５４に出力し、次のIRPが供給されるのを待って、ステップＳ３０１に戻る。
【０４０２】
なお、この場合、PD_FS５４は、フィルタコア５３ＡからのIOCTL_PD_READ_FILE、、またはIOCTL_PD_WRITE_FILEが指定されているIRP_MJ_DEVICE_CONTROLのIRPを受信し、キャッシュ機能を利用せずに、即座に、そのIRPを、PDストレージ５５に出力する。
【０４０３】
即ち、上述したように、PD_FS５４は、IRP_MJ_DEVICE_CONTROLのIRPについては、キャッシュ機能を提供せず、即座に、PDストレージ５５に出力する。
【０４０４】
ここで、一度に読み書きすることができるデータの最大サイズは、上述したように、PDストレージ５５のリードライトバッファのサイズに制限される。
【０４０５】
このため、フィルタコア５３Ａは、ステップＳ３１４においてPD_FS５４に出力するIRP_MJ_DEVICE_CONTROLのIRPによって読み書きが要求されるデータのサイズが、リードライトバッファのサイズを越えている場合には、そのIRP_MJ_DEVICE_CONTROLのIRPを、リードライトバッファのサイズ以内のデータの読み書きを要求する複数のIRP_MJ_DEVICE_CONTROLのIRPに分割し、PD_FS５４に出力する。
【０４０６】
なお、キャッシュオン／オフ機能によって、キャッシュ機能が利用されたり、されなかったりするのは、図２１に示したユーザ定義のIOCTLが指定されるIRP_MJ_DEVICE_CONTROLのIRPだけであり、このIOCTLが指定されるIRPは、PD_API４１のみが提供する図２０のAPI関数の呼び出しによって、NT入出力マネージャ５２からPDフィルタ５３に出力される。
【０４０７】
従って、キャッシュオン／オフ機能を利用することができるのは、本実施の形態では、PD_API４１をロードするAVアプリケーション３３だけである。
【０４０８】
そして、AVアプリケーション３３において、キャッシュ機能を利用しない場合には、AVアプリケーション３３からのIRPに対するキャッシュ処理の分のオーバヘッドが生じることによる、そのIRPの処理の遅延を防止し、AVアプリケーション３３によるAVデータの再生や記録のリアルタイム性を向上させることができる。
【０４０９】
一方、他のアプリケーション３１や３２は、Win32サブシステム５１が提供するAPI関数ReadFile()またはWriteFile()を直接呼び出すことにより、データの読み出しまたは書き込みを要求するので、データの読み出しまたは書き込みにあたっては、必ず、キャッシュ機能を利用することになる。
【０４１０】
このキャッシュ機能の利用により、PD_FS５４からPDストレージ５５に対して、アプリケーション３１や３２からのIRPが出力される頻度が低下する。これにより、アプリケーション３１や３２からのIRPによって要求されるデータの読み書きによって生じるドライブ２のシーク、さらには、そのデータの読み書き後の、AVアプリケーション３３からのIRPによって要求されるデータの読み書き時に生じるドライブ２のシークの発生を防止（低減）し、やはり、AVアプリケーション３３によるAVデータの再生や記録のリアルタイム性を向上させることができる。
【０４１１】
次に、上述の第１乃至第３の機能のうちのいずれかと、キャッシュオン／オフ機能とは、組み合わせて使用することができる。
【０４１２】
図２４は、第１または第２の機能のうちのいずれか一方と、キャッシュオン／オフ機能とを組み合わせて使用する場合のPDフィルタ５３の構成例を示している。
【０４１３】
図２４においては、PDフィルタ５３は、第１の機能の処理で説明したように、アプリケーション３１乃至３３からの、光ディスク３に対するアクセス要求に対応するIRPに対して、IRPプライオリティを設定し、そのIRPプライオリティが設定されたIRPをキュー８１に記憶させる。そして、PDフィルタ５３は、キュー８１に記憶されたIRPを、そのIRPに設定されたプライオリティにしたがって読み出し、PD_FS５４に出力する。
【０４１４】
あるいは、PDフィルタ５３は、第２の機能の処理で説明したように、アプリケーション３１乃至３３からの、光ディスク３に対するアクセス要求に対応するIRPの処理の許可または不許可を表すポーズフラグを設定する一方、アプリケーション３１乃至３３からのIRPをキュー８１に記憶させる。そして、PDフィルタ５３は、キュー８１に記憶されたIRPを、ポーズフラグにしたがって読み出し、PD_FS５４に出力する。
【０４１５】
さらに、PDフィルタ５３は、キャッシュオン／オフ機能の処理で説明したように、AVアプリケーション３３からのIRPについて、キャッシュ機能の利用の有無を設定し、IRPをPD_FS５４に出力する際、その設定結果にしたがって、そのIRPを処理する。
【０４１６】
図２５は、第３の機能とキャッシュオン／オフ機能とを組み合わせて使用する場合のPDフィルタ５３の構成例を示している。
【０４１７】
図２５においては、PDフィルタ５３は、第３の機能の処理で説明したように、AVアプリケーション３３以外のアプリケーション、即ち、アプリケーション３１および３２（のプロセス）からのIRPの、PD_FS５４への出力をオン／オフする機能的なスイッチ１０１を有し、その機能的なスイッチ１０１を、レジストリ５８に記憶されたスイッチ設定情報にしたがってオンまたはオフにすることによって、アプリケーション３１および３２からのIRPの、PD_FS５４への出力を制御する。
【０４１８】
さらに、PDフィルタ５３は、キャッシュオン／オフ機能の処理で説明したように、AVアプリケーション３３からのIRPについて、キャッシュ機能の利用の有無を設定し、IRPをPD_FS５４に出力する際、その設定結果にしたがって、そのIRPを処理する。
【０４１９】
以上のように、第１乃至第３の機能のうちのいずれかと、キャッシュオン／オフ機能とを組み合わせて使用する場合にも、アプリケーション３１および３２が光ディスク３にアクセスすることに起因するシークを抑制（防止）すること等ができ、これにより、アプリケーション３３によるAVデータのリアルタイムでの再生や記録を行うことが可能となる。
【０４２０】
なお、本実施の形態では、データの記録や再生が行われる記録媒体として、光ディスクを採用することとしたが、本発明は、その他、例えば、ハードディスクその他のディスク状の記録媒体などのシークが生じる記録媒体に対してデータの記録や再生を行う場合に適用可能である。
【０４２１】
また、本明細書において、PC１に各種の処理を行わせるためのプログラムを記述する処理ステップは、必ずしもフローチャートとして記載された順序に沿って時系列に処理する必要はなく、並列的あるいは個別に実行される処理（例えば、並列処理あるいはオブジェクトによる処理）も含むものである。
【図面の簡単な説明】
【０４２２】
【図１】本発明を適用した情報処理システムの一実施の形態の構成例を示すブロック図である。
【図２】PC１のハードウェア構成例を示すブロック図である。
【図３】CPU１２が実行するプログラムを示す図である。
【図４】OS３０の内部構成例（ファイルシステム）を示すブロック図である。
【図５】OS３０内で行われる処理の概要を説明するフローチャートである。
【図６】第１または第２の機能を実装したPDフィルタ５３の構成例を示すブロック図である。
【図７】PD_API４１が提供するAPI関数を示す図である。
【図８】IRP_MJ_DEVICE_CONTROLで指定されるユーザ定義のIOCTLを示す図である。
【図９】第１の機能の処理を説明するフローチャートである。
【図１０】第１の機能の処理を説明するフローチャートである。
【図１１】第１の機能の処理を説明するフローチャートである。
【図１２】PD_API４１が提供するAPI関数を示す図である。
【図１３】IRP_MJ_DEVICE_CONTROLで指定されるユーザ定義のIOCTLを示す図である。
【図１４】第２の機能の処理を説明するフローチャートである。
【図１５】第２の機能の処理を説明するフローチャートである。
【図１６】第２の機能の処理を説明するフローチャートである。
【図１７】第３の機能を実装したPDフィルタ５３の構成例を示すブロック図である。
【図１８】第３の機能の処理を説明するフローチャートである。
【図１９】キャッシュオン／オフ機能を実装したPDフィルタ５３の構成例を示すブロック図である。
【図２０】PD_API４１が提供するAPI関数を示す図である。
【図２１】IRP_MJ_DEVICE_CONTROLで指定されるユーザ定義のIOCTLを示す図である。
【図２２】キャッシュオン／オフ機能の処理を説明するフローチャートである。
【図２３】キャッシュオン／オフ機能の処理を説明するフローチャートである。
【図２４】第１または第２の機能のうちのいずれか一方と、キャッシュオン／オフ機能とを組み合わせて使用する場合のPDフィルタ５３の構成例を示すブロック図である。
【図２５】第３の機能のうちのいずれか一方と、キャッシュオン／オフ機能とを組み合わせて使用する場合のPDフィルタ５３の構成例を示すブロック図である。
【符号の説明】
【０４２３】
１  PC，  ２  ドライブ，  ３  光ディスク，  ４  1394ケーブル，  １１  バス，  １２  CPU，  １３  ROM，  １４  RAM，  １５  ハードディスク，  １６  出力部，  １７  入力部，  １８  通信部，  １９  ドライブ，  ２０  入出力インタフェース，  ２１  リムーバブル記録媒体，  ２２  IEEE1394I/F，  ３０  OS，  ３１乃至３３  アプリケーション，  ４１  PD_API，  ５１  Win32サブシステム，  ５２  NT入出力マネージャ，  ５３  PDフィルタ，  ５３Ａ  フィルタコア，  ５４  PD_FS，  ５４Ａ  FSコア，  ５５  PDストレージ，  ５６  SBP2ドライバ，  ５７  1394バスドライバ，  ５８  レジストリ，  ５９  NTキャッシュマネージャ，  ８１Ａ，８１Ｂ  キュー，  １０１  スイッチ，  １１１  コマンドバッファ
【図１】
2005302221.tif 000003
【図２】
2005302221.tif 000004
【図３】
2005302221.tif 000005
【図４】
2005302221.tif 000006
【図５】
2005302221.tif 000007
【図６】
2005302221.tif 000008
【図７】
2005302221.tif 000009
【図８】
2005302221.tif 000010
【図９】
2005302221.tif 000011
【図１０】
2005302221.tif 000012
【図１１】
2005302221.tif 000013
【図１２】
2005302221.tif 000014
【図１３】
2005302221.tif 000015
【図１４】
2005302221.tif 000016
【図１５】
2005302221.tif 000017
【図１６】
2005302221.tif 000018
【図１７】
2005302221.tif 000019
【図１８】
2005302221.tif 000020
【図１９】
2005302221.tif 000021
【図２０】
2005302221.tif 000022
【図２１】
2005302221.tif 000023
【図２２】
2005302221.tif 000024
【図２３】
2005302221.tif 000025
【図２４】
2005302221.tif 000026
【図２５】
2005302221.tif 000027
【手続補正書】
【提出日】平成17年5月16日(2005.5.16)
【手続補正１】
【補正対象書類名】明細書
【補正対象項目名】０１２４
【補正方法】変更
【補正の内容】
【０１２４】
なお、PDフィルタ５３が、以上のような第１の機能（後述する第２および第３の機能についても同様）の処理を行うためのスレッドは、PDフィルタ５３のレイヤであるファイルシステムフィルタドライバのレイヤで作成する。IRPを記憶させるキュー８１も、ファイルシステムフィルタドライバのレイヤで作成する。