以下に本発明の実施の形態を説明するが、請求項に記載の構成要件と、発明の実施の形態における具体例との対応関係を例示すると、次のようになる。この記載は、請求項に記載されている発明をサポートする具体例が、発明の実施の形態に記載されていることを確認するためのものである。従って、発明の実施の形態中には記載されているが、構成要件に対応するものとして、ここには記載されていない具体例があったとしても、そのことは、その具体例が、その構成要件に対応するものではないことを意味するものではない。逆に、具体例が構成要件に対応するものとしてここに記載されていたとしても、そのことは、その具体例が、その構成要件以外の構成要件には対応しないものであることを意味するものでもない。
さらに、この記載は、発明の実施の形態に記載されている具体例に対応する発明が、請求項に全て記載されていることを意味するものではない。換言すれば、この記載は、発明の実施の形態に記載されている具体例に対応する発明であって、この出願の請求項には記載されていない発明の存在、すなわち、将来、分割出願されたり、補正により追加される発明の存在を否定するものではない。
請求項1に記載の情報処理装置は、
アプリケーションからの記録媒体へのアクセスの要求であるアクセス要求を処理する情報処理装置(例えば、図4のPDフィルタ53など)において、
アプリケーションからの前記アクセス要求に対して、特有のプライオリティを設定するプライオリティ設定手段(例えば、図10のステップS59やS60の処理を行う図6のフィルタコア53Aなど)と、
前記プライオリティが設定された前記アクセス要求を、キュー(例えば、図6のキュー81Aや81Bなど)に記憶させるキュー制御手段(例えば、図10のステップS61の処理を行う図6のフィルタコア53Aなど)と、
前記キューに記憶された前記アクセス要求を、前記プライオリティにしたがって処理するアクセス要求処理手段(例えば、図11のステップS72の処理を行う図6のフィルタコア53Aなど)と
を備えることを特徴とする。
請求項3に記載の情報処理装置は、
キャッシュ機能の利用の有無を設定するキャッシュ機能設定手段(例えば、図23のステップS304やS305の処理を行う図19のフィルタコア53Aなど)をさらに備え、
前記アクセス要求処理手段は、さらに、前記キャッシュ機能設定手段によるキャッシュ機能の利用の有無の設定結果にしたがって、前記アクセス要求を処理する
ことを特徴とする。
請求項5に記載の情報処理装置は、
前記アクセス要求をフィルタリングし、ファイルシステムドライバに渡すフィルタドライバ(例えば、図4のPDフィルタ53など)である
ことを特徴とする。
請求項8に記載の情報処理方法は、
アプリケーションからの記録媒体へのアクセスの要求であるアクセス要求を処理する情報処理方法において、
アプリケーションからの前記アクセス要求に対して、特有のプライオリティを設定するプライオリティ設定ステップ(例えば、図10のステップS59やS60)と、
前記プライオリティが設定された前記アクセス要求を、キューに記憶させるキュー制御ステップ(例えば、図10のステップS61)と、
前記キューに記憶された前記アクセス要求を、前記プライオリティにしたがって処理するアクセス要求処理ステップ(例えば、図11のステップS72)と
を含むことを特徴とする。
請求項9に記載のプログラムおよび請求項10に記載のプログラム記録媒体に記録されているプログラムは、
アプリケーションからの記録媒体へのアクセスの要求であるアクセス要求の処理を、コンピュータに行わせるプログラムにおいて、
アプリケーションからの前記アクセス要求に対して、特有のプライオリティを設定するプライオリティ設定ステップ(例えば、図10のステップS59やS60)と、
前記プライオリティが設定された前記アクセス要求を、キューに記憶させるキュー制御ステップ(例えば、図10のステップS61)と、
前記キューに記憶された前記アクセス要求を、前記プライオリティにしたがって処理するアクセス要求処理ステップ(例えば、図11のステップS72)と
を含むことを特徴とする。
以下、図面を参照して、本発明の実施の形態について説明する。
図1は、本発明を適用した情報処理システムの一実施の形態の構成例を示している。
図1において、情報処理システムは、PC(Personal Computer)1とドライブ2とで構成されている。
PC1は、OS(Operating System)や、アプリケーション(プログラム)を記憶しており、OSの制御の下、アプリケーションを実行することで、各種の処理を行う。
ドライブ2は、例えば、上述したPD(Professional Disc)ドライブで、1394ケーブル4を介して、PC1と接続されている。ドライブ2は、PDである光ディスク3の着脱が可能となっており、PC1との間で、IEEE(Institute of Electronic and Electronics Engineers)1394の規格に準拠した通信を行うことにより、光ディスク3に対して、AVデータその他のデータの読み書きを行う。
なお、ドライブ2は、PDドライブである必要はなく、光ディスクもPDである必要はない。また、PC1とドライブ2との間では、IEEE1394以外の規格に準拠した通信を行うことが可能である。
次に、図2は、図1のPC1のハードウェア構成例を示している。
PC1は、CPU(Central Processing Unit)12を内蔵している。CPU12には、バス11を介して、入出力インタフェース20が接続されており、CPU12は、入出力インタフェース20を介して、ユーザによって、キーボードや、マウス、マイク等で構成される入力部17が操作等されることにより指令が入力されると、それにしたがって、ROM(Read Only Memory)13に格納されているプログラムを実行する。あるいは、また、CPU12は、ハードディスク15に格納されているプログラム、衛星若しくはネットワークから転送され、通信部18で受信されてハードディスク15にインストールされたプログラム、またはドライブ19に装着されたリムーバブル記録媒体21から読み出されてハードディスク15にインストールされたプログラムを、RAM(Random Access Memory)14にロードして実行する。これにより、CPU12は、後述するフローチャートにしたがった処理、あるいは後述するブロック図の構成により行われる処理を行う。そして、CPU12は、その処理結果を、必要に応じて、例えば、入出力インタフェース20を介して、LCD(Liquid Crystal Display)やスピーカ等で構成される出力部16から出力、あるいは、通信部18から送信、さらには、ハードディスク15に記録等させる。
また、PC1においては、入出力インタフェース20に、IEEE1394の規格に準拠した通信制御を行うIEEE1394I/F(InterFace)22が接続されている。IEEE1394I/F22には、1394ケーブル4を介して、ドライブ2が接続されている。CPU12は、バス11、入出力インタフェース20、IEEE1394I/F22、および1394ケーブル4を介して、ドライブ2にアクセスし、そのドライブ2に装着されている光ディスク3に対して、データを読み書きすることができる。
ここで、CPU12は、OSや各種のアプリケーションのプログラムを実行するが、これらのプログラムは、PC1に内蔵されている記録媒体としてのハードディスク15やROM13に予め記録しておくことができる。
あるいはまた、プログラムは、フレキシブルディスク、CD-ROM(Compact Disc Read Only Memory),MO(Magneto Optical)ディスク,DVD(Digital Versatile Disc)、磁気ディスク、半導体メモリなどのリムーバブル記録媒体21に、一時的あるいは永続的に格納(記録)しておくことができる。このようなリムーバブル記録媒体21は、いわゆるパッケージソフトウエアとして提供することができる。
なお、プログラムは、上述したようなリムーバブル記録媒体21からPC1にインストールする他、ダウンロードサイトから、ディジタル衛星放送用の人工衛星を介して、PC1に無線で転送したり、LAN(Local Area Network)、インターネットといったネットワークを介して、PC1に有線で転送し、PC1では、そのようにして転送されてくるプログラムを、通信部18で受信し、内蔵するハードディスク15にインストールすることができる。
次に、図3は、図2のCPU12が実行するプログラムを示す図である。
例えば、OS30、およびアプリケーション31乃至33(のプログラム)が、少なくとも、図2のハードディスク15にインストールされており、CPU12は、PC1の電源がオンにされると、ハードディスク15からRAM14に、OS30をロードして実行する。さらに、例えば、ユーザが入力部17を操作するなどして、アプリケーション31や、32,33の起動を要求すると、CPU12は、ハードディスク15からRAM14に、アプリケーション31や、32,33をロードし、OS30の制御の下で実行する。
そして、アプリケーション31乃至33が、例えば、ドライブ2に装着された光ディスク3へのアクセスの要求であるアクセス要求を行うと、OS30は、そのアクセス要求を処理する。これにより、ドライブ2において、アプリケーション31乃至33からのアクセス要求によって記録が要求されたデータが、光ディスク3に記録される。あるいは、ドライブ2において、アプリケーション31乃至33からのアクセス要求によって再生(読み出し)が要求されたデータが、光ディスク3から読み出され、OS30を介して、アクセス要求を行ったアプリケーションに渡される。
なお、図2のハードディスク15にインストールするアプリケーションは、アプリケーション31乃至33の3つに限定されるものではなく、1つや、2つ、4以上であっても良い。
但し、ここでは、ハードディスク15にインストールされている3つのアプリケーション31乃至33のうちの1つであるアプリケーション33が、外部からのAVデータの取り込みや、AVデータの編集、記録、再生などを行うアプリケーションとなっているものとする。そこで、アプリケーション33を、以下、適宜、AVアプリケーション33ともいう。
AVアプリケーション33は、DLL(Dynamic Link Library)であるPD_API(PD_API.DLL)41を呼び出し、このPD_API41を介して、光ディスク3に対するアクセス要求を行う。PD_API41は、光ディスク3に対するアクセスに関する、後述する固有のAPI(Application Program Interface)を提供するDLLである。
次に、OS30としては、例えば、Unix(R)や、Linux、さらには、マイクロソフト社のWindows(R)と呼ばれているもの、その他の任意のOSを採用することができるが、ここでは、例えば、Windows(R)のNT系のOSが採用されている。なお、Windows(R)のNT系のOSとしては、現在、"Windows(R) NT", "Windows(R) 2000", "Windows(R) XP"がある。
図4は、OS30として、Windows(R)のNT系のOSが採用されている場合の、ドライブ2(の光ディスク3)へのアクセスに関する部分のOS30の構成例を示している。
なお、図4では、特に、OS30におけるデバイスドライバのレイヤ(layer)構成を、アプリケーション31乃至33との関係が分かるように示してある。
Windows(R)のNT系のOSであるOS30は、マイクロカーネル技術とオブジェクト指向技術をベースとし、各サービスを、サブシステムによって実装している。
Win32サブシステム(Win32 SubSystem)51は、サブシステムの1つで、アプリケーション31乃至33に対して、各種のAPI(関数)を提供し、例えば、メモリ管理、プロセス管理、グラフィックス描画などを行う。
即ち、Win32サブシステム51は、アプリケーション31乃至33から、例えば、I/O(Input/Output)関係のAPI関数が呼び出されると、そのAPI関数に応じたI/O要求を、NT入出力マネージャ(NT I/O Manager)52に出力する。
なお、Win32サブシステム51が提供するAPI関数としては、例えば、ファイルの生成を行うCreateFile()、ファイル(ファイルに記録されたデータ)の読み出しを行うReadFile()、ファイル(ファイルへのデータ)の書き込みを行うWriteFile()、その他の各種の処理を行うDeviceIoControl()などがある。
NT入出力マネージャ52は、レイヤ構造のデバイスドライバ(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入出力マネージャ52では、Win32サブシステム51による、例えば、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)のレイヤ以上のレイヤで使用される。
図4では、ストレージクラスドライバのレイヤ以上のレイヤのデバイスドライバとして、ストレージクラスドライバであるPDストレージ55、ストレージクラスドライバの1つ上位のレイヤのファイルシステムドライバ(FileSystem Driver)であるPD_FS54、およびファイルシステムドライバの1つ上位のレイヤのファイルシステムフィルタドライバ(FileSystem Filter Driver)であるPDフィルタ53の3つのデバイスドライバが存在する。
従って、本実施の形態では、NT入出力マネージャ52は、これらのPDフィルタ53、PD_FS54、PDストレージ55に対して、IRPを渡すためのサービスを提供する。
具体的には、NT入出力マネージャ52は、Win32サブシステム51からのI/O要求を、IRPに変換し、例えば、PDフィルタ53に出力する。そして、PDフィルタ53が、NT入出力マネージャ52からのIRPに応じた要求を、例えば、NT入出力マネージャ52に出力し、NT入出力マネージャ52は、PDフィルタ53からの要求を、IRPに変換して、その1つ下位のレイヤのPD_FS54に出力する。さらに、PD_FS54が、NT入出力マネージャ52からのIRPに応じた要求を、例えば、NT入出力マネージャ52に出力すると、NT入出力マネージャ52は、PD_FS54からの要求を、IRPに変換し、その1つ下位のレイヤのPDストレージ55に出力する。
PDフィルタ53は、PDドライブであるドライブ2用のファイルシステムフィルタドライバであり、かつ、後述するPD_FS54の上位のファイルシステムフィルタドライバである。PDフィルタ53は、アプリケーション31乃至33から、Win32サブシステム51およびNT入出力マネージャ52を介して供給される、ファイルシステムに関連するファイルシステム要求その他の要求(request)のフィルタリングを行い、そのフィルタリングの結果、PD_FS54に渡すべき要求を得て、NT入出力マネージャ52を介して、PD_FS54に出力する等の処理を行う。
なお、PDフィルタ53は、フィルタコア53Aを有し、アプリケーション31乃至33からの要求のフィルタリングなどのPDフィルタ53における主要な処理は、フィルタコア53Aが行う。また、PDフィルタ53は、例えば、Windows(R)レジストリであるレジストリ58に設定(記憶)されている情報を参照して、要求のフィルタリングを行う。
PD_FS54は、PDドライブであるドライブ2用のファイルシステムドライバで、ドライブ2に装着されたPDである光ディスク3に記録された(記録される)ファイルの管理を行う。即ち、PD_FS54は、例えば、光ディスク3に記録されたデータ(ファイル)の管理情報としてのファイルシステムに基づき、PDフィルタ53からNT入出力マネージャ52を介して要求されたファイルの書き込みや読み出しの要求を、NT入出力マネージャ52を介して、PDストレージ55に出力する。
ここで、ファイルシステムドライバは、一般に、ファイルストリーム(File Stream)(ファイルに記録される(記録された)データのファイル)やファイルメタ(File Meta)情報のキャッシュ(Cache)機能を有し、このキャッシュ機能によれば、例えば、キャッシュされたファイルストリームやファイルメタ情報については、光ディスク3に実際にアクセスせずに、高速に得ることができる。
Windows(R)のNT系のOSでは、NTキャッシュマネージャ(NT Cache Manager)59が、キャッシュ機能を有しており、PD_FS54は、NTキャッシュマネージャ59を利用して、キャッシュ機能を提供する。
なお、PD_FS54は、FSコア54Aを有し、PD_FS54における主要な処理は、FSコア54Aが行う。
PDストレージ55は、PDドライブであるドライブ2の実際のデバイスドライバにあたるストレージクラスドライバで、上位のレイヤのデバイスドライバであるPD_FS54から、NT入出力マネージャ52を介して供給される要求としてのIRPを、例えば、SCSI(Small Computer System Interface)コード(SCSI Code)に変換し、SBP(Serial Bus Protocol)2ドライバ56に出力する。
ここで、PDストレージ55において、IRPをSCSIコードに変換するのは、SCSIコードが、後段のSBP2ドライバ56で扱われるSBP2と、いわば親和性が良いからである。
SBP2ドライバ56は、PDストレージ55からのSCSIコードを、SBP2に準拠したデータであるSBP2データに変換し(SBP2プロトコルに変換し)、1394バスドライバ(IEEE1394 bus Driver)57に供給する。
ここで、本実施の形態では、SBP2ドライバ56の後段の1394バスドライバ57により制御されるIEEE1394の規格に準拠した通信においてファイルシステムを扱うことができるプロトコルとして、SBP2を採用しているが、SBP2以外のプロトコルを採用することも可能である。
1394バスドライバ57は、IEEE1394I/F22(図2)を制御することにより、SBP2ドライバ56からのSBP2データなどを、ドライブ2に送信し、また、ドライブ2から送信されてくる、光ディスク3から読み出されたデータを受信する。
ここで、本実施の形態では、PC1とドライブ2との間で、IEEE1394の規格に準拠した通信を行うこととしているが、PC1とドライブ2との間では、その他の通信を行うことが可能である。この場合、1394バスドライバ57に代えて、PC1とドライブ2との間の通信に対応したバスドライバが用いられる。
なお、図4において、アプリケーション31乃至33のうちのAVアプリケーション33が利用するPD_API41は、上述したように、固有のAPI(API関数)を提供する。即ち、PD_API41は、AVアプリケーション33から、その固有のAPI関数が呼び出されると、そのAPI関数に応じて、Win32サブシステム51が提供するAPI関数DeviceIoCotrol()を使用することにより、ユーザ定義のIOCTLが指定されたIRP_MJ_DEVICE_CONTROLのIRPを、NT入出力マネージャ52を介して、PDフィルタ53に供給する。これにより、PD_API41は、PDフィルタ53の固有の機能、即ち、ユーザ定義のIOCTLが表す機能を制御する。
このようなPD_API41を含むAVアプリケーション33は、PDドライブであるドライブ2を使用するのに必要なPDフィルタ53、PD_FS54、およびPDストレージ55とともに、例えば、リムーバブル記録媒体21(図2)に記録して販売することができる。また、PD_API41を含むAVアプリケーション33、PDフィルタ53、PD_FS54、およびPDストレージ55が記録されたリムーバブル記録媒体21は、単体で販売する他、例えば、ドライブ2に同梱し、ドライブ2の付属品として販売することができる。
ここで、図4において、アプリケーション31乃至33と、Win32サブシステム51とは、ユーザモード(User Mode)で動作し、NT入出力マネージャ52、PDフィルタ53、PD_FS54、PDストレージ55、SBP2ドライバ56、および1394バスドライバ57は、カーネルモード(Kernel Mode)で動作する。
さらに、図4では、NT入出力マネージャ52が、IRPを、ファイルシステムフィルタドライバであるPDフィルタ53や、ファイルシステムドライバであるPD_FS54を渡すことによって、ファイルシステムフィルタドライバやファイルシステムドライバに対して、処理の要求を行うこととしたが、Windows(R)のNT系のOSのNT入出力マネージャ52は、IRPの他、FastIOを、ファイルシステムフィルタドライバやファイルシステムドライバに渡すことにより、処理の要求を行うことが可能である。
即ち、NT入出力マネージャ52は、ファイルシステムフィルタドライバやファイルシステムドライバに対して、IRPの他、FastIOを渡すためのサービスも提供し、これにより、ファイルシステムフィルタドライバやファイルシステムドライバに対して、処理の要求を行う。
従って、Windows(R)のNT系のOSのファイルシステムフィルタドライバやファイルシステムドライバは、一般に、IRPとFastIOの両方をサポートする。
なお、FastIOによれば、例えば、ファイルの読み出し(Read)や書き込み(Write)が、NTキャッシュマネージャ59に対して直に行われる。
また、以下では、IRPとFastIOのうちの、例えば、IRPを用いることとする。但し、以下、説明する機能は、FastIOによっても実現することができる。
次に、図5のフローチャートを参照して、アプリケーション31乃至33から光ディスク3に対するアクセスが要求されたときに図4のOS30内におけるPDフィルタ53,PD_FS54,PDストレージ55,SBP2ドライバ56,1394バスドライバ57の処理の概要について説明する。
なお、以下の説明と図5以降の図面においては、それぞれ、Win32サブシステム51およびNT入出力マネージャ52の説明と図示を、適宜省略する。
アプリケーション31乃至33が、例えば、光ディスク3に対するアクセスを要求するAPI関数を呼び出すと、そのAPI関数に応じた要求が、Win32サブシステム51からNT入出力マネージャ52に供給され、NT入出力マネージャ52は、Win32サブシステム51からの要求に応じたIRPが、PDフィルタ53に供給される。
PDフィルタ53は、ステップS1において、NT入出力マネージャ52からのIRPを受信し、ステップS2に進む。PDフィルタ53は、ステップS2において、NT入出力マネージャ52からのIRPをフィルタリングして、ステップS3に進み、PD_FS54に供給すべきIRPをキューイングする。即ち、PDフィルタ53は、図4には図示していないキューに、NT入出力マネージャ52からのIRPを供給して記憶させる。
さらに、PDフィルタ53は、キューに記憶されたIRPを読み出し、NT入出力マネージャ52を介して、PD_FS54に供給して、ステップS4に進む。
ステップS4では、PD_FS54は、PDフィルタ53からのIRPによって要求されているデータについて、NTキャッシュマネージャ59のキャッシュ機能を利用するのに必要な処理としてのキャッシュ処理を行い、ステップS5に進み、例えば、PDフィルタ53からのIRPによって要求されているデータが、NTキャッシュマネージャ59にキャッシュされているかどうかを判定する。
ステップS5において、PDフィルタ53からのIRPによって要求されているデータが、NTキャッシュマネージャ59にキャッシュされていると判定された場合、ステップS6に進み、PD_FS54は、PDフィルタ53からのIRPによって要求されているデータを、NTキャッシュマネージャ59から受信する等し、そのIRPに対する応答を、PDフィルタ53およびWin32サブシステムを介して、そのIRPに対応するAPI関数を呼び出したアプリケーション(図4では、アプリケーション31乃至33のうちのいずれか)に返す。
一方、ステップS5において、PDフィルタ53からのIRPによって要求されているデータが、NTキャッシュマネージャ59にキャッシュされていないと判定された場合、ステップS7に進み、PD_FS54は、PDフィルタ53からのIRPを、NT入出力マネージャ52を介して、PDストレージ55に供給して、ステップS8に進む。
ステップS8では、PDストレージ55は、PD_FS54からのIRPを、対応するSCSIコードに変換し、SBP2ドライバ56に供給して、ステップS9に進む。ステップS9では、SBP2ドライバ56は、PDストレージ55からのSCSIコードを、SBP2データに変換し、1394バスドライバ57に供給して、ステップS10に進む。
ステップS10では、1394バスドライバ57は、IEEE1394I/F22(図2)を制御することにより、SBP2ドライバ56からのSBP2データを、ドライブ2に送信する。
そして、1394バスドライバ57は、ドライブ2から、ステップS10で送信したSBP2データに対する応答が送信されてくるのを待って、ステップS11において、その応答を受信し、SBP2ドライバ56、PDストレージ55、PD_FS54、PDフィルタ53、およびWin32サブシステム51を介して、ステップS1で受信されたIRPを送信してきたアプリケーション(図4では、アプリケーション31乃至33のうちのいずれか)に返す。
ところで、図4において、アプリケーション31乃至33のうちのいずれか1のアプリケーションが光ディスク3にアクセスする前に、他の1のアプリケーションが光ディスク3にアクセスしていると、1のアプリケーションが光ディスク3にアクセスするときに、ドライブ2においてシークが発生する。
また、1のアプリケーションが光ディスク3にアクセスしようとするときに、他の1のアプリケーションが光ディスク3にアクセスしていると、1のアプリケーションは、光ディスク3へのアクセスを待たされることになる。
一方、図4において、アプリケーション31乃至33のうちのアプリケーション33は、PDである光ディスク3に対するAVデータの書き込み(記録)や読み出し(再生)などを行うAVアプリケーションである。
従って、PDドライブであるドライブ2が、AVアプリケーション33のみのアクセスに対して、AVデータをリアルタイムで読み書きすることができるように設計されている場合には、アプリケーション31や32による光ディスク3のアクセスによって、シークが発生し、あるいは、AVアプリケーション33のアクセスが待たされると、AVアプリケーション33がAVデータをリアルタイムで読み書きすることが妨げられることになる。
そこで、PDフィルタ53は、以下の第1乃至第3の機能の1以上を実装しており、その実装しているいずれか1の機能によって、光ディスク3に対するAVデータのリアルタイムでの読み書きが妨げられることを防止し、AVデータをリアルタイムで読み書きすることを保証するようになっている。
即ち、第1の機能によれば、PDフィルタ53は、アプリケーション31乃至33からの、光ディスク3に対するアクセス要求に対応するIRPに対して、特有のプライオリティを設定し、その特有のプライオリティが設定されたIRPをキューに記憶させる。そして、PDフィルタ53は、キューに記憶されたIRPを、そのIRPに設定されたプライオリティにしたがって処理する。これにより、PDフィルタ53は、例えば、AVアプリケーション33からのIRP(AVアプリケーション33からのアクセス要求に対応するIRP)を優先的に処理し、AVアプリケーション33によるAVデータのリアルタイムでの読み書きを保証する。
図6は、以上のような第1の機能を実装したPDフィルタ53の構成例を示している。なお、図6においては、アプリケーション31乃至33も図示してある。
Windows(R)のNT系のOSであるOS30では、アプリケーションの実行は、プロセスと呼ばれる単位で行われる。さらに、プロセスの実行には、1以上のスレッドが割り当てられ、そのスレッドにおいて、プロセスが実行される。
図6では、アプリケーション31は、プロセス71と72の2つのプロセスから構成されている。そして、プロセス71は、2つのスレッド71Aと71Bで実行されており、プロセス72は、1つのスレッド72Aで実行されている。
また、アプリケーション32は、1つのプロセス73で構成されており、プロセス73は、2つのスレッド73Aと73Bで実行されている。
さらに、AVアプリケーション33は、プロセス74と75の2つのプロセスから構成されている。そして、プロセス74は、2つのスレッド74Aと74Bで実行されており、プロセス75は、1つのスレッド75Aで実行されている。なお、プロセス75は、PD_API41のプロセスとなっている。
Win32サブシステム51に対するAPI関数の呼び出しは、スレッド単位で行うことができる。従って、図6の実施の形態では、API関数の呼び出しは、スレッド71A,71B,72A,73A,73B,74A,74B,75Aそれぞれにおいて行うことができる。
なお、スレッドからのAPI関数の呼び出しは、そのスレッドで実行されているプロセスからのAPI関数の呼び出しと捉えることができる。
スレッド71A乃至75Aにおいて、API関数の呼び出しが行われると、そのAPI関数に対応するIRPが、NT入出力マネージャ52からPDフィルタ53に供給される。
PDフィルタ53では、フィルタコア53Aが、NT入出力マネージャ52からのIRPに対して、光ディスク3へのアクセスに関する特有のプライオリティ(以下、適宜、IRPプライオリティという)を設定する。
即ち、Windows(R)のNT系のOSであるOS30は、プロセス、さらにはスレッドにプライオリティを設定し、そのプライオリティにしたがって、プロセスまたはスレッドを処理する、いわば標準的なプライオリティ機能を有する。この標準的なプライオリティ機能によれば、例えば、CPU12や、RAM14、その他のPC1の資源は、OS30によって設定されたプライオリティが高いプロセスまたはスレッドに、優先的に割り当てられる。
従って、OS30の標準的なプライオリティ機能によって、例えば、AVアプリケーション33のプロセス74および75に対して、アプリケーション31のプロセス71および72、並びにアプリケーション32のプロセス73よりも高いプライオリティを設定することにより、AVアプリケーション33は、アプリケーション31および32よりも優先的に、光ディスク3にアクセスすることが可能となる。
しかしながら、OS30の標準的なプライオリティ機能は、光ディスク3に対するアクセスの他、CPU12の使用や、RAM14へのアクセスなども影響を与える。
従って、OS30の標準的なプライオリティ機能によって、AVアプリケーション33(のプロセス)のプライオリティを高く設定した場合には、OS30が提供する重要なサービスのプロセスがCPU12やRAM14を使用するのに、長時間待たされることがある。これにより、サービスが停止したのと等価な状態となり、最悪の場合には、例えば、PC1がハングアップすることになる。
そこで、PDフィルタ53では、フィルタコア53Aが、NT入出力マネージャ52からのIRPに対して、標準的なプライオリティ機能によるプライオリティとは独立した(関係のない)IRPプライオリティを設定する。
IRPプライオリティは、光ディスク3に対するアクセスのプライオリティである。従って、AVアプリケーション33(のプロセス)に対して、高いIRPプライオリティを設定した場合に、そのIRPプライオリティによって、OS30が提供するサービスのプロセスを含む他のプロセスが制限されるのは、光ディスク3に対するアクセスだけであり、CPU12やRAM14の使用は制限されない。このため、IRPプライオリティによれば、OS30が提供する重要なサービスが停止して、PC1がハングアップすることなどを防止することができる。
PDフィルタ53のフィルタコア53Aは、NT入出力マネージャ52からのIRPに対して、IRPプライオリティを設定すると、そのIRPを、キュー81Aまたは81Bに供給して記憶させる。即ち、キュー81Aと81Bは、フィルタコア53Aから供給される、IRPプライオリティが設定されたIRPを記憶する。
ここで、図6の実施の形態では、PDドライブであるドライブ2に、例えば、2つのボリューム(Volume)が存在するものとして、その2つのボリュームそれぞれに対するキューとして、2つのキュー81Aと81Bが設けられている。PDフィルタ53は、2つのボリュームのうちの、キュー81Aに対応するボリュームに対してのIRPを、キュー81Aに供給し、キュー81Bに対応するボリュームに対してのIRPを、キュー81Bに供給する。なお、以下、キュー81Aと81Bとを特に区別する必要がない限り、単に、キュー81と記述する
PDフィルタ53は、キュー81に記憶されたIRPを、そのIRPに設定されたIRPプライオリティにしたがって処理する。即ち、PDフィルタ53は、IRPプライオリティのより高いIRPを、キュー81から優先的に読み出し、NT入出力マネージャ52を介して、下位のレイヤのPD_FS54に供給する。
なお、PDフィルタ53が、以上のような第1の機能(後述する第2および第3の機能についても同様)の処理を行うためのスレッドは、PDフィルタ53のレイヤであるファイルシステムドライバのレイヤで作成する。IRPを記憶させるキュー81も、ファイルシステムドライバのレイヤで作成する。
PDフィルタ53は、第1の機能により、AVアプリケーション33からのIRPを、アプリケーション31および32からのIRPよりも優先的に処理するために、例えば、自身に登録されたプロセスID(ProcessID)のIRPには、最大のIRPプライオリティ(IRPプライオリティがとりうる値の最大値)を設定し、登録されていないプロセスIDのIRPには、最小のIRPプライオリティ(IRPプライオリティがとりうる値の最小値)を設定する。
即ち、OS30は、プロセスに対してユニークなプロセスIDを付して、各プロセスを管理するようになっており、各プロセスからのIRP(各プロセスが呼び出したAPI関数に対応するIRP)は、そのプロセスのプロセスIDを有している。そして、PDフィルタ53は、NT入出力マネージャ52から受信したあるプロセスからのIRPが有するプロセスIDが、自身に登録されたプロセスIDに一致する場合には、そのIRPに対して、最大のIRPプライオリティを設定し、一致しない場合(プロセスIDが登録されていない場合も含む)には、そのIRPに対して、最小のIRPプライオリティを設定する。
ここで、IRPプライオリティを表すデータとしては、例えば、5ビットを採用することができる。この場合、最大のIRPプライオリティは31となり、最小のIRPプライオリティは0となる。
一方、AVアプリケーション33で利用(ロード)されるPD_API41は、PDフィルタ53の第1の機能を利用するために、そのロード(load)時に、Win32サブシステム51が提供するAPI関数DeviceIoControl()によって、AVアプリケーション33のプロセス74と75のうちの、自身をロードするプロセス75のプロセスIDの登録を要求する。即ち、PD_API41は、AVアプリケーション33が起動され、そのAVアプリケーション33のプロセス75によってロードされると、そのプロセス75に割り当てられたプロセスIDの登録を、PDフィルタ53に対して要求するAPI関数DeviceIoControl()を呼び出す。
また、PD_API41は、自身をロードしたプロセス75の終了時に、そのプロセス75に割り当てられたプロセスIDの削除(登録されたプロセスIDの削除)を、PDフィルタ53に対して要求するAPI関数DeviceIoControl()を呼び出す。
従って、PD_API41のプロセス75が存在する限りは、PDフィルタ53において、そのプロセス75からのIRP(プロセス75(PD_API41)が呼び出したWin32サブシステム51が提供するAPI関数に対応するIRP)に対しては、最大のIRPプライオリティが設定される。
次に、図7は、PDフィルタ53が第1の機能の処理を行うときに、PD_API41が、PDフィルタ53を制御するために、AVアプリケーション33に提供する制御用(PDフィルタ53の制御用)のAPI(関数)を示している。
図7においては、PD_API41が、PDフィルタ53を制御するために、AVアプリケーション33に提供する制御用のAPI関数として、PdGetPriority()と、PdSetPriority()とが用意されている。
API関数PdGetPriority()とPdSetPriority()とは、いずれも、プロセスIDとIRPプライオリティとを、引数としてとる。
そして、API関数PdGetPriority()は、引数のプロセスIDを指定して呼び出すことにより、引数で指定されているプロセスIDのプロセスに対してPDフィルタ53が設定するIRPプライオリティを、その引数にセットして返す。さらに、API関数PdGetPriority()は、引数で指定されているプロセスIDのプロセスに対してPDフィルタ53が設定するIRPプライオリティの取得に成功した場合、戻り値として1を返し、失敗した場合、戻り値として0を返す。
従って、API関数PdGetPriority()によれば、任意のプロセスからのIRPに対して、PDフィルタ53が設定するIRPプライオリティを認識することができる。
API関数PdSetPriority()は、引数のプロセスIDとIRPプライオリティを指定して呼び出すことにより、引数で指定されているプロセスIDのプロセスに対してPDフィルタ53が設定するIRPプライオリティを、その引数で指定されているIRPプライオリティに変更する。さらに、API関数PdSetPriority()は、PDフィルタ53が設定するIRPプライオリティの変更に成功した場合、戻り値として1を返し、失敗した場合、戻り値として0を返す。
従って、API関数PdSetPriority()によれば、例えば、PDフィルタ53に登録されているプロセスIDと一致するプロセスID、または一致しないプロセスIDのプロセスからのIRPに対して、PDフィルタ53が設定するIRPプライオリティを変更することができる。
PD_API41は、API関数PdGetPriority()が呼び出されると、PDフィルタ53で設定されるIRPプライオリティを、PDフィルタ53に対して要求するAPI関数DeviceIoControl()を呼び出す。
また、PD_API41は、API関数PdSetPriority()が呼び出されると、PDフィルタ53で設定されるIRPプライオリティの変更を、PDフィルタ53に対して要求するAPI関数DeviceIoControl()を呼び出す。
以上のように、PD_API41は、PDフィルタ53の第1の機能を利用するために、プロセスIDの登録を要求するAPI関数DeviceIoControl()、およびプロセスIDの削除を要求するAPI関数DeviceIoControl()、さらには、必要に応じて、PDフィルタ53で設定されるIRPプライオリティを要求するAPI関数DeviceIoControl()や、PDフィルタ53で設定されるIRPプライオリティの変更を要求するAPI関数DeviceIoControl()を呼び出す。
API関数DeviceIoControl()が呼び出されると、Win32サブシステム51は、NT入出力マネージャ52に対して、そのAPI関数DeviceIoControl()に応じた要求を行い、NT入出力マネージャ52は、その要求を、IRP_MJ_DEVICE_CONTROLのIRPに変換し、PDフィルタ53に供給する。
このIRP_MJ_DEVICE_CONTROLのIRPでは、上述したように、ユーザ定義が可能なサブコードとしてのIOCTLが指定される。
図8は、PDフィルタ53が第1の機能の処理を行うときに、IRP_MJ_DEVICE_CONTROLで指定されるユーザ定義のIOCTLを示している。
図8では、IOCTL_PD_SET_PROCESSID, IOCTL_PD_DELETE_PROCESSID, IOCTL_PD_SET_RRIORITY, IOCTL_PD_GET_RRIORITYの4つの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フィルタ53への登録を要求するIOCTLである。
IOCTL_PD_DELETE_PROCESSIDは、プロセスIDの削除を要求するAPI関数DeviceIoControl()に対応するIRP_MJ_DEVICE_CONTROLのIRPのサブコードとなるIOCTLである。プロセスIDの削除を要求するAPI関数DeviceIoControl()は、例えば、その削除を要求するプロセスIDを、その引数としてとり、IOCTL_PD_DELETE_PROCESSIDは、その引数となっているプロセスIDの、PDフィルタ53からの削除を要求するIOCTLである。
IOCTL_PD_SET_RRIORITYは、PDフィルタ53で設定されるIRPプライオリティの変更を要求するAPI関数DeviceIoControl()に対応するIRP_MJ_DEVICE_CONTROLのIRPのサブコードとなるIOCTLで、PDフィルタ53で設定されるIRPプライオリティの変更を要求するAPI関数DeviceIoControl()に対応する図7のAPI関数PdSetPriority()の引数となっているプロセスIDのIRPに設定するIRPプライオリティを、同じく、その引数となっているIRPプライオリティに変更することを要求するIOCTLである。
IOCTL_PD_GET_RRIORITYは、PDフィルタ53で設定されるIRPプライオリティを要求するAPI関数DeviceIoControl()に対応するIRP_MJ_DEVICE_CONTROLのIRPのサブコードとなるIOCTLで、PDフィルタ53で設定されるIRPプライオリティを要求するAPI関数DeviceIoControl()に対応する図7のAPI関数PdGetPriority()の引数となっているプロセスIDのIRPに設定されるIRPプライオリティを要求するIOCTLである。
なお、上述したような、IRP_MJ_DEVICE_CONTROLのIRPのサブコードとなるユーザ定義のIOCTLは、Win32サブシステム51が提供するAPI関数DeviceIoControl()を利用して、Win32サブシステム51からNT入出力マネージャ52に渡され、NT入出力マネージャ52において、IRP_MJ_DEVICE_CONTROLのIRPのサブコードとして指定される。
次に、図9のフローチャートを参照して、PDフィルタ53が第1の機能を実装している場合の、図6におけるAVアプリケーション33、PD_API41、およびPDフィルタ53の処理の概要について説明する。
AVアプリケーション33が起動されると、AVアプリケーション33は、ステップS21において、AVアプリケーション33のプロセス74と75のうちのプロセス75によってPD_API41をロードする。PD_API41は、プロセス75によってロードされると、ステップS31において、自身をロードしたプロセス75のプロセスIDの登録を要求するAPI関数DeviceIoControl()を呼び出し、このAPI関数DeviceIoControl()の呼び出しによって、プロセス75のプロセスIDの登録を要求するIOCTL_PD_SET_PROCESSIDがIOCTLとして指定されているIRP_MJ_DEVICE_CONTROLのIRPが、NT入出力マネージャ52からPDフィルタ53に供給される。
PDフィルタ53は、ステップS41において、NT入出力マネージャ52からのIRPを受信し、そのIRPのIOCTL_PD_SET_PROCESSIDにしたがい、PD_API41のプロセス75のプロセスIDを登録する。
従って、この後は、PDフィルタ53において、PD_API41のプロセス75のプロセスIDが削除されない限り、そのプロセス75からのIRPには、最大のIRPプライオリティが設定され、他のプロセスからのIRPには、最小のIRPプライオリティが設定される。これにより、PDフィルタ53では、PD_API41のプロセス75からのIRPが優先的に(最優先で)処理される。
即ち、例えば、AVアプリケーション33が、ステップS22において、光ディスク3に対するアクセス要求としての、例えば、ファイルの読み出しを要求するAPI関数ReadFile()などを呼び出すと、PD_API41は、ステップS32において、そのAPI関数ReadFile()の呼び出しを受信し、ステップS33に進む。
ステップS33では、PD_API41は、AVアプリケーション33からのAPI関数ReadFile()の呼び出しに応じて、同一のAPI関数ReadFile()(Win32サブシステム51が提供するAPI関数ReadFile())を呼び出し、この呼び出しによって、ファイルの読み出しを要求するIRP_MJ_READのIRPが、NT入出力マネージャ52からPDフィルタ53に供給される。
PDフィルタ53は、ステップS42において、NT入出力マネージャ52からのIRP_MJ_READのIRPを受信し、そのIRP_MJ_READのIRPに対して、IRPプライオリティを設定する。
即ち、いまの場合、PDフィルタ53が受信したIRP_MJ_READのIRPは、PD_API41(のプロセス75)からのものである。また、ステップS41において、PDフィルタ53には、PD_API41のプロセス75のプロセスIDが登録されている。従って、ステップS42においてPDフィルタ53が、PD_API41のプロセス75から受信したIRP_MJ_READのIRPには、最大のIRPプライオリティが設定される。
その結果、PDフィルタ53では、PD_API41のプロセス75からのIRP_MJ_READのIRPが、他に、最大のIRPプライオリティが設定されているIRPが存在しない限り、即座に処理される。
即ち、PDフィルタ53では、ステップS43において、PD_API41のプロセス75からのIRP_MJ_READのIRPが、優先的に、PD_FS54に供給される。
その後、AVアプリケーション33が、例えば終了等されると、ステップS23において、AVアプリケーション33は、PD_API41(のプロセス75)に対してアンロードを要求する。
PD_API41は、アンロードの要求があると、ステップS34において、自身のプロセス75のプロセスIDの削除を要求するAPI関数DeviceIoControl()を呼び出し、このAPI関数DeviceIoControl()の呼び出しによって、プロセス75のプロセスIDの削除を要求するIOCTL_PD_DELETE_PROCESSIDがIOCTLとして指定されているIRP_MJ_DEVICE_CONTROLのIRPが、NT入出力マネージャ52からPDフィルタ53に供給される。
PDフィルタ53は、ステップS44において、NT入出力マネージャ52からのIRPを受信し、そのIRPのIOCTL_PD_DELETE_PROCESSIDにしたがい、PD_API41のプロセス75のプロセスIDを削除する。
従って、この後は、PDフィルタ53において、IRPは、OS30の標準的なプライオリティ機能によって設定されるプライオリティにしたがって処理される。
次に、図10および図11のフローチャートを参照して、図6のPDフィルタ53による第1の機能の処理について説明する。
まず、図10のフローチャートを参照して、第1の機能を実装する図6のPDフィルタ53において、IRPが受信されてから、そのIRPがキュー81に記憶されるまでの処理(キュー81への入力処理)について説明する。
アプリケーション31乃至33のうちのいずれかのプロセス(図6では、プロセス71乃至75のうちのいずれか)において、ドライブ2に対するI/O関係の処理を要求する(I/O要求を行う)API関数が呼び出されると、そのAPI関数の呼び出し(によってWin32サブシステム51が出力する要求)に応じて、NT入出力マネージャ52は、そのAPI関数に対応するIRPを、PDフィルタ53に供給する。
PDフィルタ53では、フィルタコア53Aが、ステップS51において、API関数を呼び出したプロセスからのIRP(プロセスによるAPI関数の呼び出しに応じて、NT入出力マネージャ52から供給されたIRP)を受信して、ステップS52に進み、そのIRPが、IOCTLとして、IOCTL_PD_SET_PROCESSID(図8)が指定されているIRP(IRP_MJ_DEVICE_CONTROLのIRP)であるかどうかを判定する。
ステップS52において、プロセスからのIRP(ステップS51でフィルタコア53Aが受信したIRP)が、IOCTL_PD_SET_PROCESSIDが指定されているIRPであると判定された場合、ステップS53に進み、フィルタコア53Aは、そのIRPに含まれるプロセスID、つまり、そのIRPに対応するAPI関数を呼び出したプロセスのプロセスIDを登録(記憶)し、ステップS51に戻る。
即ち、IOCTL_PD_SET_PROCESSIDが指定されているIRPには、そのIRPに対応するAPI関数を呼び出したプロセスのプロセスIDが含まれており、フィルタコア53Aは、そのプロセスIDを登録する。ここで、フィルタコア53Aにおいて登録されたプロセスIDを、以下、適宜、登録プロセスIDという。
一方、ステップS52において、プロセスからのIRPが、IOCTL_PD_SET_PROCESSIDが指定されているIRPでないと判定された場合、ステップS54に進み、フィルタコア53Aは、そのIRPが、IOCTLとして、IOCTL_PD_DELETE_PROCESSID(図8)が指定されているIRP(IRP_MJ_DEVICE_CONTROLのIRP)であるかどうかを判定する。
ステップS54において、プロセスからのIRPが、IOCTL_PD_DELETE_PROCESSIDが指定されているIRPであると判定された場合、ステップS55に進み、フィルタコア53Aは、登録プロセスIDを削除(消去)し、ステップS51に戻る。
また、ステップS54において、プロセスからのIRPが、IOCTL_PD_DELETE_PROCESSIDが指定されているIRPでないと判定された場合、ステップS56に進み、フィルタコア53Aは、そのIRPが、光ディスク3へのアクセスを要求するアクセス要求のIRPであるかどうかを判定する。
ステップS56において、プロセスからのIRPが、アクセス要求のIRPでないと判定された場合、即ち、プロセスからのIRPが、例えば、PDフィルタ53で設定されるIRPプライオリティの変更を要求するIOCTL_PD_SET_RRIORITY(図8)が、IOCTLとして指定されているIRP_MJ_DEVICE_CONTROLのIRPや、PDフィルタ53で設定されるIRPプライオリティを要求するIOCTL_PD_GET_RRIORITY(図8)が、IOCTLとして指定されているIRP_MJ_DEVICE_CONTROLのIRPなどである場合、ステップS57に進み、フィルタコア53Aは、そのIRPに応じた処理を行い、その処理結果に対応する応答を、NT入出力マネージャ52およびWin32サブシステム51を介して、IRPに対応するAPI関数を呼び出したプロセスに返し、ステップS51に戻る。
ここで、ステップS57では、例えば、プロセスからのIRPが、IOCTL_PD_SET_RRIORITY(図8)が指定されているIRPである場合、フィルタコア53Aは、そのIOCTL_PD_SET_RRIORITYで指定されているプロセスIDのプロセスからのIRPに設定するIRPプライオリティを、同じくIOCTL_PD_SET_RRIORITYで指定されているIRPプライオリティに変更する処理を行う。また、ステップS57では、例えば、プロセスからのIRPが、IOCTL_PD_GET_RRIORITY(図8)が指定されているIRPである場合、フィルタコア53Aは、そのIOCTL_PD_GET_RRIORITYで指定されているプロセスIDのプロセスからのIRPに設定するIRPプライオリティを、応答として返す。
一方、ステップS56において、プロセスからのIRPが、アクセス要求のIRPであると判定された場合、即ち、プロセスからのIRPが、例えば、ファイルの読み出しを要求するIRP_MJ_READのIRPや、ファイルの書き込みを要求するIRP_MJ_WRITEのIRPである場合、ステップS58に進み、フィルタコア53Aは、プロセスからのIRPに含まれるプロセスID、即ち、そのIRPに対応するAPI関数を呼び出したプロセスのプロセスIDが、登録プロセスIDに一致するかどうかを判定する。
ステップS58において、プロセスからのIRPに含まれるプロセスIDが、登録プロセスIDに一致しないと判定された場合、ステップS59に進み、フィルタコア53Aは、プロセスからのIRPに対して、最小のIRPプライオリティ(IRPプライオリティが取り得る値のうちの最小値)を設定(セット)し、ステップS61に進む。
また、ステップS58において、プロセスからのIRPに含まれるプロセスIDが、登録プロセスIDに一致すると判定された場合、ステップS60に進み、フィルタコア53Aは、プロセスからのIRPに対して、最大のIRPプライオリティ(IRPプライオリティが取り得る値のうちの最大値)を設定し、ステップS61に進む。
ステップS61では、フィルタコア53Aは、ステップS59またはS60でIRPプライオリティを設定した、プロセスからのIRPを、キュー81へ出力して記憶させ(キューイングし)、次のIRPが供給されるのを待って、ステップS51に戻る。
なお、図10では、プロセスからのIRPに含まれるプロセスIDが、登録プロセスIDに一致しない場合、そのプロセスからのIRPに対して、最小のIRPプライオリティを設定し、プロセスからのIRPに含まれるプロセスIDが、登録プロセスIDに一致する場合、そのプロセスからのIRPに対して、最大のIRPプライオリティを設定するようにしたが、登録プロセスIDに一致しないプロセスIDのIRP、または登録プロセスIDに一致するプロセスIDのIRPに対して設定するIRPプライオリティは、その他の値のIRPプライオリティとすることができる。
また、登録プロセスIDに一致するプロセスIDのIRPなどの、あるプロセスIDのIRPに対して設定するIRPプライオリティは、例えば、図7で説明したAPI関数PdSetPriority()によって指定することが可能である。
さらに、登録プロセスIDとしては、1つのプロセスIDだけではなく、複数のプロセスIDを登録することが可能である。この場合、複数の登録プロセスIDそれぞれに対して、固有のIRPプライオリティを対応付け、ある登録プロセスIDに一致するプロセスIDのIRPには、その登録プロセスIDに対応付けられた固有のIRPプライオリティを設定するようにすることが可能である。
次に、図11のフローチャートを参照して、第1の機能を実装する図6のPDフィルタ53において、キュー81に記憶されたIRPを対象に行われる処理(キュー81からの出力処理)について説明する。
PDフィルタ53では、フィルタコア53Aが、ステップS71において、キュー81に記憶されたIRPから、IRPプライオリティが最も高い(最も大きい)ものを検索し、ステップS72に進む。
ステップS72では、フィルタコア53Aは、ステップS71の検索によって得られたIRPプライオリティが最も高いIRPを処理し、ステップS71に戻る。即ち、ステップS72では、フィルタコア53Aは、IRPプライオリティが最も高いIRPを、優先的に、キュー81から読み出し、NT入出力マネージャ52を介して、PD_FS54に出力する。
なお、ステップS71の検索によって、複数のIRPが、IRPプライオリティが最も高いIRPとして得られた場合、フィルタコア53Aは、その複数のIRPを、例えば、OS30の標準的なプライオリティ機能や、IRPがキュー81に記憶された記憶時刻などにしたがって処理する。即ち、フィルタコア53Aは、例えば、標準的なプライオリティ機能によるプライオリティが高いプロセスからのIRPや、記憶時刻が早いIRPなどから、優先的に、キュー81から読み出し、PD_FS54に出力する。
以上のように、PDフィルタ53では、IRPに対して、OS30の標準的なプライオリティ機能によるプライオリティとは別のIRPプライオリティを設定する。具体的には、登録プロセスIDと一致するプロセスIDのプロセスからのIRPには、最大のIRPプライオリティを設定し、登録プロセスIDと一致しないプロセスIDのプロセスからのIRPには、最小のIRPプライオリティを設定する。
そして、PDフィルタ53は、IRPプライオリティが設定されたIRPを、キュー81に記憶させ、さらに、キュー81に記憶されたIRPを、IRPプライオリティにしたがって処理する。
一方、AVアプリケーション33(図6)では、そのプロセス75によってPD_APL41がロードされると、PD_APL41が、そのプロセス75のプロセスIDの登録を、PDフィルタ53に要求し、PDフィルタ53は、その要求に応じて、PD_APL41のプロセス75のプロセスIDを登録する。
そして、AVアプリケーション33は、PD_APL41のプロセス75から、光ディスク3へのアクセス要求を行う。
従って、PDフィルタ53では、AVアプリケーション33による光ディスク3へのアクセス要求としてのIRPが、他のアプリケーション31や32(のプロセス)からのIRPよりも優先的に処理されるので、アプリケーション31や32からのIRPの処理を待つことや、そのIRPの処理によって生じるドライブ2のシーク等によって、AVアプリケーション33による光ディスク3に対するデータの読み書きが妨げられることを防止(低減)することができる。これにより、AVアプリケーション33において、AVデータを、リアルタイムで光ディスク3に記録し、また再生することができる。
なお、AVデータを、リアルタイムで光ディスク3に記録し、また再生するには、最低限、AVアプリケーション33において、AVデータの記録と再生が行われている間、そのAVアプリケーション33による光ディスク3へのアクセス要求としてのIRPが、優先的に処理されれば良い。
一方、上述の実施の形態では、図9で説明したように、PDフィルタ53において、PD_APL41がロードされている間だけ、AVアプリケーション33による光ディスク3へのアクセス要求としてのIRPが、優先的に処理される。
従って、PD_APL41は、図9で説明したように、AVアプリケーション33の起動時にロードし、その終了時にアンロードする他、例えば、AVアプリケーション33において、AVデータの記録または再生が行われるときにロードし、その記録または再生が停止されたときにアンロードするようにしても良い。
次に、AVデータをリアルタイムで読み書きすることを保証するためのPDフィルタ53の第2の機能について説明する。
即ち、第2の機能によれば、PDフィルタ53は、アプリケーション31乃至33からの、光ディスク3に対するアクセス要求に対応するIRPの処理の許可または不許可を表すポーズフラグ(許可情報)を設定する一方、アプリケーション31乃至33からのIRPをキュー81に記憶させる。そして、PDフィルタ53は、キュー81に記憶されたIRPを、ポーズフラグにしたがって処理する。これにより、PDフィルタ53は、例えば、AVアプリケーション33以外のアプリケーションからのIRPの処理を停止して、AVアプリケーション33からのIRP(AVアプリケーション33からのアクセス要求に対応するIRP)だけを処理し、AVアプリケーション33によるAVデータのリアルタイムでの読み書きを保証する。
即ち、第2の機能を実装したPDフィルタ53は、ポーズフラグによって、特定のIRPのみを処理して、他のIRPの処理を停止する状態であるポーズ(Pause)状態と、すべてのIRPを処理する状態であるラン(Run)状態とのうちのいずれか一方の状態となる。
以上のような第2の機能を実装したPDフィルタ53は、例えば、図6に示したように構成される。
但し、第2の機能を実装したPDフィルタ53(図6)では、フィルタコア53Aにおいて、プロセスIDの登録と、IRPに対するIRPプライオリティの設定の他、ポーズフラグの設定が行われる。さらに、第2の機能を実装したPDフィルタ53では、フィルタコア53Aにおいて、キュー81に記憶されたIRPが、IRPプライオリティの他、ポーズフラグにしたがって処理される。
AVアプリケーション33で利用されるPD_API41は、PDフィルタ53の第2の機能を利用するために、PDフィルタ53の状態をポーズ状態またはラン状態にする、PDフィルタ53の制御用のAPI(関数)を、AVアプリケーション33に提供する。
図12は、PDフィルタ53が第2の機能の処理を行うときに、PD_API41が、PDフィルタ53を制御するために、AVアプリケーション33に提供する制御用(PDフィルタ53の制御用)のAPI関数を示している。
なお、図12には、いままで説明したPDフィルタ53の制御用のAPI関数を除くAPI関数(はじめて説明するAPI関数)を示してある。
図12においては、PD_API41が、PDフィルタ53を制御するために、AVアプリケーション33に提供する制御用のAPI関数として、PdPauseOtherAppIrp()と、PdRunOtherAppIrp()とが用意されている。
API関数PdPauseOtherAppIrp()によれば、PDフィルタ53が、特定のIRPのみを処理し、他のIRPの処理を停止するポーズ状態となる。一方、API関数PdRunOtherAppIrp()によれば、PDフィルタ53が、すべてのIRPを処理するラン状態となる。
なお、API関数PdPauseOtherAppIrp()とPdRunOtherAppIrp()とは、いずれも、ボリュームを特定するためのボリュームネームを、引数としてとる。
そして、API関数PdPauseOtherAppIrp()が、引数のボリュームネームを指定して呼び出されることにより、PDフィルタ53は、その引数で指定されているボリュームネームによって特定されるボリュームに対するアクセス要求に対応するIRPのうち、特定のIRPのみを処理し、他のIRPの処理を停止するポーズ状態となる。
また、API関数PdRunOtherAppIrp()が、引数のボリュームネームを指定して呼び出されることにより、PDフィルタ53は、その引数で指定されているボリュームネームによって特定されるボリュームに対するアクセス要求に対応するIRPをすべて処理する(処理対象とする)ラン状態となる。
従って、PDフィルタ53をポーズ状態またはラン状態とすることは、ボリュームごとに、即ち、ボリュームに対応するキューごとに行うことができる。例えば、図6のPDフィルタ53においては、キュー81Aと81Bそれぞれについて独立に、ポーズ状態またはラン状態を設定することができる。
但し、以下では、説明を簡単にするために、キュー81Aと81Bの両方について、ポーズ状態またはラン状態が設定されるものとする。
なお、API関数PdPauseOtherAppIrp()は、PDフィルタ53をポーズ状態とすることに成功した場合、戻り値として1を返し、失敗した場合、戻り値として0を返す。同様に、API関数PdRunOtherAppIrp()も、PDフィルタ53をラン状態とすることに成功した場合、戻り値として1を返し、失敗した場合、戻り値として0を返す。
PD_API41は、API関数PdPauseOtherAppIrp()が呼び出されると、ポーズ状態となることを、PDフィルタ53に対して要求するAPI関数DeviceIoControl()を呼び出す。
また、PD_API41は、API関数PdRunOtherAppIrp()が呼び出されると、ラン状態となることを、PDフィルタ53に対して要求するAPI関数DeviceIoControl()を呼び出す。
API関数DeviceIoControl()が呼び出されると、Win32サブシステム51は、NT入出力マネージャ52に対して、そのAPI関数DeviceIoControl()に応じた要求を行い、NT入出力マネージャ52は、その要求を、IRP_MJ_DEVICE_CONTROLのIRPに変換し、PDフィルタ53に供給する。
IRP_MJ_DEVICE_CONTROLでは、上述したように、ユーザ定義が可能なサブコードとしてのIOCTLが指定される。
図13は、PDフィルタ53が第2の機能の処理を行うときに、IRP_MJ_DEVICE_CONTROLで指定されるユーザ定義のIOCTLを示している。
なお、図13には、図12と同様に、いままで説明したユーザ定義のIOCTLを除くIOCTL(はじめて説明するユーザ定義のIOCTL)を示してある。
図13では、IOCTL_PD_PAUSE_OTHERAPPIRP, IOCTL_PD_RUN_OTHERAPPIRPの2つのIOCTLが、ユーザ定義のIOCTLとして用意されている。
IOCTL_PD_PAUSE_OTHERAPPIRPは、ポーズ状態となることを要求するAPI関数DeviceIoControl()(に応じた要求)に対応するIRP_MJ_DEVICE_CONTROLのIRPのサブコードとなるIOCTLで、PDフィルタ53をポーズ状態とすることを要求するIOCTLである。
IOCTL_PD_RUN_OTHERAPPIRPは、ラン状態となることを要求するAPI関数DeviceIoControl()に対応するIRP_MJ_DEVICE_CONTROLのIRPのサブコードとなるIOCTLで、PDフィルタ53をラン状態とすることを要求するIOCTLである。
なお、上述したように、IRP_MJ_DEVICE_CONTROLのIRPのサブコードとなるユーザ定義のIOCTLは、Win32サブシステム51が提供するAPI関数DeviceIoControl()を利用して、Win32サブシステム51からNT入出力マネージャ52に渡され、NT入出力マネージャ52において、IRP_MJ_DEVICE_CONTROLのIRPのサブコードとして指定される。
次に、図14のフローチャートを参照して、PDフィルタ53が第2の機能を実装している場合の、図6におけるAVアプリケーション33、PD_API41、およびPDフィルタ53の処理の概要について説明する。
AVアプリケーション33は、例えば、ユーザが入力部17(図2)を操作することによって、光ディスク3に記録されたAVデータの再生や、光ディスク3へのAVデータの記録などが要求されると、ステップS91において、API関数PdPauseOtherAppIrp()を呼び出す。
PD_API41は、ステップS101において、AVアプリケーション33によるAPI関数PdPauseOtherAppIrp()の呼び出しを受信して、ステップS102に進み、そのAPI関数PdPauseOtherAppIrp()の呼び出しに応じて、ポーズ状態となることを要求するAPI関数DeviceIoControl()を呼び出す。このAPI関数DeviceIoControl()の呼び出しによって、ポーズ状態となることを要求するIOCTL_PD_PAUSE_OTHERAPPIRPがIOCTLとして指定されているIRP_MJ_DEVICE_CONTROLのIRPが、NT入出力マネージャ52からPDフィルタ53に供給される。
PDフィルタ53は、ステップS111において、NT入出力マネージャ52からのIRPを受信し、そのIRPのIOCTL_PD_PAUSE_OTHERAPPIRPにしたがい、ポーズフラグを、ポーズ状態を表す、例えば、1にセットし、これにより、ポーズ状態となる。
PDフィルタ53は、ポーズ状態となっている間、PD_API41のプロセス75(図6)以外のプロセスからのIRPの処理を停止し、PD_API41のプロセス75からのIRPのみを処理する。
即ち、例えば、AVアプリケーション33が、ステップS92において、光ディスク3に対するアクセス要求としての、例えば、ファイルの読み出しを要求するAPI関数ReadFile()などを呼び出すと、PD_API41は、ステップS103において、そのAPI関数ReadFile()の呼び出しを受信し、ステップS104に進む。
ステップS104では、PD_API41は、AVアプリケーション33からのAPI関数ReadFile()の呼び出しに応じて、同一のAPI関数ReadFile()を呼び出し、この呼び出しによって、ファイルの読み出しを要求するIRP_MJ_READのIRPが、NT入出力マネージャ52からPDフィルタ53に供給される。
PDフィルタ53は、ステップS112において、NT入出力マネージャ52からのIRP_MJ_READのIRPを受信して、ステップS113に進む。ステップS113では、PDフィルタ53は、ステップS112で受信したIRP、即ち、AVアプリケーション33におけるPD_API41のプロセス75からのIRPを、キュー81(図6)に記憶させ、さらに、キュー81から読み出し、PD_FS54に供給する。
以上のように、PDフィルタ53では、AVアプリケーション33のプロセス75からのIRPは、即座に処理される。
一方、AVアプリケーション33以外のアプリケーション31や32のプロセス71乃至73が、それぞれ、ステップS81乃至S83において、光ディスク3に対するアクセス要求としての、例えば、ファイルの読み出しを要求するAPI関数ReadFile()などを呼び出すと、この呼び出しによって、ファイルの読み出しを要求するIRP_MJ_READのIRPが、NT入出力マネージャ52からPDフィルタ53に供給される。
PDフィルタ53は、ステップS114乃至S116において、それぞれ、プロセス71乃至73がステップS81乃至S83で行ったAPI関数ReadFile()の呼び出しに対応するIRPを受信し、キュー81に記憶させる。
そして、いまの場合、PDフィルタ53はポーズ状態となっているので、PDフィルタ53は、ステップS114乃至S116でキュー81に記憶させたIRP、即ち、AVアプリケーション33のプロセス75以外のプロセスであるプロセス71乃至73からのIRPを処理しない。つまり、PDフィルタ53では、アプリケーション31のプロセス71および72や、アプリケーション32のプロセス73からのIRPは、PD_FS54に供給されず、キュー81に記憶されたままとされる。
その後、例えば、ユーザが入力部17(図2)を操作することによって、光ディスク3に記録されたAVデータの再生などの停止、あるいは、AVアプリケーション33の終了などが要求されると、AVアプリケーション33は、ステップS93において、API関数PdRunOtherAppIrp()を呼び出す。
PD_API41は、ステップS105において、AVアプリケーション33によるAPI関数PdRunOtherAppIrp()の呼び出しを受信して、ステップS106に進み、そのAPI関数PdRunOtherAppIrp()の呼び出しに応じて、ラン状態となることを要求するAPI関数DeviceIoControl()を呼び出す。このAPI関数DeviceIoControl()の呼び出しによって、ラン状態となることを要求するIOCTL_PD_RUN_OTHERAPPIRPがIOCTLとして指定されているIRP_MJ_DEVICE_CONTROLのIRPが、NT入出力マネージャ52からPDフィルタ53に供給される。
PDフィルタ53は、ステップS117において、NT入出力マネージャ52からのIRPを受信し、そのIRPのIOCTL_PD_RUN_OTHERAPPIRPにしたがい、ポーズフラグを、ラン状態を表す、例えば、0にリセットし、これにより、ラン状態となる。
PDフィルタ53は、ラン状態となると、PD_API41のプロセス75(図6)以外のプロセスからのIRPの処理を開始(再開)する。
即ち、いまの場合、PDフィルタ53では、ステップS114乃至S116で受信したプロセス71乃至73それぞれからのIRPが、処理されずにキュー81に記憶されたままとなっている。
そこで、PDフィルタ53は、ステップS118乃至S120において、それぞれ、キュー81に記憶されたままとなっていたプロセス71乃至73からのIRPを、キュー81から読み出し、PD_FS54に供給する。
そして、その後、AVアプリケーション33以外のアプリケーション31や32のプロセス71乃至73のうちのいずれかが、ステップS84において、光ディスク3に対するアクセス要求としての、例えば、ファイルの読み出しを要求するAPI関数ReadFile()などを呼び出すと、この呼び出しによって、ファイルの読み出しを要求するIRP_MJ_READのIRPが、NT入出力マネージャ52からPDフィルタ53に供給される。
PDフィルタ53は、ステップS121において、プロセス71乃至73のうちのいずれかがステップS84で行ったAPI関数ReadFile()の呼び出しに対応するIRPを受信し、キュー81に記憶させる。
そして、いまの場合、PDフィルタ53はラン状態になっているので、PDフィルタ53では、ステップS121でキュー81に記憶されたIRPが、ステップS122において読み出され、PD_FS54に供給される。
以上のように、PDフィルタ53は、ポーズ状態では、AVアプリケーション33からのIRPのみを、PD_FS54に出力する。そして、PDフィルタ53は、ポーズ状態が解除されると、即ち、ラン状態となると、AVアプリケーション33以外のアプリケーションからのIRPも、PD_FS54に出力する。
次に、図15および図16のフローチャートを参照して、図6のPDフィルタ53による第2の機能の処理について説明する。
まず、図15のフローチャートを参照して、第2の機能を実装する図6のPDフィルタ53において、IRPが受信されてから、そのIRPがキュー81に記憶されるまでの処理(キュー81への入力処理)について説明する。
図15のフローチャートにしたがった処理によれば、ポーズフラグの設定に関するステップS156乃至S159の処理を除き、図10のフローチャートで説明したのと同様の処理が行われる。
即ち、アプリケーション31乃至33のうちのいずれかのプロセス(図6では、プロセス71乃至75のうちのいずれか)において、ドライブ2に対するI/O関係の処理を要求する(I/O要求を行う)API関数が呼び出されると、そのAPI関数の呼び出しに応じて、NT入出力マネージャ52は、そのAPI関数に対応するIRPを、PDフィルタ53に供給する。
PDフィルタ53では、フィルタコア53Aが、ステップS151において、API関数を呼び出したプロセスからのIRP(プロセスによるAPI関数の呼び出しに応じて、NT入出力マネージャ52から供給されたIRP)を受信して、ステップS152に進み、そのIRPが、IOCTLとして、IOCTL_PD_SET_PROCESSID(図8)が指定されているIRP(IRP_MJ_DEVICE_CONTROLのIRP)であるかどうかを判定する。
ステップS152において、プロセスからのIRP(ステップS151でフィルタコア53Aが受信したIRP)が、IOCTL_PD_SET_PROCESSIDが指定されているIRPであると判定された場合、ステップS153に進み、フィルタコア53Aは、そのIRPに含まれるプロセスID、つまり、そのIRPに対応するAPI関数を呼び出したプロセスのプロセスIDを登録(記憶)し、次のIRPの供給を待って、ステップS151に戻る。
即ち、ステップS153では、ステップS151でフィルタコア53Aが受信したIRPに対応するAPI関数を呼び出したプロセスのプロセスIDが、登録プロセスIDとされる。
一方、ステップS152において、プロセスからのIRPが、IOCTL_PD_SET_PROCESSIDが指定されているIRPでないと判定された場合、ステップS154に進み、フィルタコア53Aは、そのIRPが、IOCTLとして、IOCTL_PD_DELETE_PROCESSID(図8)が指定されているIRP(IRP_MJ_DEVICE_CONTROLのIRP)であるかどうかを判定する。
ステップS154において、プロセスからのIRPが、IOCTL_PD_DELETE_PROCESSIDが指定されているIRPであると判定された場合、ステップS155に進み、フィルタコア53Aは、登録プロセスIDを削除(消去)し、次のIRPの供給を待って、ステップS151に戻る。
また、ステップS154において、プロセスからのIRPが、IOCTL_PD_DELETE_PROCESSIDが指定されているIRPでないと判定された場合、ステップS156に進み、フィルタコア53Aは、プロセスからのIRPが、IOCTLとして、IOCTL_PD_PAUSE_OTHERAPPIRP(図13)が指定されているIRP(IRP_MJ_DEVICE_CONTROLのIRP)であるかどうかを判定する。
ステップS156において、プロセスからのIRPが、IOCTL_PD_PAUSE_OTHERAPPIRPが指定されているIRPであると判定された場合、ステップS157に進み、フィルタコア53Aは、変数であるポーズフラグを、ポーズ状態を表す1にセットし、次のIRPの供給を待って、ステップS151に戻る。これにより、フィルタコア53A(PDフィルタ53)は、ポーズ状態となる。
また、ステップS156において、プロセスからのIRPが、IOCTL_PD_PAUSE_OTHERAPPIRPが指定されているIRPでないと判定された場合、ステップS158に進み、フィルタコア53Aは、プロセスからのIRPが、IOCTLとして、IOCTL_PD_RUN_OTHERAPPIRP(図13)が指定されているIRP(IRP_MJ_DEVICE_CONTROLのIRP)であるかどうかを判定する。
ステップS158において、プロセスからのIRPが、IOCTL_PD_RUN_OTHERAPPIRPが指定されているIRPであると判定された場合、ステップS159に進み、フィルタコア53Aは、変数であるポーズフラグを、ラン状態を表す0にリセットし、次のIRPが供給されるのを待って、ステップS151に戻る。これにより、フィルタコア53Aは、ラン状態となる。
また、ステップS158において、プロセスからのIRPが、IOCTL_PD_RUN_OTHERAPPIRPが指定されているIRPでないと判定された場合、ステップS160に進み、フィルタコア53Aは、そのIRPが、光ディスク3へのアクセスを要求するアクセス要求のIRPであるかどうかを判定する。
ステップS160において、プロセスからのIRPが、アクセス要求のIRPでないと判定された場合、即ち、プロセスからのIRPが、例えば、PDフィルタ53で設定されるIRPプライオリティの変更を要求するIOCTL_PD_SET_RRIORITY(図8)が、IOCTLとして指定されているIRP_MJ_DEVICE_CONTROLのIRPや、PDフィルタ53で設定されるIRPプライオリティを要求するIOCTL_PD_GET_RRIORITY(図8)が、IOCTLとして指定されているIRP_MJ_DEVICE_CONTROLのIRPなどである場合、ステップS161に進み、フィルタコア53Aは、図10のステップS57における場合と同様に、そのIRPに応じた処理を行う。さらに、フィルタコア53Aは、その処理結果に対応する応答を、NT入出力マネージャ52およびWin32サブシステム51を介して、IRPに対応するAPI関数を呼び出したプロセスに返し、次のIRPの供給を待って、ステップS151に戻る。
一方、ステップS160において、プロセスからのIRPが、アクセス要求のIRPであると判定された場合、即ち、プロセスからのIRPが、例えば、ファイルの読み出しを要求するIRP_MJ_READのIRPや、ファイルの書き込みを要求するIRP_MJ_WRITEのIRPである場合、ステップS162に進み、フィルタコア53Aは、プロセスからのIRPに含まれるプロセスID、即ち、そのIRPに対応するAPI関数を呼び出したプロセスのプロセスIDが、登録プロセスIDに一致するかどうかを判定する。
ステップS162において、プロセスからのIRPに含まれるプロセスIDが、登録プロセスIDに一致しないと判定された場合、ステップS163に進み、フィルタコア53Aは、プロセスからのIRPに対して、最小のIRPプライオリティを設定し、ステップS165に進む。
また、ステップS162において、プロセスからのIRPに含まれるプロセスIDが、登録プロセスIDに一致すると判定された場合、ステップS164に進み、フィルタコア53Aは、プロセスからのIRPに対して、最大のIRPプライオリティを設定し、ステップS165に進む。
ステップS165では、フィルタコア53Aは、ステップS163またはS164でIRPプライオリティを設定した、プロセスからのIRPを、キュー81へ出力して記憶させ、次のIRPの供給を待って、ステップS151に戻る。
次に、図16のフローチャートを参照して、第2の機能を実装する図6のPDフィルタ53において、キュー81に記憶されたIRPを対象に行われる処理(キュー81からの出力処理)について説明する。
PDフィルタ53では、フィルタコア53Aが、ステップS171において、ポーズフラグが1にセットされているかどうかを判定する。
ステップS171において、ポーズフラグが1にセットされていると判定された場合、即ち、PDフィルタ53がポーズ状態となっている場合、ステップS172に進み、キュー81に、最大のIRPプライオリティ(IRPプライオリティとして取り得る値のうちの最大値))が設定されているIRPがあるかどうかを判定する。
ステップS172において、キュー81に、最大のIRPプライオリティが設定されているIRPがあると判定された場合、即ち、登録プロセスIDと一致するプロセスIDのプロセスからのIRPが、キュー81に記憶されている場合、ステップS173に進み、フィルタコア53Aは、キュー81に記憶されている、最大のIRPプライオリティが設定されているIRPを処理し、ステップS171に戻る。即ち、ステップS173では、フィルタコア53Aは、最大のIRPプライオリティが設定されているIRPを、キュー81から読み出し、NT入出力マネージャ52を介して、PD_FS54に出力する。
また、ステップS172において、キュー81に、最大のIRPプライオリティが設定されているIRPがないと判定された場合、即ち、登録プロセスIDと一致するプロセスIDのプロセスからのIRPが、キュー81に記憶されていない場合、ステップS173をスキップして、ステップS171に戻る。
従って、PDフィルタ53がポーズ状態になっている場合は、登録プロセスIDと一致するプロセスIDのプロセスからのIRPが、キュー81に記憶されているかどうかにかかわらず、登録プロセスIDと一致しないプロセスIDのプロセスからのIRPは、PD_FS54に出力されない。
一方、ステップS171において、ポーズフラグが0にリセットされていると判定された場合、即ち、PDフィルタ53がラン状態となっている場合、ステップS174,S175に順次進み、図11のステップS71,S72における場合とそれぞれ同様の処理が行われる。
即ち、ステップS174において、フィルタコア53Aは、キュー81に記憶されたIRPから、IRPプライオリティが最も高い(最も大きい)ものを検索し、ステップS175に進む。
ステップS175では、フィルタコア53Aは、ステップS174の検索によって得られたIRPプライオリティが最も高いIRPを処理し、ステップS171に戻る。即ち、ステップS175では、フィルタコア53Aは、IRPプライオリティが最も高いIRPを、優先的に、キュー81から読み出し、NT入出力マネージャ52を介して、PD_FS54に出力する。
従って、PDフィルタ53がラン状態の場合は、PDフィルタ53では、図11における場合と同様に、キュー81からIRPが読み出され、PD_FS54に出力される。
以上のように、PDフィルタ53では、登録プロセスIDと一致するプロセスIDのプロセスからのIRPには、最大のIRPプライオリティを設定し、登録プロセスIDと一致しないプロセスIDのプロセスからのIRPには、最小のIRPプライオリティを設定する。
そして、PDフィルタ53は、IRPプライオリティが設定されたIRPを、キュー81に記憶させ、ラン状態の場合は、キュー81に記憶されたIRPを、IRPプライオリティにしたがって処理するが、ポーズ状態の場合は、キュー81に記憶されたIRPのうち、最大のIRPプライオリティが設定されているIRP、即ち、登録プロセスIDと一致するプロセスIDのプロセスからのIRPのみを処理する。
従って、AVアプリケーション33(図6)では、そのプロセス75によってロードされたPD_APL41において、そのプロセス75のプロセスIDの登録を、PDフィルタ53に要求し、さらに、AVアプリケーション33がAVデータの記録や再生などを行うときに、ポーズ状態となることを、PDフィルタ53に要求することで、PDフィルタ53では、PD_APL41のプロセス75からのIRPに対して、最大のIRPプライオリティが設定され、さらに、その最大のIPRプライオリティが設定されたIRP、即ち、PD_APL41のプロセス75からのIRPのみが処理される(PD_FS54に出力される)。
このように、PD_APL41のプロセス75からのIRPのみが処理されるので、アプリケーション31や32からのIRPの処理を待つことや、そのIRPの処理によって生じるドライブ2のシーク等によって、AVアプリケーション33による光ディスク3に対するデータの読み書きが妨げられることを防止することができる。これにより、AVアプリケーション33において、AVデータを、リアルタイムで光ディスク3に記録し、また再生することができる。
ここで、第1の機能によれば、PD_APL41のプロセス75からのIRPが、キュー81に記憶されていなければ、アプリケーション31や32(のプロセス)からのIRPは、PDフィルタ53からPD_FS54に出力されうる。これに対して、第2の機能によれば、PDフィルタ53がポーズ状態となっている場合には、PD_APL41のプロセス75からのIRPが、キュー81に記憶されているときは勿論、記憶されていないときであっても、アプリケーション31や32(のプロセス)からのIRPは、PDフィルタ53からPD_FS54に出力されない。
なお、図15および図16で説明した場合においては、ポーズ状態となっているPDフィルタ53において、特定のIRPとして、最大のIRPプライオリティが設定されたIRPのみを、PD_FS54に出力するようにしたが、その他、例えば、登録プロセスIDと一致するプロセスIDのIRPを、特定のIRPとして、その登録プロセスIDと一致するプロセスIDのIRPのみを、PD_FS54に出力するようにすることが可能である。即ち、PDフィルタ53では、IRPプライオリティの設定を行わずに、単に、登録プロセスIDと一致するプロセスIDのIRPのみを、PD_FS54に出力するようにすることが可能である。
次に、AVデータをリアルタイムで読み書きすることを保証するためのPDフィルタ53の第3の機能について説明する。
即ち、第3の機能によれば、PDフィルタ53は、AVアプリケーション33以外のアプリケーション、即ち、アプリケーション31および32(のプロセス)からのIRPの、PD_FS54への出力をオン/オフする機能的なスイッチを有し、その機能的なスイッチによって、アプリケーション31および32からのIRPを、PD_FS54に出力しないようにする。これにより、PDフィルタ53は、AVアプリケーション33以外のアプリケーション31および32からのIRPを、PD_FS54に出力せず、AVアプリケーション33からのIRPだけを、PD_FS54に出力し、AVアプリケーション33によるAVデータのリアルタイムでの読み書きを保証する。
図17は、以上のような第3の機能を実装したPDフィルタ53の構成例を示している。
図17において、PDフィルタ53のフィルタコア53は、AVアプリケーション33以外のアプリケーション31および32からのIRPの、PD_FS54への出力をオン/オフする機能的なスイッチ(Switch)としてのスイッチ101を有している。
スイッチ101は、例えば、OS30の起動(Boot)時や、ドライブ2への光ディスク3の装着(Inject)時に、レジストリ58に記憶されたスイッチ設定情報にしたがって、オンまたはオフ状態となる。なお、スイッチ101の状態は、例えば、PC1において、ドライブ2に対応するボリュームのマウント(Mount)が行われた後は、切り換えることができないようになっている。
ここで、スイッチ設定情報は、例えば、AVアプリケーション33のインストール時などにレジストリ58に記憶される。即ち、AVアプリケーション33のインストール時に、スイッチ101をオンまたはオフのいずれの状態とするかをユーザに選択してもらうようにし、その選択されたスイッチ101の状態が、スイッチ設定情報として、レジストリ58に記憶される。なお、レジストリ58に記憶されたスイッチ設定情報は、AVアプリケーション33のインストール後、そのAVアプリケーション33のオプション設定を行う画面等において変更することができるようにすることが可能である。
スイッチ101は、オン状態となっている場合、すべてのアプリケーション(図17では、アプリケーション31乃至33)からのIRPを、PD_FS54に出力する。
一方、スイッチ101は、オフ状態となっている場合、AVアプリケーション33におけるPD_API41(のプロセス)からのIRPのみを、PD_FS54に出力し、他のアプリケーション31および32(のプロセス)に対しては、ドライブ2(に装着された光ディスク3)に対応するボリューム(のファイルシステム)を偽装する。これにより、スイッチ101は、他のアプリケーション31および32からのIRPを、PD_FS54に出力せずに済むようにする。
ここで、オフ状態となっているスイッチ101は、PD_API41以外からのIRPに対して、ボリュームがマウントされているが、そのボリュームは、読み出し専用(Read Only)で、さらに、そのボリュームには、ファイル(File)およびディレクトリ(Directory)が存在しない旨のステータス(Status)を、応答として返す。
これにより、スイッチ101がオフ状態の場合においては、ドライブ2は、例えば、Windows(R) Explorer上では、ファイルおよびディレクトリがないボリュームで、さらに、ファイルのドロップ、イジェクト(Eject)操作、フォーマット(Format)操作をすることができないボリュームとして扱われる。
次に、図18のフローチャートを参照して、図17のPDフィルタ53による第3の機能の処理について説明する。
例えば、OS30が起動され、あるいは、光ディスク3がドライブ2に装着されると、ステップS191において、フィルタコア53Aは、レジストリ58から、スイッチ設定情報を取得し、ステップS192に進む。
ステップS192では、フィルタコア53Aは、スイッチ設定情報にしたがって、スイッチ101をオンまたはオフ状態に設定する。
そして、フィルタコア53Aは、アプリケーション31乃至33のうちのいずれかから、IRPが供給されるのを待って、ステップS193に進み、そのIRPを受信して、ステップS194に進む。
ステップS194では、フィルタコア53Aは、(直前に行われた)ステップS193で受信されたIRPが、AVアプリケーション33(のPD_API41)からのIRPであるかどうかを判定する。ステップS194において、ステップS193で受信されたIRPが、AVアプリケーション33からのIRPであると判定された場合、ステップS195に進み、フィルタコア53Aは、そのIRPを、PD_FS54に出力し、アプリケーション31乃至33のうちのいずれかから、次のIRPが供給されるのを待って、ステップS193に戻る。
また、ステップS194において、ステップS193で受信されたIRPが、AVアプリケーション33からのIRPでないと判定された場合、即ち、ステップS193で受信されたIRPが、アプリケーション31または32からのIRPである場合、ステップS196に進み、フィルタコア53Aは、スイッチ101がオフ状態になっているかどうかを判定する。
ステップS196において、スイッチ101がオフ状態になっていないと判定された場合、即ち、スイッチ101がオン状態になっている場合、ステップS195に進み、フィルタコア53Aは、ステップS193で受信されたIRPを、PD_FS54に出力し、アプリケーション31乃至33のうちのいずれかから、次のIRPが供給されるのを待って、ステップS193に戻る。
また、ステップS196において、スイッチ101がオフ状態になっていると判定された場合、ステップS197に進み、スイッチ101は、ステップS193で受信されたIRPの出力元であるアプリケーション31または32に対して、ファイルシステムを偽装したファイルシステム偽装応答、即ち、例えば、上述したように、ボリュームがマウントされているが、そのボリュームは、読み出し専用で、さらに、そのボリュームには、ファイルおよびディレクトリが存在しない旨のステータスを返す。そして、アプリケーション31乃至33のうちのいずれかから、次のIRPが供給されるのを待って、ステップS193に戻り、以下、同様の処理が繰り返される。
以上のように、PDフィルタ53では、スイッチ101がオフ状態の場合、AVアプリケーション33からのIRPだけが、PD_FS54に出力されるので、アプリケーション31や32からのIRPの処理を待つことや、そのIRPの処理により生じるドライブ2のシークによって、AVアプリケーション33による光ディスク3に対するデータの読み書きが妨げられることを防止することができる。これにより、AVアプリケーション33において、AVデータを、リアルタイムで光ディスク3に記録し、また再生することができる。
なお、ステップS194において、IRPが、AVアプリケーション33(のPD_API41をロードしたプロセス75)からのIRPかどうかの判定は、例えば、上述したように、プロセス275のプロセスIDを、登録プロセスIDとしてPDフィルタ53にあらかじめ登録しておき、その登録プロセスIDと、IRPのプロセスIDとが一致するか否かによって行うことが可能である。
また、上述の場合には、第1乃至第3の機能をPDフィルタ53に実装することとしたが、第1乃至第3の機能は、PDフィルタ53ではなく、PD_FS54に実装することも可能である。
ところで、PD_FS54(図4)は、図5のステップS4で説明したように、PDフィルタ53からのIRPによって要求されているデータについて、NTキャッシュマネージャ59のキャッシュ機能を利用するのに必要な処理としてのキャッシュ処理を行う。
そして、例えば、PDフィルタ53からのIRPによって要求されているデータが、NTキャッシュマネージャ59にキャッシュされている場合は、そのキャッシュされているデータが、PD_FS54から、PDフィルタ53に返されるが、PDフィルタ53からのIRPによって要求されているデータが、NTキャッシュマネージャ59にキャッシュされていない場合は、PDフィルタ53からのIRPは、PD_FS54からPDストレージ55に出力される。
従って、PDフィルタ53からのIRPによって要求されているデータが、NTキャッシュマネージャ59にキャッシュされていない場合は、キャッシュ機能がないケースと比較すると、キャッシュ処理の分、即ち、CPU12(図2)がキャッシュ処理の処理ルーチンを実行する分だけ、いわば余計なオーバヘッドが生じることとなる。
このオーバヘッドは、PD_FS54からPDストレージ55へのIRPの出力を遅延させる。そして、AVアプリケーション33からのIRPが、PD_FS54からPDストレージ55への出力時に遅延することは、AVデータのリアルタイムでの再生や記録を妨げる要因となることから、AVアプリケーション33からのIRPについては、そのような遅延がないことが望ましい。
このようなIRPの遅延は、キャッシュ機能を利用しないことによって防止することができる。
一方、キャッシュ機能一切を利用しない場合には、PDフィルタ53からのIRPは、すべて、PD_FS54からPDストレージ55に出力される。即ち、アプリケーション31乃至33からのIRPは、すべて、PDフィルタ53から、PD_FS54を介して、PDストレージ55に出力される。
即ち、この場合、AVアプリケーション33からのIRPの他、AVアプリケーション33以外のアプリケーションであるアプリケーション31や32からのIRPも、すべて、PDフィルタ53から、PD_FS54を介して、PDストレージ55に出力される。そして、アプリケーション31や32からのIRPによって要求されるデータの読み出し等のために、ドライブ2においてシークが発生する。
このシークは、AVアプリケーション33からのIRPによって要求されるAVデータの読み出し等をリアルタイムで行うことを妨げることとなる。
一方、キャッシュ機能を利用する場合には、アプリケーション31や32からのIRPによって要求されているデータが、NTキャッシュマネージャ59にキャッシュされていれば、そのキャッシュされているデータが、PD_FS54から、PDフィルタ53に返される。この場合、ドライブ2では、アプリケーション31や32からのIRPによって要求されているデータを光ディスク3から読み出す等のためのシークが発生しない。
以上から、AVアプリケーション33においては、キャッシュ機能を利用しないことにより、キャッシュ処理による遅延を防止することができ、その結果、AVデータの再生や記録のリアルタイム性を向上させることができる。
さらに、AVアプリケーション33以外のアプリケーション31および32においては、キャッシュ機能を利用することにより、ドライブ2でのシークの発生を低減することができ、その結果、やはり、AVデータの再生や記録のリアルタイム性を向上させることができる。
そこで、PDフィルタ53には、アプリケーション31および32からのIRPについては、キャッシュ機能を利用するように処理する一方、AVアプリケーション33からのIRPについては、キャッシュ機能の利用の有無を設定し、その設定結果にしたがって処理する、いわばキャッシュオン/オフ(cache ON/OFF)機能を実装することができる。
図19は、キャッシュオン/オフ機能を実装したPDフィルタ53の構成例を示している。
なお、キャッシュオン/オフ機能は、PD_API41をロードするAVアプリケーション33にのみ提供され、アプリケーション31および32は、常時、キャッシュ機能を利用する。即ち、キャッシュオン/オフ機能は、アプリケーション31および32には、いわば関係ない。このため、図19では、アプリケーション31乃至33のうちの、キャッシュオン/オフ機能が提供されるAVアプリケーション33だけを図示してある。
図19において、PDフィルタ53は、コマンドバッファ111を有している。コマンドバッファ111は、例えば、AVアプリケーション33(のPD_API41)からのIRP、即ち、AVアプリケーション33のPD_API41がAPI関数を呼び出すことによってNT入出力マネージャ52が出力するIRPを一時記憶する。
また、図19のPDフィルタ53では、フィルタコア53Aが、AVアプリケーション33(のPD_API41)によるキャッシュ機能の利用の有無を設定し、その設定結果にしたがって、コマンドバッファ111に記憶されたAVアプリケーション33からのIRPを処理する。
即ち、フィルタコア53Aは、キャッシュ機能の利用の有無の設定が、キャッシュ機能を利用する設定になっている場合、コマンドバッファ111に記憶されたAVアプリケーション33からのIRPを、PD_FS54に出力するに際し、PD_FS54においてキャッシュ機能を利用するように、IRPの出力制御を行う。
また、フィルタコア53Aは、キャッシュ機能の利用の有無の設定が、キャッシュ機能を利用しない設定になっている場合、コマンドバッファ111に記憶されたAVアプリケーション33からのIRPを、PD_FS54に出力するに際し、PD_FS54においてキャッシュ機能を利用せずに、PDストレージ55に出力されるように、IRPの出力制御を行う。
次に、図20は、PDフィルタ53がキャッシュオン/オフ機能の処理を行うときに、PD_API41が、PDフィルタ53を制御するために、AVアプリケーション33に提供する制御用(PDフィルタ53の制御用)のAPI(関数)を示している。
図20においては、PD_API41が、PDフィルタ53を制御するために、AVアプリケーション33に提供する制御用のAPI関数として、PdOpenFile(), PdCloseFile(), PdReadFile(), PdWriteFile()の4つが用意されている。
ここで、図20の4つのAPI関数PdOpenFile(), PdCloseFile(), PdReadFile(), PdWriteFile()は、いずれも、ファイル操作を行うためのファイルストリーム(File Stream)用のAPI関数であり、同様のAPI関数が、Win32サブシステム51でも提供されている。
即ち、PD_API41は、Win32サブシステム51が提供するファイルストリーム用のAPI関数とは別に、固有のファイルストリーム用のAPI関数PdOpenFile(), PdCloseFile(), PdReadFile(), PdWriteFile()を提供する。
API関数PdOpenFile()は、ファイルのオープンを要求するAPI関数で、オープンしようとするファイルのファイル名(パス名を含む)、そのファイルをオープンするときのオープンモード(例えば、参照のみ行うモード等)、およびキャッシュ機能の利用の有無を表すキャッシュ情報を、引数としてとる。
そして、API関数PdOpenFile()を、引数のファイル名、オープンモード、およびキャッシュ情報を指定して呼び出すことにより、引数で指定されているファイル名のファイルが、引数で指定されているオープンモードでオープンされる。さらに、API関数PdOpenFile()は、引数のキャッシュ情報によって、PDフィルタ53(のフィルタコア53A)に、キャッシュ機能の利用の有無を設定させる。API関数PdOpenFile()は、ファイルのオープンに成功した場合、戻り値として、そのオープンしたファイルのファイルハンドルを返し、ファイルのオープンに失敗した場合、戻り値として、0xffffffffを返す。なお、0xは、その後に続く値が、16進数であることを表す。
API関数PdCloseFile()は、ファイルのクローズを要求するAPI関数で、クローズしようとするファイルのファイルハンドルを、引数としてとる。そして、API関数PdCloseFile()を、引数のファイルハンドルを指定して呼び出すことにより、そのファイルハンドルによって特定されるファイルがクローズする。API関数PdCloseFile()は、ファイルのクローズに成功した場合、戻り値として1を返し、ファイルのクローズに失敗した場合、戻り値として0を返す。
API関数PdReadFile()は、ファイルからのデータの読み出しを要求するAPI関数で、データを読み出そうとするファイルのファイルハンドル、ファイルから読み出したデータを一時記憶するバッファへのポインタであるバッファポインタ、およびファイルから読み出すデータのデータ量としてのバイト数を、引数としてとる。そして、API関数PdReadFile()を、引数のファイルハンドル、バッファポインタ、およびバイト数を指定して呼び出すことにより、そのファイルハンドルによって特定されるファイルのデータが、そのバイト数だけ読み出され、バッファポインタによって指定された記憶領域に保存される。API関数PdReadFile()は、データの読み出しに成功した場合、戻り値として、その読み出したデータのバイト数を返し、データの読み出しに失敗した場合、戻り値として0を返す。なお、API関数PdReadFile()は、Win32サブシステム51が提供するAPI関数ReadFile()に相当する。
API関数PdWriteFile()は、ファイルへのデータの書き込みを要求するAPI関数で、データを書き込もうとするファイルのファイルハンドル、ファイルに書き込むデータを一時記憶するバッファへのポインタであるバッファポインタ、およびファイルに書き込むデータのデータ量としてのバイト数を、引数としてとる。そして、API関数PdWriteFile()を、引数のファイルハンドル、バッファポインタ、およびバイト数を指定して呼び出すことにより、バッファポインタによって指定された記憶領域における、そのバイト数のデータが、ファイルハンドルによって特定されるファイルに書き込まれる。API関数PdWriteFile()は、データの書き込みに成功した場合、戻り値として、その書き込んだデータのバイト数を返し、データの書き込みに失敗した場合、戻り値として0を返す。なお、API関数PdWriteFile()は、Win32サブシステム51が提供するAPI関数WriteFile()に相当する。
PD_API41は、API関数PdOpenFile(), PdCloseFile(), PdReadFile(), PdWriteFile()が呼び出されると、それぞれ、Win32サブシステム51が提供する、対応するAPI関数DeviceIoControl()を呼び出す。
API関数DeviceIoControl()が呼び出されると、Win32サブシステム51は、NT入出力マネージャ52に対して、そのAPI関数DeviceIoControl()に応じた要求を行い、NT入出力マネージャ52は、その要求を、IRP_MJ_DEVICE_CONTROLのIRPに変換し、PDフィルタ53に供給する。
このIRP_MJ_DEVICE_CONTROLでは、上述したように、ユーザ定義が可能なサブコードとしてのIOCTLが指定される。
図21は、API関数PdOpenFile(), PdCloseFile(), PdReadFile(), PdWriteFile()が、それぞれ呼び出されたときに、IRP_MJ_DEVICE_CONTROLで指定されるユーザ定義のIOCTLを示している。
図21では、図20のAPI関数PdOpenFile(), PdCloseFile(), PdReadFile(), PdWriteFile()に、それぞれ対応するIOCTL_PD_OPEN_FILE, IOCTL_PD_CLOSE_FILE, ICCTL_PD_READ_FILE, IOCTL_PD_WRITE_FILEの4つの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サブシステム51が提供するAPI関数DeviceIoControl()を利用して、Win32サブシステム51からNT入出力マネージャ52に渡され、NT入出力マネージャ52において、IRP_MJ_DEVICE_CONTROLのIRPのサブコードとして指定される。
次に、図22のフローチャートを参照して、PDフィルタ53がキャッシュオン/オフ機能を実装している場合の、図19におけるAVアプリケーション33、PD_API41、PDフィルタ53、およびPD_FS54の処理の概要について説明する。
AVアプリケーション33は、光ディスク3に対するAVデータの読み書きを、キャッシュ機能を利用せずに行う場合、ステップS201において、AVデータの読み書きを行おうとするファイルのオープンを要求するAPI関数PdOpenFile()を、キャッシュ機能を利用しない旨のキャッシュ情報(Cache OFF)を引数として呼び出す。
PD_API41は、ステップS211において、AVアプリケーション33によるAPI関数PdOpenFile()の呼び出しを受信して、ステップS212に進み、そのAPI関数PdOpenFile()の呼び出しに応じて、ファイルのオープンを要求するAPI関数DeviceIoControl()を呼び出す。このAPI関数DeviceIoControl()の呼び出しによって、ファイルのオープンを要求するIOCTL_PD_OPEN_FILEがIOCTLとして指定されているIRP_MJ_DEVICE_CONTROLのIRPが、NT入出力マネージャ52からPDフィルタ53に供給される。なお、この場合、IOCTL_PD_OPEN_FILEには、キャッシュ機能を利用しない旨のキャッシュ情報が含まれる。
PDフィルタ53は、ステップS221において、NT入出力マネージャ52からのIRPを受信し、そのIRPのIOCTL_PD_OPEN_FILEにしたがい、キャッシュ機能の利用の有無を表すキャッシュフラグを、キャッシュ機能を利用しない旨を表す、例えば、0にリセットし(設定し)、これにより、AVアプリケーション33でキャッシュオフを指定してオープンされたファイルについてはキャッシュ機能を利用しないキャッシュオフ状態となる。
PDフィルタ53は、キャッシュオフ状態となっている間、PD_API41からのIRP_MJ_DEVICE_CONTROLのIRP(PD_API41が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_FS54に出力することにより、PD_API41からのIRPによって要求されるデータの読み書きが、キャッシュ機能を利用しないで行われるように、PD_API41からのIRPの出力制御を行う。
即ち、ステップS221では、PDフィルタ53は、キャッシュオフ状態となった後、NT入出力マネージャ52から受信した、PD_API41からの、IOCTL_PD_OPEN_FILEが指定されているIRP_MJ_DEVICE_CONTROLのIRPを、そのまま、PD_FS54に出力する。
PD_FS54は、ステップS231において、PDフィルタ53からの、IOCTL_PD_OPEN_FILEが指定されているIRP_MJ_DEVICE_CONTROLのIRPを受信し、PDストレージ55に出力する。これにより、光ディスク3上のファイルがオープンされる。
その後、例えば、AVアプリケーション33が、ステップS202において、光ディスク3に対するアクセス要求としての、例えば、ファイル(ファイルストリーム(File Stream))の読み出し、または書き込みを要求するAPI関数PdReadFile()、またはPdWriteFile()を呼び出すと、PD_API41は、ステップS213において、そのAPI関数PdReadFile()、またはPdWriteFile()の呼び出しを受信し、ステップS214に進む。
ステップS214では、PD_API41は、AVアプリケーション33からの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入出力マネージャ52からPDフィルタ53に供給される。
PDフィルタ53は、ステップS223において、NT入出力マネージャ52からのIRP_MJ_DEVICE_CONTROLのIRPを受信して、ステップS224に進み、PD_FS54に出力する。
ここで、キャッシュオフ状態のPDフィルタ53は、上述したように、PD_API41からのIRP_MJ_DEVICE_CONTROLのIRPを、そのIRP_MJ_DEVICE_CONTROLのIRPのまま、PD_FS54に出力する。
従って、いまの場合、PDフィルタ53では、ステップS224において、ファイルの読み出しを要求する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_FS54に出力される。
PD_FS54は、ステップS232において、PDフィルタ53からのIRP_MJ_DEVICE_CONTROLのIRPを受信する。
ここで、PD_FS54は、Win32サブシステム51が提供するAPI関数ReadFile()またはWriteFile()が呼び出されたときに、NT入出力マネージャ52がPDフィルタ53に出力するIRP_MJ_READまたはIRP_MJ_WRITEのIRPについて、NTキャッシュマネージャ59によるキャッシュ機能を提供し、IRP_MJ_DEVICE_CONTROLのIRPについては、キャッシュ機能を提供しないようになっている。
従って、ステップS232において、PDフィルタ53からのIRP_MJ_DEVICE_CONTROLのIRPを受信したPD_FS54は、そのIRPを、即座に、PDストレージ55に出力する。即ち、この場合、キャッシュ機能は利用されない。
その後、AVアプリケーション33が、ステップS203において、ステップS201でオープンを要求したファイルのクローズを要求するAPI関数PdCloseFile()を呼び出すと、PD_API41は、ステップS215において、AVアプリケーション33によるAPI関数PdCloseFile()の呼び出しを受信して、ステップS216に進み、そのAPI関数PdCloseFile()の呼び出しに応じて、ファイルのクローズを要求するAPI関数DeviceIoControl()を呼び出す。このAPI関数DeviceIoControl()の呼び出しによって、ファイルのクローズを要求するIOCTL_PD_CLOSE_FILEがIOCTLとして指定されているIRP_MJ_DEVICE_CONTROLのIRPが、NT入出力マネージャ52からPDフィルタ53に供給される。
PDフィルタ53は、ステップS225において、NT入出力マネージャ52からのIRPを受信して、ステップS226に進み、そのまま、PD_FS54に出力する。
PD_FS54は、ステップS233において、PDフィルタ53からの、IOCTL_PD_CLOSE_FILEが指定されているIRP_MJ_DEVICE_CONTROLのIRPを受信し、PDストレージ55に出力する。これにより、光ディスク3上のファイルがクローズされる。
一方、AVアプリケーション33が、光ディスク3に対するAVデータの読み書きを、キャッシュ機能を利用して行う場合、ステップS241において、AVデータの読み書きを行おうとするファイルのオープンを要求するAPI関数PdOpenFile()を、キャッシュ機能を利用する旨のキャッシュ情報(Cache ON)を引数として呼び出す。
PD_API41は、ステップS251において、AVアプリケーション33によるAPI関数PdOpenFile()の呼び出しを受信して、ステップS252に進み、そのAPI関数PdOpenFile()の呼び出しに応じて、ファイルのオープンを要求するAPI関数DeviceIoControl()を呼び出す。このAPI関数DeviceIoControl()の呼び出しによって、ファイルのオープンを要求するIOCTL_PD_OPEN_FILEがIOCTLとして指定されているIRP_MJ_DEVICE_CONTROLのIRPが、NT入出力マネージャ52からPDフィルタ53に供給される。なお、この場合、IOCTL_PD_OPEN_FILEには、キャッシュ機能を利用する旨のキャッシュ情報が含まれる。
PDフィルタ53は、ステップS261において、NT入出力マネージャ52からのIRPを受信し、そのIRPのIOCTL_PD_OPEN_FILEにしたがい、キャッシュ機能の利用の有無を表すキャッシュフラグを、キャッシュ機能を利用する旨を表す、例えば、1にセットし(設定し)、これにより、AVアプリケーション33でキャッシュオンを指定してオープンされたファイルについて、キャッシュ機能を利用するキャッシュオン状態となる。
PDフィルタ53は、キャッシュオン状態となっている間、PD_API41からのIRPによって要求されるデータの読み書きが、キャッシュ機能を利用して行われるように制御する。
即ち、ステップS261では、PDフィルタ53は、キャッシュオン状態となった後、NT入出力マネージャ52から受信した、PD_API41からの、IOCTL_PD_OPEN_FILEが指定されているIRP_MJ_DEVICE_CONTROLのIRPを、PD_FS54に出力する。
PD_FS54は、ステップS271において、PDフィルタ53からの、IOCTL_PD_OPEN_FILEが指定されているIRP_MJ_DEVICE_CONTROLのIRPを受信し、PDストレージ55に出力する。これにより、光ディスク3上のファイルがオープンされる。
その後、例えば、AVアプリケーション33が、ステップS242において、光ディスク3に対するアクセス要求としての、例えば、ファイルの読み出し、または書き込みを要求するAPI関数PdReadFile()、またはPdWriteFile()を呼び出すと、PD_API41は、ステップS253において、そのAPI関数PdReadFile()、またはPdWriteFile()の呼び出しを受信し、ステップS254に進む。
ステップS254では、PD_API41は、AVアプリケーション33からの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入出力マネージャ52からPDフィルタ53に供給される。
PDフィルタ53は、ステップS263において、NT入出力マネージャ52からのIRP_MJ_DEVICE_CONTROLのIRPを受信して、ステップS264に進み、PD_FS54に出力する。
ここで、キャッシュオン状態のPDフィルタ53は、PD_API41からの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_FS54に出力する。
即ち、ステップS264では、ファイルの読み出しを要求するIOCTL_PD_READ_FILEが指定されているIRP_MJ_DEVICE_CONTROLのIRPは、Win32サブシステム51が提供する、ファイルの読み出しを要求するAPI関数ReadFile()が呼び出されたときにNT入出力マネージャ52がPDフィルタ53に出力するIRP_MJ_READに変換され、PD_FS54に出力される。
また、ファイルの書き込みを要求するIOCTL_PD_WRITE_FILEが指定されているIRP_MJ_DEVICE_CONTROLのIRPは、Win32サブシステム51が提供する、ファイルの書き込みを要求するWriteFile()が呼び出されたときにNT入出力マネージャ52がPDフィルタ53に出力するIRP_MJ_WRITEのIRPに変換され、PD_FS54に出力される。
PD_FS54は、ステップS272において、PDフィルタ53からのIRP_MJ_READのIRP、またはIRP_MJ_WRITEのIRPを受信する。
ここで、上述したように、PD_FS54は、IRP_MJ_READのIRPまたはIRP_MJ_WRITEのIRPについては、NTキャッシュマネージャ59によるキャッシュ機能を提供する。
従って、ステップS272において、PDフィルタ53からのIRP_MJ_READのIRP、またはIRP_MJ_WRITEのIRPを受信したPD_FS54では、そのIRPによって要求されるデータの読み書きがキャッシュ機能を利用して行われる。
即ち、例えば、PDフィルタ53からのIRP_MJ_READのIRPによって読み出しが要求されているデータが、NTキャッシュマネージャ59にキャッシュされている場合には、PD_FS54は、そのキャッシュされているデータを、応答として、PDフィルタ53に返す。また、例えば、PDフィルタ53からのIRP_MJ_READのIRPによって読み出しが要求されているデータが、NTキャッシュマネージャ59にキャッシュされていない場合には、PD_FS54は、PDフィルタ53からのIRP_MJ_READのIRPを、PDストレージ55に出力する。
その後、AVアプリケーション33が、ステップS243において、ステップS241でオープンを要求したファイルのクローズを要求するAPI関数PdCloseFile()を呼び出すと、PD_API41は、ステップS255において、AVアプリケーション33によるAPI関数PdCloseFile()の呼び出しを受信して、ステップS256に進み、そのAPI関数PdCloseFile()の呼び出しに応じて、ファイルのクローズを要求するAPI関数DeviceIoControl()を呼び出す。このAPI関数DeviceIoControl()の呼び出しによって、ファイルのクローズを要求するIOCTL_PD_CLOSE_FILEがIOCTLとして指定されているIRP_MJ_DEVICE_CONTROLのIRPが、NT入出力マネージャ52からPDフィルタ53に供給される。
PDフィルタ53は、ステップS265において、NT入出力マネージャ52からのIRPを受信して、ステップS266に進み、そのまま、PD_FS54に出力する。
PD_FS54は、ステップS273において、PDフィルタ53からの、IOCTL_PD_CLOSE_FILEが指定されているIRP_MJ_DEVICE_CONTROLのIRPを受信し、PDストレージ55に出力する。これにより、光ディスク3上のファイルがクローズされる。
なお、ファイルのオープンを要求するAPI関数PdOpenFile()を呼び出すときに、その引数のキャッシュ情報を、キャッシュ機能を利用する旨の情報とするか、またはキャッシュ情報を利用しない旨の情報とするかは、例えば、PC1やドライブ2の性能(例えば、CPU12の動作クロックや、ドライブ2の最悪シーク時間など)、ユーザの操作などに応じて決定することが可能である。
次に、図23のフローチャートを参照して、図19のPDフィルタ53によるキャッシュオン/オフの機能の処理について説明する。
アプリケーション31乃至33のうちのいずれか(のプロセス)において、ドライブ2に対するI/O関係の処理を要求する(I/O要求を行う)API関数が呼び出されると、そのAPI関数の呼び出しに応じて、NT入出力マネージャ52は、そのAPI関数に対応するIRPを、PDフィルタ53に供給する。
なお、本実施の形態においては、アプリケーション31乃至33(AVアプリケーション33のPD_API41も含む)により呼び出されるAPI関数としては、Win32サブシステム32が提供するものの他、PD_API41が提供するものがある。
Win32サブシステム32が提供するAPI関数の呼び出しに対しては、Win32サブシステム32が、そのAPI関数に応じた要求を、NT入出力マネージャ52に対して行い、NT入出力マネージャ52が、そのAPI関数に対応するIRPを、PDフィルタ53に供給する。また、PD_API41が提供するAPI関数の呼び出しに対しては、PD_API41が、そのAPI関数に応じたAPI関数DeviceIoControl()を呼び出し、さらに、Win32サブシステム32が、そのAPI関数DeviceIoControl()に応じた要求を、NT入出力マネージャ52に対して行い、NT入出力マネージャ52が、そのAPI関数DeviceIoControl()に対応するIRPを、PDフィルタ53に供給する。
従って、アプリケーション31乃至33により呼び出されたAPI関数が、Win32サブシステム32が提供するAPI関数であっても、また、PD_API41が提供するAPI関数であっても、最終的には、そのAPI関数に対応するIRPが、NT入出力マネージャ52からPDフィルタ53に供給されることに変わりはない。
PDフィルタ53は、ステップS301において、API関数の呼び出しに応じて、NT入出力マネージャ52から供給されたIRPを受信し、コマンドバッファ111に記憶させて、ステップS302に進む。ステップS302では、フィルタコア53Aが、(直前のステップS301で)コマンドバッファ111に記憶されたIRPが、IOCTLとして、ファイルのオープンを要求するIOCTL_PD_OPEN_FILE(図21)が指定されているIRP(IRP_MJ_DEVICE_CONTROLのIRP)であるかどうかを判定する。
ここで、IOCTL_PD_OPEN_FILEには、上述したように、キャッシュ情報が含まれる。
ステップS302において、コマンドバッファ111に記憶されたIRPが、IOCTL_PD_OPEN_FILEが指定されているIRPであると判定された場合、ステップS303に進み、フィルタコア53Aは、そのIRPで指定されているIOCTL_PD_OPEN_FILEにおけるキャッシュ情報がキャッシュ機能を利用する旨を表しているかどうかを判定する。
ステップS303において、キャッシュ情報がキャッシュ機能を利用する旨を表していると判定された場合、ステップS304に進み、フィルタコア53Aは、変数としてのキャッシュフラグを、キャッシュ機能を利用することを表す1にセットし(設定し)、これにより、キャッシュオン状態となって、ステップS306に進む。
また、ステップS303において、キャッシュ情報がキャッシュ機能を利用しない旨を表していると判定された場合、ステップS305に進み、フィルタコア53Aは、変数としてのキャッシュフラグを、キャッシュ機能を利用しないことを表す0にリセットし(設定し)、これにより、キャッシュオフ状態となって、ステップS306に進む。
ステップS306では、フィルタコア53Aは、コマンドバッファ111に記憶された、IOCTL_PD_OPEN_FILEが指定されているIRPを、PD_FS54に出力し、次のIRPが供給されるのを待って、ステップS301に戻る。
なお、この場合、PD_FS54は、フィルタコア53AからのIOCTL_PD_OPEN_FILEが指定されているIRPを受信して、PDストレージ55に出力し、これにより、ファイルがオープンされる。
一方、ステップS302において、コマンドバッファ111に記憶されたIRPが、IOCTL_PD_OPEN_FILEが指定されているIRPでないと判定された場合、ステップS307に進み、フィルタコア53Aは、コマンドバッファ111に記憶されたIRPが、IOCTLとして、ファイルのクローズを要求するIOCTL_PD_CLOSE_FILE(図21)が指定されているIRP(IRP_MJ_DEVICE_CONTROLのIRP)であるかどうかを判定する。
ステップS307において、コマンドバッファ111に記憶されたIRPが、IOCTL_PD_CLOSE_FILEが指定されているIRPであると判定された場合、ステップS308に進み、フィルタコア53Aは、コマンドバッファ111に記憶された、IOCTL_PD_CLOSE_FILEが指定されているIRPを、PD_FS54に出力し、次のIRPが供給されるのを待って、ステップS301に戻る。
なお、この場合、PD_FS54は、フィルタコア53AからのIOCTL_PD_CLOSE_FILEが指定されているIRPを受信して、PDストレージ55に出力し、これにより、ファイルがクローズされる。
また、ステップS307において、コマンドバッファ111に記憶されたIRPが、IOCTL_PD_CLOSE_FILEが指定されているIRPでないと判定された場合、ステップS309に進み、フィルタコア53Aは、コマンドバッファ111に記憶されたIRPが、IOCTLとして、ファイルの読み出しを要求するIOCTL_PD_READ_FILE、またはファイルの書き込みを要求するIOCTL_PD_WRITE_FILE(図21)が指定されているIRP(IRP_MJ_DEVICE_CONTROLのIRP)であるかどうかを判定する。
ステップS309において、コマンドバッファ111に記憶されたIRPが、IOCTL_PD_READ_FILE、またはIOCTL_PD_WRITE_FILEが指定されているIRPでないと判定された場合、ステップS310に進み、コマンドバッファ111に記憶されたIRPを、PD_FS54に出力し、次のIRPが供給されるのを待って、ステップS301に戻る。
また、ステップS309において、コマンドバッファ111に記憶されたIRPが、IOCTL_PD_READ_FILE、またはIOCTL_PD_WRITE_FILEが指定されているIRPであると判定された場合、ステップ311に進み、フィルタコア53Aは、キャッシュフラグが1であるかどうかを判定する。
ステップS311において、キャッシュフラグが1であると判定された場合、即ち、PDフィルタ53(のフィルタコア53A)がキャッシュオン状態になっている(設定されている)場合、ステップS312に進み、フィルタコア53Aは、コマンドバッファ111に記憶されたIRPを変換する。
即ち、いまの場合、コマンドバッファ111に記憶されているIRPは、IOCTLとして、ファイルの読み出しを要求するIOCTL_PD_READ_FILE、またはファイルの書き込みを要求するIOCTL_PD_WRITE_FILE(図21)が指定されているIRP_MJ_DEVICE_CONTROLのIRPである。
フィルタコア53Aは、コマンドバッファ111に記憶されているIRPが、ファイルの読み出しを要求するIOCTL_PD_READ_FILEが指定されているIRP_MJ_DEVICE_CONTROLのIRPである場合、ステップS312において、そのIRP_MJ_DEVICE_CONTROLのIRPを、Win32サブシステム51が提供するAPI関数ReadFile()が呼び出されたときにNT入出力マネージャ52がPDフィルタ53に出力するIRP_MJ_READのIRPに変換する。
また、フィルタコア53Aは、コマンドバッファ111に記憶されているIRPが、ファイルの書き込みを要求するIOCTL_PD_WRITE_FILEが指定されているIRP_MJ_DEVICE_CONTROLのIRPである場合、ステップS312において、そのIRP_MJ_DEVICE_CONTROLのIRPを、Win32サブシステム51が提供するAPI関数WriteFile()が呼び出されたときにNT入出力マネージャ52がPDフィルタ53に出力するIRP_MJ_WRITEのIRPに変換する。
そして、ステップS313に進み、フィルタコア53Aは、ステップS312での変換後のIRP、即ち、IRP_MJ_READまたはIRP_MJ_WRITEのIRPを、PD_FS54に出力し、次のIRPが供給されるのを待って、ステップS301に戻る。
なお、この場合、PD_FS54は、フィルタコア53AからのIRP_MJ_READのIRP、またはIRP_MJ_WRITEのIRPを受信し、そのIRPによって要求されるデータの読み出し、または書き込みを、キャッシュ機能を利用して行う。
即ち、上述したように、PD_FS54は、IRP_MJ_READのIRPまたはIRP_MJ_WRITEのIRPについては、NTキャッシュマネージャ59によるキャッシュ機能を提供する。
従って、例えば、PD_FS54が、フィルタコア53Aから受信したIRPが、IRP_MJ_READのIRPである場合、そのIRPによって読み出しが要求されているデータが、NTキャッシュマネージャ59にキャッシュされているかどうかが確認される。そして、読み出しが要求されているデータがキャッシュされている場合には、PD_FS54は、そのキャッシュされているデータを、応答として、PDフィルタ53に返す。また、例えば、PDフィルタ53からのIRP_MJ_READのIRPによって読み出しが要求されているデータが、NTキャッシュマネージャ59にキャッシュされていない場合には、PD_FS54は、PDフィルタ53からのIRP_MJ_READのIRPを、PDストレージ55に出力する。
ここで、PDストレージ55には、データの読み書きのための図示せぬリードライトバッファ(Read/Write Buffer)が用意されている。リードライトバッファのサイズは、例えば、ページング時のページサイズ(Page Size)(例えば、4KB(kilo byte))に等しくなっており、一度に読み書きすることができるデータの最大サイズは、このリードライトバッファのサイズに制限される。
このため、PD_FS54は、フィルタコア53AからのIRP_MJ_READのIRPによって読み出しが要求されるデータのサイズが、リードライトバッファのサイズを越えている場合には、フィルタコア53AからのIRP_MJ_READのIRPを、リードライトバッファのサイズ以内のデータの読み出しを要求する複数のIRP_MJ_READのIRPに分割し、PDストレージ55に出力する。フィルタコア53AからのIRP_MJ_WRITEのIRPについても、同様である。
一方、ステップS311において、キャッシュフラグが1でないと判定された場合、即ち、キャッシュフラグが0であり、従って、PDフィルタ53(のフィルタコア53A)がキャッシュオフ状態になっている(設定されている)場合、ステップS314に進み、フィルタコア53Aは、コマンドバッファ111に記憶されたIRP、即ち、ファイルの読み出しを要求するIOCTL_PD_READ_FILE、またはファイルの書き込みを要求するIOCTL_PD_WRITE_FILE(図21)が指定されているIRP_MJ_DEVICE_CONTROLのIRPを、そのまま、PD_FS54に出力し、次のIRPが供給されるのを待って、ステップS301に戻る。
なお、この場合、PD_FS54は、フィルタコア53AからのIOCTL_PD_READ_FILE、、またはIOCTL_PD_WRITE_FILEが指定されているIRP_MJ_DEVICE_CONTROLのIRPを受信し、キャッシュ機能を利用せずに、即座に、そのIRPを、PDストレージ55に出力する。
即ち、上述したように、PD_FS54は、IRP_MJ_DEVICE_CONTROLのIRPについては、キャッシュ機能を提供せず、即座に、PDストレージ55に出力する。
ここで、一度に読み書きすることができるデータの最大サイズは、上述したように、PDストレージ55のリードライトバッファのサイズに制限される。
このため、フィルタコア53Aは、ステップS314においてPD_FS54に出力するIRP_MJ_DEVICE_CONTROLのIRPによって読み書きが要求されるデータのサイズが、リードライトバッファのサイズを越えている場合には、そのIRP_MJ_DEVICE_CONTROLのIRPを、リードライトバッファのサイズ以内のデータの読み書きを要求する複数のIRP_MJ_DEVICE_CONTROLのIRPに分割し、PD_FS54に出力する。
なお、キャッシュオン/オフ機能によって、キャッシュ機能が利用されたり、されなかったりするのは、図21に示したユーザ定義のIOCTLが指定されるIRP_MJ_DEVICE_CONTROLのIRPだけであり、このIOCTLが指定されるIRPは、PD_API41のみが提供する図20のAPI関数の呼び出しによって、NT入出力マネージャ52からPDフィルタ53に出力される。
従って、キャッシュオン/オフ機能を利用することができるのは、本実施の形態では、PD_API41をロードするAVアプリケーション33だけである。
そして、AVアプリケーション33において、キャッシュ機能を利用しない場合には、AVアプリケーション33からのIRPに対するキャッシュ処理の分のオーバヘッドが生じることによる、そのIRPの処理の遅延を防止し、AVアプリケーション33によるAVデータの再生や記録のリアルタイム性を向上させることができる。
一方、他のアプリケーション31や32は、Win32サブシステム51が提供するAPI関数ReadFile()またはWriteFile()を直接呼び出すことにより、データの読み出しまたは書き込みを要求するので、データの読み出しまたは書き込みにあたっては、必ず、キャッシュ機能を利用することになる。
このキャッシュ機能の利用により、PD_FS54からPDストレージ55に対して、アプリケーション31や32からのIRPが出力される頻度が低下する。これにより、アプリケーション31や32からのIRPによって要求されるデータの読み書きによって生じるドライブ2のシーク、さらには、そのデータの読み書き後の、AVアプリケーション33からのIRPによって要求されるデータの読み書き時に生じるドライブ2のシークの発生を防止(低減)し、やはり、AVアプリケーション33によるAVデータの再生や記録のリアルタイム性を向上させることができる。
次に、上述の第1乃至第3の機能のうちのいずれかと、キャッシュオン/オフ機能とは、組み合わせて使用することができる。
図24は、第1または第2の機能のうちのいずれか一方と、キャッシュオン/オフ機能とを組み合わせて使用する場合のPDフィルタ53の構成例を示している。
図24においては、PDフィルタ53は、第1の機能の処理で説明したように、アプリケーション31乃至33からの、光ディスク3に対するアクセス要求に対応するIRPに対して、IRPプライオリティを設定し、そのIRPプライオリティが設定されたIRPをキュー81に記憶させる。そして、PDフィルタ53は、キュー81に記憶されたIRPを、そのIRPに設定されたプライオリティにしたがって読み出し、PD_FS54に出力する。
あるいは、PDフィルタ53は、第2の機能の処理で説明したように、アプリケーション31乃至33からの、光ディスク3に対するアクセス要求に対応するIRPの処理の許可または不許可を表すポーズフラグを設定する一方、アプリケーション31乃至33からのIRPをキュー81に記憶させる。そして、PDフィルタ53は、キュー81に記憶されたIRPを、ポーズフラグにしたがって読み出し、PD_FS54に出力する。
さらに、PDフィルタ53は、キャッシュオン/オフ機能の処理で説明したように、AVアプリケーション33からのIRPについて、キャッシュ機能の利用の有無を設定し、IRPをPD_FS54に出力する際、その設定結果にしたがって、そのIRPを処理する。
図25は、第3の機能とキャッシュオン/オフ機能とを組み合わせて使用する場合のPDフィルタ53の構成例を示している。
図25においては、PDフィルタ53は、第3の機能の処理で説明したように、AVアプリケーション33以外のアプリケーション、即ち、アプリケーション31および32(のプロセス)からのIRPの、PD_FS54への出力をオン/オフする機能的なスイッチ101を有し、その機能的なスイッチ101を、レジストリ58に記憶されたスイッチ設定情報にしたがってオンまたはオフにすることによって、アプリケーション31および32からのIRPの、PD_FS54への出力を制御する。
さらに、PDフィルタ53は、キャッシュオン/オフ機能の処理で説明したように、AVアプリケーション33からのIRPについて、キャッシュ機能の利用の有無を設定し、IRPをPD_FS54に出力する際、その設定結果にしたがって、そのIRPを処理する。
以上のように、第1乃至第3の機能のうちのいずれかと、キャッシュオン/オフ機能とを組み合わせて使用する場合にも、アプリケーション31および32が光ディスク3にアクセスすることに起因するシークを抑制(防止)すること等ができ、これにより、アプリケーション33によるAVデータのリアルタイムでの再生や記録を行うことが可能となる。
なお、本実施の形態では、データの記録や再生が行われる記録媒体として、光ディスクを採用することとしたが、本発明は、その他、例えば、ハードディスクその他のディスク状の記録媒体などのシークが生じる記録媒体に対してデータの記録や再生を行う場合に適用可能である。
また、本明細書において、PC1に各種の処理を行わせるためのプログラムを記述する処理ステップは、必ずしもフローチャートとして記載された順序に沿って時系列に処理する必要はなく、並列的あるいは個別に実行される処理(例えば、並列処理あるいはオブジェクトによる処理)も含むものである。
1 PC, 2 ドライブ, 3 光ディスク, 4 1394ケーブル, 11 バス, 12 CPU, 13 ROM, 14 RAM, 15 ハードディスク, 16 出力部, 17 入力部, 18 通信部, 19 ドライブ, 20 入出力インタフェース, 21 リムーバブル記録媒体, 22 IEEE1394I/F, 30 OS, 31乃至33 アプリケーション, 41 PD_API, 51 Win32サブシステム, 52 NT入出力マネージャ, 53 PDフィルタ, 53A フィルタコア, 54 PD_FS, 54A FSコア, 55 PDストレージ, 56 SBP2ドライバ, 57 1394バスドライバ, 58 レジストリ, 59 NTキャッシュマネージャ, 81A,81B キュー, 101 スイッチ, 111 コマンドバッファ