以下に本発明の実施の形態を説明するが、請求項に記載の構成要件と、発明の実施の形態における具体例との対応関係を例示すると、次のようになる。この記載は、請求項に記載されている発明をサポートする具体例が、発明の実施の形態に記載されていることを確認するためのものである。従って、発明の実施の形態中には記載されているが、構成要件に対応するものとして、ここには記載されていない具体例があったとしても、そのことは、その具体例が、その構成要件に対応するものではないことを意味するものではない。逆に、具体例が構成要件に対応するものとしてここに記載されていたとしても、そのことは、その具体例が、その構成要件以外の構成要件には対応しないものであることを意味するものでもない。
さらに、この記載は、発明の実施の形態に記載されている具体例に対応する発明が、請求項に全て記載されていることを意味するものではない。換言すれば、この記載は、発明の実施の形態に記載されている具体例に対応する発明であって、この出願の請求項には記載されていない発明の存在、すなわち、将来、分割出願されたり、補正により追加される発明の存在を否定するものではない。
請求項1に記載の情報処理装置は、
ファイルシステム(例えば、図6の実ファイルシステム61または仮想ファイルシステム62)を有する記録又は再生装置(例えば、図6のドライブ2)と接続される情報処理装置(例えば、図6のPD_FS54)において、
アプリケーションからのファイル操作に関する要求(例えば、API関数の呼び出し)に応じてオペレーティングシステムが提供するコマンド(例えば、IRP)を受信する受信手段(例えば、図14のステップS101の処理を行う図6のPD_FS54)と、
前記オペレーティングシステムが提供するコマンドを、前記記録又は再生装置との通信(例えば、IEEE1394の規格に準拠した通信)において前記ファイルシステムを扱うことが可能な通信プロトコル(例えば、SBP2)のコマンドに変換される要求(例えば、ユーザ定義のIOCTLを発行する関数IoCallDriver())に変換する変換手段(例えば、図14のステップS102の処理を行う図6のPD_FS54)と
を備えることを特徴とする。
請求項2に記載の情報処理装置は、
前記記録又は再生装置が1のファイルハンドルだけを扱う場合において、
前記記録又は再生装置の1つのファイルハンドルに対するアクセスの排他制御を行う排他制御手段(例えば、図15のファイルハンドルリソースマネージャ54A)をさらに備える
ことを特徴とする。
請求項6に記載の情報処理方法は、
ファイルシステムを有する記録又は再生装置と接続される情報処理装置の情報処理方法において、
アプリケーションからのファイル操作に関する要求に応じてオペレーティングシステムが提供するコマンドを受信する受信ステップ(例えば、図14のステップS101)と、
前記オペレーティングシステムが提供するコマンドを、前記記録又は再生装置との通信において前記ファイルシステムを扱うことが可能な通信プロトコルのコマンドに変換される要求に変換する変換ステップ(例えば、図14のステップS102)と
を含むことを特徴とする。
請求項7に記載のプログラムおよび請求項8に記載の記録媒体に記録されているプログラムは、
ファイルシステムを有する記録又は再生装置と接続されるコンピュータに行わせるプログラムにおいて、
アプリケーションからのファイル操作に関する要求に応じてオペレーティングシステムが提供するコマンドを受信する受信ステップ(例えば、図14のステップS101)と、
前記オペレーティングシステムが提供するコマンドを、前記記録又は再生装置との通信において前記ファイルシステムを扱うことが可能な通信プロトコルのコマンドに変換される要求に変換する変換ステップ(例えば、図14のステップS102)と
を含むことを特徴とする。
以下、図面を参照して、本発明の実施の形態について説明する。
図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(のプログラム)が、少なくとも、図2のハードディスク15にインストールされており、CPU12は、PC1の電源がオンにされると、ハードディスク15からRAM14に、OS30をロードして実行する。さらに、例えば、ユーザが入力部17を操作するなどして、アプリケーション31の起動を要求すると、CPU12は、ハードディスク15からRAM14に、アプリケーション31をロードし、OS30の制御の下で実行する。
そして、アプリケーション31が、例えば、ドライブ2に装着された光ディスク3に対するファイル操作に関する要求であるアクセス要求を行うと、OS30は、そのアクセス要求を処理する。これにより、ドライブ2において、アプリケーション31からのアクセス要求によって記録が要求されたデータが、光ディスク3に記録される。あるいは、ドライブ2において、アプリケーション31からのアクセス要求によって再生(読み出し)が要求されたデータが、光ディスク3から読み出され、OS30を介して、アクセス要求を行ったアプリケーション31に渡される。
なお、図2のハードディスク15にインストールするアプリケーションは、アプリケーション31の1つに限定されるものではなく、2以上であっても良い。
また、アプリケーション31は、例えば、外部からのAVデータの取り込みや、AVデータの編集、記録、再生などを行うAVアプリケーションであるとする。但し、アプリケーション31は、AVアプリケーションである必要はない。即ち、アプリケーション31は、例えば、テキストデータの編集等を行うアプリケーションであっても良いし、ファイルの表示を行うアプリケーション(例えば、「エクスプローラ」や「ファイルマネージャ」などといったファイルユーティリティ)であっても良い。
次に、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との関係が分かるように示してある。
Windows(R)のNT系のOSであるOS30は、カーネル58に、ハードウェア依存の処理等の必要最小限の処理を行う部分だけを残して、サービスを分離し、その分離したサービスを、サブシステムによって実装している。
Win32サブシステム(Win32 SubSystem)51は、サブシステムの1つで、アプリケーション31に対して、各種のAPI(関数)を提供し、例えば、メモリ管理、プロセス管理、グラフィックス描画などを行う。
即ち、Win32サブシステム51は、アプリケーション31(を実行しているプロセスまたはスレッド)から、例えば、I/O(Input/Output)関係のAPI関数が呼び出されると、そのAPI関数に応じたI/O要求を、NT入出力マネージャ(NT I/O Manager)52に出力する。
なお、Win32サブシステム51が提供するAPI関数としては、例えば、ファイルの生成を行う(ファイルをオープンする)CreateFile()、ファイル(ファイルに記録されたデータ)の読み出しを行うReadFile()、ファイル(ファイルへのデータ)の書き込みを行うWriteFile()、ファイルをクローズするCloseFile()、その他の各種の処理を行うDeviceIoControl()などがある。
NT入出力マネージャ52は、レイヤ構造のデバイスドライバ(Device Driver)に対して、IRP(I/O Request Packet)を渡すためのサービスを提供する。
ここで、IRPは、デバイスドライバに対して要求する処理の情報を有するパケットで、IRPには、例えば、要求の内容を分類するコード(code)、データ(ファイル)の読み出し(再生)を要求するIRP_MJ_READ、データの書き込み(記録)を要求するIRP_MJ_WRITE、ファイルのオープンを要求するIRP_MJ_CREATE、ファイルのクローズを要求するIRP_MJ_CLOSE、その他の各種の処理を要求する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)であるFSフィルタドライバ53の3つのデバイスドライバが存在する。
従って、本実施の形態では、NT入出力マネージャ52は、これらのFSフィルタドライバ53、PD_FS54、PDストレージ55に対して、IRPを渡すためのサービスを提供する。
具体的には、NT入出力マネージャ52は、Win32サブシステム51からのI/O要求を、IRPに変換し、例えば、FSフィルタドライバ53に出力する。そして、FSフィルタドライバ53が、NT入出力マネージャ52からのIRPに応じた要求を、例えば、NT入出力マネージャ52に出力し、NT入出力マネージャ52は、FSフィルタドライバ53からの要求を、IRPに変換して、その1つ下位のレイヤのPD_FS54に出力する。さらに、PD_FS54が、NT入出力マネージャ52からのIRPに応じた要求を、例えば、NT入出力マネージャ52に出力し、NT入出力マネージャ52は、PD_FS54からの要求を、IRPに変換して、その1つ下位のレイヤのPDストレージ55に出力する。
FS(FileSystem)フィルタドライバ53は、後述するPD_FS54の上位のファイルシステムフィルタドライバである。FSフィルタドライバ53は、アプリケーション31から、Win32サブシステム51およびNT入出力マネージャ52を介して供給される、ファイルシステムに関連するファイルシステム要求その他の要求(request)のフィルタリングを行い、そのフィルタリングの結果、PD_FS54に渡すべき要求を得て、NT入出力マネージャ52を介して、PD_FS54に出力する等の処理を行う。なお、FSフィルタドライバ53としては、例えば、OS30としてのWindows(R)のNT系のOSに標準のファイルシステムフィルタドライバを用いることができる。
PD_FS54は、PDドライブであるドライブ2用の、ファイル管理を行うためのファイルシステムドライバで、FSフィルタドライバ53からNT入出力マネージャ52を介して要求されたファイルの書き込みや読み出しなどの要求を、NT入出力マネージャ52を介して、PDストレージ55に出力する。
なお、後述するように、論理ブロック単位でのデータの読み書き制御、ファイルのアロケーション管理、ディフェクト処理、空き領域管理などのファイル管理は、ドライブ2のファイルシステムで行われるため、PD_FS54は、これらのファイル管理(ドライブ2のファイルシステムで行われるファイル管理)は行わない。但し、アプリケーション31からは、ドライブ2のファイルシステムで行われるファイル管理が、PD_FS54で行われているように見える。従って、PD_FS54は、ドライブ2のファイルシステムを偽装しているということができ、かかる観点からは、偽装ファイルシステムということができる。
ここで、ファイルシステムドライバは、一般に、ファイルストリーム(File Stream)(ファイルに記録される(記録された)データのファイル)やファイルメタ(File Meta)情報のキャッシュ(Cache)機能を有し、このキャッシュ機能によれば、例えば、キャッシュされたファイルストリームやファイルメタ情報については、光ディスク3に実際にアクセスせずに、高速に得ることができる。
Windows(R)のNT系のOSでは、NTキャッシュマネージャ(NT Cache Manager)59が、キャッシュ機能を有しており、PD_FS54は、NTキャッシュマネージャ59を利用して、キャッシュ機能を提供する。
なお、PD_FS54は、ファイルハンドルリソースマネージャ54Aを有し、このファイルハンドルリソースマネージャ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との間の通信に対応したバスドライバが用いられる。
なお、AVアプリケーションであるアプリケーション31は、PDドライブであるドライブ2を使用するのに必要なPD_FS54、およびPDストレージ55とともに、例えば、リムーバブル記録媒体21(図2)に記録して販売することができる。また、アプリケーション31、PD_FS54、およびPDストレージ55が記録されたリムーバブル記録媒体21は、単体で販売する他、例えば、ドライブ2に同梱し、ドライブ2の付属品として販売することができる。
ここで、図4において、アプリケーション31と、Win32サブシステム51とは、ユーザモード(User Mode)で動作し、NT入出力マネージャ52、FSフィルタドライバ53、PD_FS54、PDストレージ55、SBP2ドライバ56、1394バスドライバ57、カーネル58およびNTキャッシュマネージャ59は、カーネルモード(Kernel Mode)で動作する。
さらに、図4では、NT入出力マネージャ52が、IRPを、ファイルシステムフィルタドライバであるFSフィルタドライバ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から光ディスク3に対するアクセスが要求されたときに図4のOS30で行われるFSフィルタドライバ53,PD_FS54,PDストレージ55,SBP2ドライバ56,1394バスドライバ57の処理の概要について説明する。
なお、以下の説明と図5以降の図面においては、それぞれ、Win32サブシステム51およびNT入出力マネージャ52の説明と図示を、適宜省略する。
アプリケーション31が、例えば、光ディスク3に対するアクセスを要求するAPI関数を呼び出すと、そのAPI関数に応じた要求が、Win32サブシステム51からNT入出力マネージャ52に供給され、NT入出力マネージャ52は、Win32サブシステム51からの要求に応じたIRPが、FSフィルタドライバ53に供給される。
FSフィルタドライバ53は、ステップS1において、NT入出力マネージャ52からのIRPを受信し、ステップS2に進む。FSフィルタドライバ53は、ステップS2において、NT入出力マネージャ52からのIRPをフィルタリングして、ステップS3に進み、PD_FS54に供給すべきIRPをキューイングする。即ち、FSフィルタドライバ53は、図示せぬキューに、NT入出力マネージャ52からのIRPを供給して記憶させる。
さらに、FSフィルタドライバ53は、キューに記憶されたIRPを読み出し、NT入出力マネージャ52を介して、PD_FS54に供給して、ステップS4に進む。
なお、FSフィルタドライバ53内の処理は、フィルタの性質によって違うため、ここではその一例を示しており、これに限定されるものではない。
ステップS4では、PD_FS54は、FSフィルタドライバ53からのIRPによって要求されているデータについて、NTキャッシュマネージャ59のキャッシュ機能を利用するのに必要な処理としてのキャッシュ処理を行い、ステップS5に進み、例えば、FSフィルタドライバ53からのIRPによって要求されているデータが、NTキャッシュマネージャ59にキャッシュされているかどうかを判定する。
ステップS5において、FSフィルタドライバ53からのIRPによって要求されているデータが、NTキャッシュマネージャ59にキャッシュされていると判定された場合、ステップS6に進み、PD_FS54は、FSフィルタドライバ53からのIRPによって要求されているデータを、NTキャッシュマネージャ59から受信する等し、そのIRPに対する応答を、FSフィルタドライバ53およびWin32サブシステムを介して、そのIRPに対応するAPI関数を呼び出したアプリケーションアプリケーション31に返す。
一方、ステップS5において、FSフィルタドライバ53からのIRPによって要求されているデータが、NTキャッシュマネージャ59にキャッシュされていないと判定された場合、ステップS7に進み、PD_FS54は、FSフィルタドライバ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、FSフィルタドライバ53、およびWin32サブシステム51を介して、ステップS1で受信されたIRPを送信してきたアプリケーション31に返す。
次に、図6を参照して、ドライブ2が内部に有する専用のファイルシステムと、ドライブ2で採用されているプロトコルについて説明する。
ドライブ2は、前述したように、高ビットレートのAVデータのリアルタイムでの記録又は再生が可能なPDドライブであり、専用のファイルシステムとして、実ファイルシステム61と仮想ファイルシステム62を有する。なお、ドライブ2は、記録のみ、または再生のみ行うドライブであっても良いが、ここでは、記録と再生の両方が可能なドライブであるとする。
実ファイルシステム61は、光ディスク3上の実ファイル(実際のファイル)を、例えばUDFにしたがって管理し、光ディスク3に対する、論理ブロック単位でのデータの読み書きを制御する。また、実ファイルシステム61は、前述したPDファイルアロケーションマネージャ(図示せず)を有しており、PDファイルアロケーションマネージャは、一筆書き記録の制御や、光ディスク3上のファイルのアロケーション管理、ディフェクト処理、空き領域管理などを行う。
仮想ファイルシステム62は、実ファイルシステム61の実ファイルをフィルタリングする等の処理を行い、その結果得られる、後述するようなファイル(仮想ファイル)を、ドライブ2の外部に提供する。従って、ドライブ2の外部には、仮想ファイルシステム62が提供される。このため、ドライブ2は、実ファイルシステム61で管理される実ファイルを、仮想ファイルシステム62で管理される仮想ファイルとして外部に提供することができるプロトコルによる通信機能を有している。
ここで、ドライブ2においては、AVデータや、テキストデータ、その他の任意のデータを、仮想ファイルシステム62を介して読み書きすることができる。
ドライブ2では、仮想ファイルシステム62(で管理される仮想ファイル)を外部に提供することができるプロトコルとして、例えば、IEEE1394通信(IEEE1394の規格に準拠した通信)において周辺装置を制御することができるプロトコルであるSBP2(IEEE1394 SBP2 Protocol)をコマンド拡張したプロトコルが採用されている。
いま、このSBP2をコマンド拡張したプロトコルを、PD-SBP2というものとすると、PD-SBP2は、PC1上のアプリケーションのレイヤのアプリケーション31などがファイルにアクセスするときにOS30のWin32サブシステム51(図4)が提供するインタフェース(API)と同様の機能を提供する。従って、PD-SBP2によれば、例えば、ファイル名を指定して、そのファイル名のファイルに対して、ファイルストリームの読み書き(Read/Write)を行うことができ、また、ファイルのメタ情報を、そのファイルのファイル名およびパス名を元に取得することができる。
PD-SBP2は、上述したように、IEEE1394通信で用いられるSBP2(IEEE1394 SBP2 Protocol)をコマンド拡張したプロトコルであるため、そのようなプロトコルを採用するドライブ2は、PC1側においてIEEE1394通信を制御する1394バスドライバ57に接続され、さらに、1394バスドライバ57は、SBP2を実装するSBP2ドライバ56に接続される。
なお、OS30がWindows(R)のNT系のOSである場合には、SBP2ドライバ56と1394バスドライバ57としては、いずれも、そのOSに付属のものを使用することができる。
次に、図7を参照して、図6の仮想ファイルシステム62の処理について説明する。
図7の右側は、実ファイルシステム61により管理されている実ファイルを示しており、図7の左側は、仮想ファイルシステム62からドライブ2の外部に提供される仮想ファイルを示している。
まず、図7の右側の実ファイルシステム62の実ファイルについて説明する。
なお、以下において、「ディレクトリ」の後に続く英字等は、そのディレクトリのディレクトリ名を表す。同様に、「ファイル」の後に続く英字等は、そのファイルのファイル名を表す。また、ファイル名のうちの、ピリオド(.)に続く英字等は、ファイルの拡張子である。例えば、拡張子"XML"は、XML(eXtensible Markup Language)のファイルであることを表す。また、例えば、拡張子"MXF"は、MXFのファイルであることを表す。
ルートディレクトリROOTには、ビデオデータやオーディオデータ等の素材データに関する情報や、素材データの編集結果を示すエディットリスト等が格納されるディレクトリ、その他のAVデータに関連するファイル(ディレクトリ)が配置されるディレクトリPROAVと、AVデータに関連するファイル以外の任意のデータのファイルである、例えば、ファイルDocument.txtや、Infomation.doc,EditData.xlsが格納されるゼネラルディレクトリGeneralとが設けられている。
なお、ここでは、AVデータに関連するファイルとして、例えば、MXFのファイル(MXF File)を採用することとする。また、実ファイルシステム61により管理されている実ファイルとしてのMXFのファイルは、例えば、ビデオデータとオーディオデータとが別のファイルとされるMXF OP-Atomのファイルであるとし、仮想ファイルシステム62により管理され、外部に提供される仮想ファイルは、例えば、ビデオデータとオーディオデータとがインタリーブされて1つのファイルとされるMXF OP-1aのファイルであるとする。
ディレクトリPROAVには、インデックスファイルINDEX.XMLおよびINDEX.BUP、ディスクインフォメーションファイルDISCINFO.XMLおよびDISKINFO.BUP、並びにディスクメタファイルDISCMETA.XMLが設けられている。
インデックスファイルINDEX.XMLおよびINDEX.BUPは、光ディスク3に記録されている全てのクリップおよびエディットリストを管理するための管理情報等を含む。
なお、クリップは、例えば、1回の記録で光ディスク3に記録されたビデオデータ等のまとまったビデオデータと、そのビデオデータに対応するオーディオデータとのセットである。また、エディットリストは、いわゆるノンリニア編集が行われたときの編集手順のリストで、例えば、ノンリニア編集において、あるファイルのAVデータがカット編集された場合には、そのファイルを特定する情報としてのファイル名や、イン点およびアウト点などの情報が、エディットリストに記録される。
ディスクインフォメーションファイルDISCINFO.XMLおよびDISKINFO.BUPは、光ディスク3に記録されているデータ全体に対するメタデータであり、例えば、ディスク属性や、再生開始位置等の情報を含むファイルである。
なお、ディスクインフォメーションファイルDISKINFO.BUPは、ディスクインフォメーションファイルDISCINFO.XMLのバックアップファイル(コピー)である。同様に、上述のインデックスファイルINDEX.BUPも、インデックスファイルINDEX.XMLのバックアップファイルである。
ディスクメタファイルDISCMETA.XMLは、光ディスク3に記録されている全ての素材データに対するタイトルやコメント、さらに、光ディスク3に記録されている全てのビデオデータの代表となるフレームである代表画に対応するビデオデータのパス等の情報を含むファイルである。
また、ディレクトリPROAVには、上述したファイル以外に、クリップのデータが下位のディレクトリに設けられるクリップルートディレクトリCLPR、エディットリストのデータが下位のディレクトリに設けられるエディットリストルートディレクトリEDTRが設けられている。
クリップルートディレクトリCLPRには、光ディスク3に記録されているクリップのデータが、クリップ毎に異なるディレクトリに分けて管理されており、例えば、図7の右側では、3つのクリップのデータが、クリップディレクトリC0001,C0002,C0003の3つのディレクトリに分けられて管理されている。
すなわち、光ディスク3に記録された最初のクリップ#1の各データは、クリップディレクトリC0001のファイルとして管理され、2番目に光ディスク3に記録されたクリップ#2の各データは、クリップディレクトリC0002のファイルとして管理され、3番目に光ディスク3に記録されたクリップ#3の各データは、クリップディレクトリC0003のファイルとして管理されている。
クリップディレクトリC0001には、最初に光ディスク3に記録されたクリップ#1の各データのファイルが配置されている。
図7の右側では、クリップディレクトリC0001には、クリップ#1を管理するファイルであるクリップインフォメーションファイルC0001C01.SMI、クリップ#1のビデオデータを含むファイルであるビデオデータファイルC0001V01.MXF、クリップ#1の8チャンネルのオーディオデータそれぞれのファイルである8つのオーディオデータファイルC0001A01.MXF乃至C0001A08.MXF、クリップ#1の低ビットレートのビデオデータを含むファイルであるローレゾデータファイルC0001S01.MXF、クリップ#1の素材データに対応する、例えば、LTC(Longitudinal Time Code)とフレーム番号を対応させる変換テーブル等の、リアルタイム性を要求されないメタデータであるクリップメタデータを含むファイルであるクリップメタデータファイルC0001M01.XML、およびクリップ#1の素材データに対応する、例えばLTC等の、リアルタイム性を要求されるメタデータであるフレームメタデータを含むファイルであるフレームメタデータファイルC0001R01.BIMが配置されている。
なお、図7の右側の他のクリップディレクトリC0002とC0003にも、クリップ#2と#3について、それぞれ、クリップディレクトリC0001と同様のファイルが配置されている。
ディレクトリPROAVの下のエディットリストルートディレクトリEDTRには、光ディスク3に記録されているエディットリストが、その編集処理毎に異なるディレクトリに分けて管理されており、図7の右側では、4つのエディットリストが、エディットリストディレクトリE0001,E0002,E0003、およびE0004の4つのディレクトリに分けて管理されている。すなわち、光ディスク3に記録されたクリップの1回目の編集結果を示すエディットリスト#1は、エディットリストディレクトリE0001のファイルとして管理され、2回目の編集結果を示すエディットリスト#2は、エディットリストディレクトリE0002のファイルとして管理され、3回目の編集結果を示すエディットリスト#3は、エディットリストディレクトリE0003のファイルとして管理され、4回目の編集結果を示すエディットリスト#4は、エディットリストディレクトリE0004のディレクトリのファイルとして管理されている。
図7の右側では、エディットリストディレクトリE0001には、エディットリスト#1のファイルであるエディットリストファイルE0001E01.SMIと、エディットリスト#1にしたがった編集の編集後の素材データ(編集に用いられた全クリップの素材データの内、編集後のデータとして抽出された部分)に対応するクリップメタデータ、または、そのクリップメタデータに基づいて新たに生成されたクリップメタデータを含むファイルであるエディットリスト用クリップメタデータファイルE0001M01.XMLとが配置されている。
ここで、エディットリスト用クリップメタデータファイルE0001M01.XMLは、編集に使用されたクリップのクリップメタデータ(クリップルートディレクトリCLPRの下位のディレクトリに存在するクリップメタデータファイル(図7の右側では、例えば、ディレクトリC0001のクリップメタデータファイルC0001M01.XML))に基づいて生成された新たなクリップメタデータを含むファイルである。例えば、クリップ#1を対象とした編集が行われると、クリップメタデータファイルC0001M01.XMLに含まれるクリップメタデータから、編集後の素材データに対応する部分が抽出され、それらを用いて、編集後の素材データを1クリップとする新たなクリップメタデータが再構成され、エディットリスト用クリップメタデータファイルとして管理される。すなわち、編集後の素材データには、編集後の素材データを1クリップとする新たなクリップメタデータが付加され、そのクリップメタデータが1つのエディットリスト用クリップメタデータファイルとして管理される。従って、エディットリスト用クリップメタデータファイルは、編集毎に生成される。
なお、図7の右側の他のエディットリストディレクトリE0002乃至E0004にも、エディットリスト#2乃至#4について、それぞれ、エディットリストディレクトリE0001と同様のファイルが配置されている。
以上のような図7の右側に示した、実ファイルシステム61により管理されている実ファイルは、仮想ファイルシステム62において、図7の左側に示す形で、ドライブ2の外部に提供される。
即ち、仮想ファイルシステム62では、ルートディレクトリROOTには、インデックスファイルINDEX.XMLとディスクメタファイルDISCMETA.XMLが配置されるとともに、ディレクトリClip,Edit,Sub、およびGeneralが設けられる。
仮想ファイルシステム62において、ルートディレクトリROOTに配置されるインデックスファイルINDEX.XMLとディスクメタファイルDISCMETA.XMLは、それぞれ、実ファイルシステム61で管理されているディレクトリPROAVのインデックスファイルINDEX.XMLとディスクメタファイルDISCMETA.XMLである。
また、仮想ファイルシステム62では、ディレクトリClipに、実ファイルシステム61で管理されているディレクトリCLPRの下位ディレクトリにあるクリップのデータのファイルが配置される。
即ち、図7の左側では、ディレクトリClipに、図7の右側のディレクトリC0001,C0002,C0003にあるクリップのデータのファイルとして、それぞれ、ファイルC0001.MXF,C0002.MXF,C0003.MXFが設けられている。
ここで、実ファイルシステム61では、クリップのデータは、上述したように、ビデオデータとオーディオデータとが別のファイルであるMXF OP-Atomのファイルとされる。
即ち、図7の右側のディレクトリC0001では(ディレクトリC0002,C0003についても同様)、クリップ#1のデータが、そのクリップ#1のビデオデータを含むビデオデータファイルC0001V01.MXFと、クリップ#1の8チャンネルのオーディオデータそれぞれのオーディオデータファイルC0001A01.MXF乃至C0001A08.MXFに分けられている。
一方、仮想ファイルシステム62では、クリップのデータは、上述したように、ビデオデータとオーディオデータとがインタリーブされて1つのファイルとなっているMXF OP-1aのファイルとされる。
図7の左側のディレクトリClipにあるファイルC0001.MXFは、図7の右側のディレクトリC0001にあるクリップ#1のビデオデータとオーディオデータとがインタリーブされた1つのファイルである。
即ち、ファイルC0001.MXFは、ディレクトリC0001のビデオデータファイルC0001V01.MXFのビデオデータと、オーディオデータファイルC0001A01.MXF乃至C0001A08.MXFそれぞれの8チャンネルのオーディオデータとをインタリーブして配置したファイルである。
同様に、ディレクトリClipにあるファイルC0002.MXFは、ディレクトリC0002にあるクリップ#2のビデオデータとオーディオデータとがインタリーブされた1つのファイルであり、ファイルC0003.MXFは、ディレクトリC0003にあるクリップ#3のビデオデータとオーディオデータとがインタリーブされた1つのファイルである。
図7の左側のディレクトリClipには、さらに、各クリップのクリップメタデータファイルも配置される。
ここで、図7の左側のディレクトリClipには、クリップメタデータファイルC0001M01.XML,C0002M01.XML,C0003M01.XMLが配置されている。ディレクトリClipのクリップメタデータファイルC0001M01.XMLは、クリップ#1のクリップメタデータファイルで、図7の右側のディレクトリC0001にあるクリップメタデータファイルC0001M01.XMLである。
同様に、ディレクトリClipのクリップメタデータファイルC0002M01.XMLは、クリップ#2のクリップメタデータファイルで、図7の右側のディレクトリC0002にあるクリップメタデータファイルである。さらに、同様に、ディレクトリClipのクリップメタデータファイルC0003M01.XMLは、クリップ#3のクリップメタデータファイルで、図7の右側のディレクトリC0003にあるクリップメタデータファイルである。
図7の左側のルートディレクトリROOTの中のディレクトリEditには、図7の右側のディレクトリEDTRの下位ディレクトリにあるファイルが配置される。
ここで、ディレクトリEditには、ファイルE0001E01.SMIとE0001M01.XML、ファイルE0002E01.SMIとE0002M01.XML、ファイルE0003E01.SMIとE0003M01.XML、およびファイルE0004E01.SMIとE0004M01.XMLが配置されている。
図7の左側のディレクトリEditの中のファイルE0001E01.SMIとE0001M01.XMLは、それぞれ、図7の右側のエディットリスト#1のディレクトリE0001の中のファイルE0001E01.SMIとE0001M01.XMLである。
同様に、ディレクトリEditの中のファイルE0002E01.SMIとE0002M01.XMLは、エディットリスト#2のディレクトリE0002の中のファイルであり、ディレクトリEditの中のファイルE0003E01.SMIとE0003M01.XMLは、エディットリスト#3のディレクトリE0003の中のファイルであり、ディレクトリEditの中のファイルE0004E01.SMIとE0004M01.XMLは、エディットリスト#4のディレクトリE0004の中のファイルである。
図7の左側のディレクトリSubには、各クリップのローレゾデータファイルが配置される。
ここで、図7の左側のディレクトリSubには、ローレゾデータファイルC0001S01.MXF,C0002S01.MXF,C0003S01.MXFが配置されている。ディレクトリSubのローレゾデータファイルC0001S01.MXFは、クリップ#1のローレゾデータファイルで、図7の右側のディレクトリC0001にあるローレゾデータファイルC0001S01.MXFである。
同様に、ディレクトリSubのローレゾデータファイルC0002S01.MXFは、クリップ#2のローレゾデータファイルで、図7の右側のディレクトリC0002にあるローレゾデータファイルである。さらに、同様に、ディレクトリSubのローレゾデータファイルC0003S01.MXFは、クリップ#3のローレゾデータファイルで、図7の右側のディレクトリC0003にあるローレゾデータファイルである。
図7の左側のディレクトリGeneralには、図7の右側のディレクトリGeneralSubにあるファイルDocument.txt,Infomation.doc,EditData.xlsが配置される。
仮想ファイルシステム62(図6)は、実ファイルシステム61で管理されている別ファイルのクリップのビデオデータとオーディオデータを、1つのファイル(仮想ファイル)として、外部に提供する。
さらに、仮想ファイルシステム62は、実ファイルシステム61で管理されているファイルのうちの、ドライブ2の内部だけで使用するファイルなどの、外部(アプリケーション、あるいはユーザなど)に提供する必要がないファイルをフィルタリングし、そのようなファイルを、外部に見せないようになっている。
ここで、図7では、仮想ファイルシステム62のフィルタリングによって、バックアップのファイルINDEX.BUPおよびDISCINFO.BUPや、ディスクインフォメーションファイルDISCINFO.XML、クリップインフォメーションファイルC0001C01.SMI、フレームメタデータファイルC0001R01.BIMなどが、外部から見えないようになっている。
以上のように、仮想ファイルシステム62によれば、実ファイルシステム61で管理され、別ファイルとなっているビデオデータとオーディオデータのMXF OP-Atomのファイルが、ビデオデータとオーディオデータとがインタリーブされて1つのファイルとなっているMXF OP-1aのファイルとして、外部に提供されるので、ユーザやアプリケーション31における取り扱いが容易になる。
即ち、実ファイルシステム61で管理され、別ファイルとなっているビデオデータとオーディオデータのMXF OP-Atomのファイルが、外部に提供される場合、例えば、ユーザが、例えば、クリップ#1を再生対象として指定して、アプリケーション31に再生させるためには、ユーザは、例えば、クリップ#1のビデオデータのファイルC0001V01.MXFと、クリップ#1のオーディオデータの8チャンネル分のファイルC0001A01.MXF乃至C0001A08.MXFを指定しなければならない。さらに、アプリケーション31は、ユーザによって指定されたファイルC0001V01.MXFとファイルC0001A01.MXF乃至C0001A08.MXFの合計で9のファイルをオープンし、そのファイルハンドルを取得して、ビデオデータやオーディオデータの読み出しを行わなければならない。
これに対して、仮想ファイルシステム62によれば、クリップ#1のファイルC0001V01.MXFのビデオデータと、クリップ#1のファイルC0001A01.MXF乃至C0001A08.MXFの8チャンネル分のオーディオデータとが、1つのファイルC0001.MXFとして提供されるので、ユーザは、再生対象として、1つのファイルC0001.MXFを指定すれば済み、さらに、アプリケーションは、そのファイルC0001.MXFのファイルハンドルを取得して、データの読み出しを行うだけで済む。
また、仮想ファイルシステム62によれば、実ファイルシステム61で管理されているファイルを対象として、フィルタリングが行われるので、例えば、ディスクインフォメーションファイルDISCINFO.XMLなどの、ドライブ2の内部だけで使用するファイルなどが、外部から、いわば隠蔽される。
従って、ドライブ2の内部だけで使用するファイルなどが、ユーザの誤操作等によって削除され、または書き換えられることを防止することができる。さらに、ユーザに必要のないファイルが見えることにより、ユーザが必要なファイルを探すときの妨げとなることを防止することができる。
次に、ドライブ2では、図6で説明したように、IEEE1394通信で用いられるSBP2(IEEE1394 SBP2 Protocol)をコマンド拡張したプロトコルであるPD-SBP2を、仮想ファイルシステム62を外部に提供するためのプロトコルとして採用する。
ここで、SBP2では、イニシエータ(Initiator)と呼ばれる装置が、ターゲット(Target)と呼ばれる装置に対して、コマンドを送信し、ターゲットが、イニシエータからのコマンドに対して、レスポンスを返す。
図8は、イニシエータからターゲットに対してコマンドを送信するときのSBP2データであるSCSI command block ORB(Operation Request Blocks)のフォーマットを示している。なお、SBP2において、SCSI command block ORBは、データ転送やデバイス制御に使用される。
図8において、next_ORBフィールドには、次のORBのアドレス(address)、またはNULLがセットされる。
data_descriptorフィールドは、data_sizeフィールドが0以外のとき有効で、データバッファ(data buffer)のアドレス、またはページテーブル(page table)のアドレスがセットされる
n(notify bit)フィールドには、ターゲットによる完了の通知が必要か否かの情報がセットされる。
rq_fmtフィールドには、ORBフォーマット(format)の情報がセットされる。
r(reserved)フィールドは、いわゆる予約領域である。
d(direction bit)フィールドには、データ(Data)転送の方向がセットされる。即ち、dフィールドが0である場合は、ターゲットからのデータの読み出し(target read transactions)を表し、dフィールドが1である場合は、ターゲットへのデータの書き込み(target write transactions)を表す。
spd(speed)フィールドには、ターゲットのデータ転送処理スピード(Speed)がセットされる。
max_payloadフィールドには、最大データ転送量(length)がセットされる。なお、最大データ転送量は、2の(max_payload + 2)乗となる。
p(page_table_present bit)フィールドには、0または1がセットされる。即ち、data_descriptorフィールドにおいて、データバッファのアドレスがセットされている場合には、pフィールドに0がセットされる。また、data_descriptorフィールドにおいて、ページテーブルのアドレスがセットされている場合には、pフィールドに1がセットされる。
page_sizeフィールドには、pフィールドが1である場合に、データバッファとしてのメモリ(memory)のページサイズ(page size)がセットされる。なお、ページサイズは、2の(page_size + 8)乗となる。
data_sizeフィールドには、pフィールドが0である場合に、データバッファのサイズ(size)がセットされる。
cdb(SCSI command descriptor blocks)フィールド、即ち、12のcdb[0]乃至cdb[11]フィールドには、SCSIコマンド(コード)(SCSI command)がセットされる。
SBP2では、CDB[0]フィールドにセットすることができる値のうちの、C0h乃至FFh(hは、その前の英数字が16進数であることを表す)が、ベンダスペシフィック(Vender Specific)エリアとされている。
そこで、PD-SBP2では、ベンダスペシフィックエリアの値を用いて、コマンド拡張(新たなコマンドの定義)がされている。
即ち、PD-SBP2では、CDB[0]フィールドに、拡張コマンド(のオペコード)がセットされる。また、PD-SBP2では、CDB[1]乃至CDB[11]フィールドに、コマンド(拡張コマンド)の引数(オペランド)が、必要に応じてセットされる。
次に、図9は、ターゲットが、イニシエータからのコマンドに対して返すレスポンスとしてのSBP2データであるSBP2ステータスブロック(SBP2 status block)のフォーマットを示している。なお、SBP2において、SBP2ステータスブロックは、SCSI sense dataのためのステータスブロックで、ターゲットが要求の完了や、ステータス(status)の変化を返すときに使用される。
図9において、srcフィールドには、SBP2ステータスブロックのoriginを示すフラグ(flag)がセットされる。
resp(respose status)フィールドには、応答状態を示す情報がセットされる。
d(dead bit)には、フェッチエージェント(fetch agent)がエラー(error)によりdead stateに変わったことを示すフラグがセットされる。
lenフィールドには、SBP2ステータスブロックのサイズがセットされる。SBP2ステータスブロックのサイズは、lenフィールドにセットされた値に、1quadlets(32ビット)を加算した値である。
sbp_statusフィールドには、respに伴う追加的情報がセットされる。
ORB_offset_hiフィールドとORB_offset_loフィールドには、SBP2ステータスブロックの元となるORBの情報がセットされる。
r(reserved)フィールドは、予約領域である。
sfmtフィールドには、SBP2ステータスブロックのフォーマットの情報がセットされる。
statusフィールドには、SCSIステータス(SCSI status)がセットされる。
v(valid bit)には、後述するinfomationフィールドの内容(content)の有効または無効を表すフラグがセットされる。
mフィールドには、SCSIマークビット(SCSI mark bit)がセットされ、eフィールドには、SCSI eom bitがセットされる。iフィールドには、SCSI illegal_length_indicator bitがセットされ、sense_keyフィールドには、SCSI sense keyがセットされる。sense_codeフィールドには、SCSI additional sense codeがセットされ、sense_qualifierフィールドには、SCSI additional sense code qualifierがセットされる。
infomationフィールド、CDB-dependentフィールド、fruフィールド、sense_key_dependentフィールド、およびvender-dependentフィールドには、いずれもデバイスタイプ(device type)やコマンド(command)などに依存した情報がセットされる。
PD-SBP2では、informationフィールドに、拡張コマンドに対する返り値がセットされる。
次に、図10は、PD-SBP2のコマンド(拡張コマンド)の一覧を示している。
図10において、コマンドFILE OPENは、ファイル名とファイルオープンモード(File Open Mode)を引数とし、引数のファイル名によって特定されるファイルを、引数のフィルオープンモードでオープン(Open)する。コマンドFILE OPENに対しては、オープンされたファイルのファイルハンドル(File Handle)が返される。
コマンドFILE CLOSEは、ファイルハンドルを引数とし、そのファイルハンドルで特定されるファイルをクローズ(Close)する。
コマンドFILE READは、ファイルハンドルとリードサイズ(Size)を引数とし、引数のファイルハンドルによって特定されるファイルのデータ(File Stream data)を、引数のリードサイズ分だけ読み出す(Readする)。
コマンドFILE WRITEは、ファイルハンドルとライトサイズ(Size)を引数とし、引数のファイルハンドルによって特定されるファイルに対して、データ(File Stream data)を、引数のライトサイズ分だけ書き込む(Writeする)。
コマンドFILE LOGICAL SEEKは、ファイルハンドルと、論理的な位置を引数とし、引数のファイルハンドルによって特定されるファイルのファイルポインタ(Current File Pointer)を、引数の論理的な位置に変更する。
コマンドSET EOFは、ファイルハンドルを引数とし、引数のファイルハンドルによって特定されるファイルのファイルポインタが表す位置に、EOF(End Of File)を変更する。
コマンドDELETEは、ファイル名を引数とし、そのファイル名のファイルを削除(Delete)する。
コマンドRENAMEは、変更前のファイル名(またはディレクトリ名)と、変更後のファイル名(またはディレクトリ名)を引数とし、変更前のファイル名を、変更後のファイル名に変更する。
コマンドMAKE DIRECTORYは、ディレクトリ名を引数とし、そのディレクトリ名のディレクトリを生成(作成)する。
コマンドREMOVE DIRECTORYは、ディレクトリ名を引数とし、そのディレクトリ名のディレクトリを削除する。
コマンドLIST OPENは、ファイル名(またはディレクトリ名)を引数とし、そのファイル名のファイルリスト(File List)とファイルメタ(File Meta)情報を得るためのハンドル(Handle)を返す。
コマンドLIST READは、コマンドLIST OPENが返すハンドルを引数とし、そのハンドルによって特定されるファイルリストとファイルメタ情報を読み出す。
コマンドFORMATは、ドライブ2に装着されている光ディスク3をフォーマット(Format)する。
コマンドEJECTは、ドライブ2に装着されている光ディスク3をイジェクト(Eject)する。
コマンドDISC INFOは、ドライブ2に装着されている光ディスク3に関する情報、即ち、例えば、光ディスク3の空き容量などを返す。
コマンドSYSTEMは、ドライブ2に関する情報(Sytem情報)を返す。
コマンドSETUPは、ドライブ2によるPD-SBP2のコマンドの受信を可能にする。即ち、ドライブ2は、コマンドSETUPを受信することにより、図10の他のコマンドの受け付けが可能となる。
次に、図11を参照して、PD-SBP2によるファイルの読み出しシーケンス(PD-SBP2 Protocol File Read Sequence)を説明する。
PC1のアプリケーション31(図4)において、ドライブ2の光ディスク3からデータを読み出す場合、PC1のSBP2ドライバ56がイニシエータとなり、ドライブ2がターゲットとなる。
そして、イニシエータであるPC1(のSBP2ドライバ56)は、ステップS21において、コマンドFILE OPENを、ターゲットであるドライブ2に送信し、ドライブ2は、ステップS41において、そのコマンドFILE OPENを受信して、ステップS42に進む。
ステップS42では、ドライブ2は、PC1からのコマンドFILE OPENによって指定されたファイルをオープンし、そのファイルハンドルを、PC1に返す。ここで、コマンドFILE OPENによって指定されたファイルは、ドライブ2が仮想ファイルシステム62を介して外部に提供するファイルであり、ドライブ2が返すファイルハンドルも、ドライブ2が仮想ファイルシステム62を介して外部に提供するファイルのファイルハンドルである。
PC1は、ステップS22において、ドライブ2からのファイルハンドルを受信して、ステップS23に進み、そのファイルハンドルによって特定されるファイルのファイルポインタを、読み出そうとするデータの先頭位置に移動することを要求するコマンドFILE LOGICAL SEEKを、ドライブ2に送信する。
ドライブ2は、ステップS43において、PC1からのコマンドFILE LOGICAL SEEKを受信する。さらに、ドライブ2は、ステップS42でオープンしたファイルのファイルポインタを、PC1からのコマンドFILE LOGICAL SEEKによって指定されている位置に移動する。
そして、ドライブ2は、ステップS43からS44に進み、ファイルポインタの移動に成功した場合には、その旨を表すレスポンスGOODを、PC1に返し、ファイルポインタの移動に失敗した場合には、その旨を表すレスポンスERRORを、PC1に返す。
PC1は、ステップS24において、ドライブ2からのレスポンスを受信する。そして、PC1は、ドライブ2からのレスポンスが、ファイルポインタの移動に失敗した旨を表すERRORである場合には、例えば、処理を終了する。
また、PC1は、ドライブ2からのレスポンスが、ファイルポインタの移動に成功した旨を表すGOODである場合には、ステップS24からS25に進み、データの読み出しを要求するコマンドFILE READを、ドライブ2に送信する。
ドライブ2は、ステップS45において、PC1からのコマンドFILE READを受信し、ステップS43で移動したファイルポインタの位置からデータを読み出す。
そして、ステップS461乃至S46Nに順次進み、ドライブ2は、ステップS45で読み出したデータを、PC1に送信する。
即ち、ドライブ2からPC1に対して、1度に送信することのできるデータの最大サイズは制限されており、PC1からのコマンドFILE READによって読み出しが要求されたデータのサイズが、ドライブ2が1度に送信することのできるデータの最大サイズより大の場合には、ドライブ2は、PC1からのコマンドFILE READによって読み出しが要求されたデータを、例えば、1度に送信することのできるデータの最大サイズに分けて送信する。図11の実施の形態では、ドライブ2からPC1に対して、ステップS461乃至S46NのN回に分けて、データが送信されている。
PC1は、ステップS261乃至S26Nにおいて、ドライブ2がステップS461乃至S46Nで送信してくるデータをそれぞれ受信し、これにより、コマンドFILE READによって要求したデータすべての受信が完了すると、ステップS27に進み、ステップS21で送信したコマンドFILE OPENによってオープンを要求したファイルのクローズを要求するコマンドFILE CLOSEを、ドライブ2に送信する。
ドライブ2は、ステップS47において、PC1からのコマンドFILE CLOSEを受信し、そのコマンドFILE CLOSEによって指定されたファイルをクローズする。
さらに、ドライブ2は、ステップS47からS48に進み、ファイルのクローズに成功した場合には、その旨を表すレスポンスGOODを、PC1に返し、ファイルのクローズに失敗した場合には、その旨を表すレスポンスERRORを、PC1に返す。
次に、図12を参照して、PD-SBP2によるファイルの書き込みシーケンス(PD-SBP2 Protocol File Write Sequence)を説明する。
PC1のアプリケーション31(図4)において、ドライブ2の光ディスク3にデータを書き込む場合、PC1のSBP2ドライバ56がイニシエータとなり、ドライブ2がターゲットとなる。
そして、イニシエータであるPC1(のSBP2ドライバ56)は、ステップS61において、コマンドFILE OPENを、ターゲットであるドライブ2に送信し、ドライブ2は、ステップS81において、そのコマンドFILE OPENを受信して、ステップS82に進む。
ステップS82では、ドライブ2は、PC1からのコマンドFILE OPENによって指定されたファイルをオープンし、そのファイルハンドルを、PC1に返す。
PC1は、ステップS62において、ドライブ2からのファイルハンドルを受信して、ステップS63に進み、そのファイルハンドルによって特定されるファイルのファイルポインタを、データを書き込む先頭位置に移動することを要求するコマンドFILE LOGICAL SEEKを、ドライブ2に送信する。
ドライブ2は、ステップS83において、PC1からのコマンドFILE LOGICAL SEEKを受信する。さらに、ドライブ2は、ステップS82でオープンしたファイルのファイルポインタを、PC1からのコマンドFILE LOGICAL SEEKによって指定されている位置に移動する。
そして、ドライブ2は、ステップS83からS84に進み、ファイルポインタの移動に成功した場合には、その旨を表すレスポンスGOODを、PC1に返し、ファイルポインタの移動に失敗した場合には、その旨を表すレスポンスERRORを、PC1に返す。
PC1は、ステップS64において、ドライブ2からのレスポンスを受信する。そして、PC1は、ドライブ2からのレスポンスが、ファイルポインタの移動に失敗した旨を表すERRORである場合には、例えば、処理を終了する。
また、PC1は、ドライブ2からのレスポンスが、ファイルポインタの移動に成功した旨を表すGOODである場合には、ステップS64からS65に進み、データの書き込みを要求するコマンドFILE WRITEを、ドライブ2に送信する。
さらに、PC1は、ステップS661乃至S66Nに順次進み、書き込み対象のデータを、ドライブ2に送信する。
即ち、PC1からドライブ2に対して、1度に送信することのできるデータの最大サイズは制限されており、PC1が書き込もうとしているデータ(書き込み対象のデータ)のサイズが、PC1が1度に送信することのできるデータの最大サイズより大の場合には、PC1は、書き込み対象のデータを、例えば、1度に送信することのできるデータの最大サイズに分けて送信する。図12の実施の形態では、PC1からドライブ2に対して、ステップS661乃至S66NのN回に分けて、データが送信されている。
ドライブ2は、ステップS85において、PC1からのコマンドFILE WRITEを受信して、ステップS861乃至S86Nに順次進み、ステップS661乃至S66NでPC1から送信されてくるデータを受信し、ステップS83で移動したファイルポインタの位置から、順次、データを書き込む。
その後、PC1は、ステップS67に進み、ステップS61で送信したコマンドFILE OPENによってオープンを要求したファイルのクローズを要求するコマンドFILE CLOSEを、ドライブ2に送信する。
ドライブ2は、ステップS87において、PC1からのコマンドFILE CLOSEを受信し、そのコマンドFILE CLOSEによって指定されたファイルをクローズする。
さらに、ドライブ2は、ステップS87からS88に進み、ファイルのクローズに成功した場合には、その旨を表すレスポンスGOODを、PC1に返し、ファイルのクローズに失敗した場合には、その旨を表すレスポンスERRORを、PC1に返す。
ところで、SBP2ドライバ56(図4、図6)は、上述したように、PDストレージ55からのSCSIコード(SCSIコマンド)を、図10に示したPD-SBP2のコマンド(拡張コマンド)がcbd[0]フィールドに配置される図8のSCSI command block ORB(SBP2データ)に変換する。
また、PDストレージ55は、上述したように、その上位のレイヤのデバイスドライバであるPD_FS54から、NT入出力マネージャ52を介して供給されるIRPを、SCSIコードに変換して、SBP2ドライバ56に出力する。
従って、PD_FS54が出力するIRPは、PDストレージ55においてSCSIコードに変換され、SBP2ドライバ56に出力される。さらに、SBP2ドライバ56では、PDストレージ55からのSCSIコードがSBP2データ(SCSI command block ORB)に変換される。
即ち、SBP2ドライバ56は、PDストレージ55が出力するSCSIコードを、図8のSCSI command block ORBのcbd[0]フィールドに配置したSBP2データに変換する。
PD-SBP2では、図8のSCSI command block ORBのcbd[0]フィールドに、図10の拡張コマンドが配置される。従って、PDストレージ55が出力するSCSIコードは、図10の拡張コマンドのうちのいずれかであり、いわば特別なSCSIコードである。このため、PD_FS54がNT入出力マネージャ52を介して出力するIRPは、PDストレージ55において特別なSCSIコードに変換される特別なIRPでなければならない。
一方、Win32サブシステム51(図4)がアプリケーション31に対して提供する、ファイル操作のためのAPI関数の呼び出しがあった場合に、Win32サブシステム51が、NT入出力マネージャ52、FSフィルタドライバ53、およびNT入出力マネージャ52を介して、PD_FS54に供給するIRPは、あらかじめ決まっている。
即ち、Win32サブシステム51は、例えば、ファイルをオープンするAPI関数CreateFile()、ファイルからデータを読み出すAPI関数ReadFile()、ファイルにデータ書き込むAPI関数WriteFile()などを、アプリケーション31に提供する。
そして、アプリケーション31が、例えば、API関数CreateFile()を呼び出した場合、NT入出力マネージャ52からPD_FS54には、API関数CreateFile()に対してあらかじめ決まっているIRP_MJ_CREATEのIRPが供給される。
同様に、アプリケーション31が、例えば、API関数ReadFile()、またはWriteFile()を呼び出した場合、NT入出力マネージャ52からPD_FS54には、API関数ReadFile()に対してあらかじめ決まっているIRP_MJ_READ、またはAPI関数WriteFile()に対してあらかじめ決まっているIRP_MJ_WRITEのIRPが、それぞれ供給される。
この場合、PD_FS54が、NT入出力マネージャ52を介して供給されるIRPを、NT入出力マネージャ52を介して、PDストレージ55に供給してしまうと、NT入出力マネージャ52を介して供給されるIRP、即ち、例えば、IRP_MJ_CREATEや、IRP_MJ_READ,IRP_MJ_WRITEなどのIRPは、あらかじめ決まっている、いわば標準のIRPであるから、PDストレージ55では、そのIRPが、そのIRPに対応するSCSIコード、拡張コマンドではないSCSIコード(特別なSCSIコードでないSCSIコード)に変換されることになる。
そこで、PD_FS54は、NT入出力マネージャ52を介して供給されるIRPを変換し、これにより、NT入出力マネージャ52を介してPDストレージ55に対し、拡張コマンドであるSCSIコード(特別なSCSIコード)に変換される特別なIRPを供給する。
特別なIRPとしては、ユーザ定義のIOCTLが指定されるIRP_MJ_DEVICE_CONTROLのIRPが用いられる。
図13は、PD_FS54が、NT入出力マネージャ52を介してPDストレージ55に出力する特別なIRPとしてのIRP_MJ_DEVICE_CONTROLのIRPで指定されるユーザ定義のIOCTLを示している。
図13のIOCTLは、図10に示したPD-SBP2のコマンド(拡張コマンド)のうちのSETUPを除いたものと1対1の関係になっている。
即ち、図13において、IOCTL_PD_FILE_OPEN, IOCTL_PD_FILE_CLOSE, IOCTL_PD_FILE_READ, IOCTL_PD_FILE_WRITE, IOCTL_PD_FILE_LOGICAL_SEEK, IOCTL_PD_SET_EOF, IOCTL_PD_DELETE, IOCTL_PD_RENAME, IOCTL_PD_MAKE_DIRECTORY, IOCTL_REMOVE_DIRECTORY, IOCTL_PD_LIST_OPEN, IOCTL_PD_LIST_READ, IOCTL_PD_FORMAT, IOCTL_PD_EJECT, IOCTL_PD_DISC_INFO, IOCTL_PD_SYSTEMは、図10のコマンドFILE OPEN, FILE CLOSE, FILE READ, FILE WRITE, FILE LOGICAL SEEK, SET EOF, DELETE, RENAME, MAKE DIRECTORY, REMOVE DIRECTORY, LIST OPEN, LIST READ, FORMAT, EJECT, DISC INFO, SYSTEMに、それぞれ対応している。
PDストレージ55は、PD_FS52からNT入出力マネージャ52を介して供給されるIRPが、図13のIOCTLが指定されているIRP(IRP_MJ_DEVICE_CONTROLのIRP)である場合、そのIOCTLに対応する拡張コマンド(特別のSCSIコード)を、SBP2ドライバ56に出力する。
そして、SBP2ドライバ56は、PDストレージ55からの、IOCTLに対応する拡張コマンドを、その拡張コマンドがcbd[0]フィールドに配置された図8のSCSI command block ORB(SBP2データ)に変換する。
次に、図14のフローチャートを参照して、図6(図4)のPD_FS54によるIRPの処理について、さらに説明する。なお、ここでは、説明を簡単にするため、NTキャッシュマネージャ59(図4)が提供するキャッシュ機能の利用は、考えないものとする。
例えば、アプリケーション31が、Win32サブシステム51が提供するファイル操作に関するAPI関数を呼び出すことにより、そのAPI関数に対応するIRPが、図4のWin32サブシステム51、NT入出力マネージャ52、FSフィルタドライバ53、およびNT入出力マネージャ52を介して、PD_FS54に送信されてくると、ステップS101において、PD_FS54は、そのIRPを受信し、ステップS102に進む。
ステップS102では、PD_FS54は、ステップS101で受信したIRPを、ドライブ2とのIEEE1394通信においてファイルシステムを扱うことが可能なPD-SBP2のコマンド(図10の拡張コマンド)に変換される図13のIOCTLを発行する関数IoCallDriver()に変換する。
ここで、関数IoCallDriver()は、ユーザモードで動作するWin32サブシステム51が提供するAPI関数DeviceIoControl()と同様の機能の関数で、カーネルモードで使用される。
その後、PD_FS54は、ステップS103において、ステップS102で得た関数IoCallDriver()を呼び出し、次のIRPが送信されてくるのを待って、ステップS101に戻り、以下、同様の処理を繰り返す。
以上のように、ステップS103において、PD_FS54が、関数IoCallDriver()を呼び出すと、NT入出力マネージャ52は、その関数IoCallDriver()によって発行されるIOCTLが指定されたIRP(IRP_MJ_DEVICE_CONTROLのIRP)を、PDストレージ55に出力する。PDストレージ55は、そのIRPで指定されているIOCTL(図13)に対応する特別のSCSIコードとしての拡張コマンド(図10)を、SBP2ドライバ56に出力する。
SBP2ドライバ56では、PDストレージ55からの、IOCTLに対応する拡張コマンドが、その拡張コマンドをcbd[0]フィールドに配置した図8のSCSI command block ORB(SBP2データ)に変換され、1394バスドライバ57を介して、ドライブ2に送信される。
以上のように、PD_FS54では、アプリケーション31がファイル操作に関するAPI関数を呼び出すことにより供給されるIRPが、ドライブ2とのIEEE1394通信においてファイルシステムを扱うことが可能なPD-SBP2のコマンド(図10の拡張コマンド)に変換される図13のIOCTLを発行する関数IoCallDriver()に変換されるので、ドライブ2の実ファイルシステム61および仮想ファイルシステム62をそのまま利用して、ドライブ2を、容易に扱うことができる。
即ち、例えば、OS30や、アプリケーション31において、一筆書き記録の制御を行わなくても、ドライブ2において、一筆書き記録の制御が行われるので、AVデータのリアルタイムでの記録や再生が可能となる。
さらに、アプリケーション31からは、ドライブ2の仮想ファイルシステム62がPC1にマウントされているように見えるので、その仮想ファイルシステム62により管理されるファイルを、例えば、NTFSやFATなどの汎用のファイルシステムにより管理されるファイルと同様に扱うことができる。
ところで、PDドライブであるドライブ2は、高ビットレートのAVデータのリアルタイムでの読み書きを、その主目的としており、かかる目的の用途では、読み書きの対象とされるのは、一般に、1つのストリームだけである。
即ち、PDドライブにおいては、複数のストリームを同時に読み書きすることも可能であるが、一筆書き記録の性質上、複数のストリームを同時に(時分割で)読み書きする場合には、読み書き対象のストリームの変更時に、シークが生じ、そのシークによって、リアルタイム性が妨げられる。従って、リアルタイム性を確保するには、シークに要する時間だけ、AVデータ(ストリーム)のビットレートを抑える必要がある。
また、読み書き対象を1つのストリームだけとした場合に、ある高ビットレートでのAVデータのリアルタイムでの読み書きが可能であるとすると、読み書き対象を、複数であるM個のストリームとした場合、単純には、読み書き対象のストリームが1つだけの場合の1/M以下のビットレートのストリームでないと、リアルタイムで読み書きすることができず、従って、読み書きすることができるストリームが、低画質または低音質のAVデータとなる。
以上から、高ビットレートのAVデータのリアルタイムでの読み書きをするには、光ディスク2に対して読み書きするAVデータのストリームは、1つに制限するのが望ましい。そして、この制限は、例えば、ドライブ2において1つのファイルハンドルしか扱わないこととすることで実現することができる。
一方、コンピュータの汎用のOSでは、一般に、ファイルのオープンは、複数行うことができる。
従って、PC1にドライブ2を接続した場合には、アプリケーション31からは、ドライブ2に装着された光ディスク3上のファイルのオープンを、複数行い、そのオープンされたファイルに対する操作を行うことができるのが望ましい。
そこで、PD_FS54には、ドライブ2が1つのファイルハンドルだけを扱う場合であっても、アプリケーション31が、見かけ上、ファイルのオープンを複数同時に行うことができるようにする機能(以下、適宜、複数同時オープン機能という)を持たせることができる。
図15は、複数同時オープン機能を説明するための図である。
即ち、図15は、アプリケーション31が、ファイルのオープンを複数回行った場合の、カーネル58の状態を、模式的に示している。
アプリケーション31がファイルをオープンすると、カーネル58の内部には、そのファイルのオープンに対応して、ファイルオブジェクト(File Object)が作成される。
図15では、3つのファイルオブジェクト81,82,83が、カーネル58の内部に作成されている。
ここで、ファイルオブジェクト81は、アプリケーション31が、API関数CreateFile()を呼び出し、例えば、図7の左側に示した仮想ファイルシステム62が管理するファイルC0001.MXFをオープンすることにより作成されたファイルオブジェクトである。
ファイルオブジェクト82も、ファイルオブジェクト81と同様に、アプリケーション31が、API関数CreateFile()を呼び出し、ファイルC0001.MXFをオープンすることにより作成されたファイルオブジェクトである。
ファイルオブジェクト83は、アプリケーション31が、API関数CreateFile()を呼び出し、例えば、図7の左側に示した仮想ファイルシステム62が管理するファイルC0002.MXFをオープンすることにより作成されたファイルオブジェクトである。
従って、図15では、アプリケーション31が、ファイルC0001.MXFをオープンするAPI関数CreateFileを2回呼び出すとともに、ファイルC0002.MXFをオープンするAPI関数CreateFileを1回呼び出すことにより、3つのファイルオブジェクト81乃至83が、カーネル58の内部に作成されている。
なお、ファイルオブジェクト81乃至83それぞれは、対応するファイルのファイル名(File Name)、ファイルハンドル(File System File Handle)、およびファイルポインタ(File Pointer)を有する。
複数同時オープン機能は、PD_FS54が内蔵するファイルハンドルリソースマネージャ(PD-SBP2 File Handle Resource Manager)54Aが提供する。
即ち、ドライブ2からPD-SBP2で返されるファイルハンドルは、いわばリソース(Resource)的な特徴、つまり、複数が同時に有効になりえない(複数を同時に使用し得ない)性質を有するものである。
そこで、ファイルハンドルリソースマネージャ54Aは、ドライブ2からPD-SBP2で返されるファイルハンドルに対する、カーネル81の内部に作成された複数のファイルオブジェクトからのアクセスの排他制御を行う。なお、排他制御は、セマフォ(semaphore)その他の任意の方法で行うことができる。
即ち、ファイルハンドルリソースマネージャ54Aは、ドライブ2からPD-SBP2で返されるファイルハンドル(以下、適宜、PD-SBP2ファイルハンドルという)と、そのPD-SBP2ファイルハンドルを使用するファイルオブジェクトへのポインタとを記憶する。
そして、ファイルハンドルリソースマネージャ54Aは、現在記憶しているPD-SBP2ファイルハンドルによって特定されるファイルと異なるファイルのオープンを要求するAPI関数FileCreate()、データの読み出しを要求するAPI関数ReadFile()、またはデータの書き込みを要求するAPI関数WriteFile()が、アプリケーション31によって呼び出されると、現在記憶しているPD-SBP2ファイルハンドルによって特定されるファイルをクローズする。
さらに、ファイルハンドルリソースマネージャ54Aは、アプリケーション31によるAPI関数の呼び出しによって、オープン、データの読み出し、またはデータの書き込みが要求されたファイルのオープンを、ドライブ2に要求し、その要求に応じてドライブ2が返すPD-SBP2ファイルハンドルを、いままで記憶していたPD-SBP2ファイルハンドルに代えて新たに記憶する。また、ファイルハンドルリソースマネージャ54Aは、新たに記憶したPD-SBP2ファイルハンドルを使用するファイルオブジェクトへのポインタを、いままで記憶していたポインタに代えて新たに記憶する。
以上のような、PD_FS54(のファイルハンドルリソースマネージャ54A)による複数同時オープン機能により、アプリケーション31は、ファイルのオープンを、(見かけ上)複数同時に行うことができる。
次に、図16のフローチャートを参照して、複数同時オープン機能について、さらに説明する。なお、ここでも、説明を簡単にするため、NTキャッシュマネージャ59(図4)が提供するキャッシュ機能の利用は、考えないものとする。
例えば、アプリケーション31が、ステップS111において、ファイルA(File "A")のオープンを要求するAPI関数CreateFile()を呼び出すと、Win32サブシステム51(図4)が、その呼び出しに応じた要求を、NT入出力マネージャ52に出力し、NT入出力マネージャ52が、Win32サブシステム51からの要求に応じて、ファイルAのオープンを要求するAPI関数CreateFile()に対応するIRP_MJ_CREATE(のIRP)を、PD_FS54に出力する。
PD_FS54(のファイルハンドルリソースマネージャ54A)は、ステップS131において、アプリケーション31がステップS111でAPI関数を呼び出すことにより供給される、ファイルAのオープンを要求するIRP_MJ_CREATEを受信して、ステップS132に進み、そのIRP_MJ_CREATEに応じて、ファイルAのオープンを要求するIOCTLであるIOCTL_PD_FILE_OPEN(図13)を発行する関数IoCallDriver()を呼び出す。
NT入出力マネージャ52は、PD_FS54による、ステップS132での関数IoCallDriver()の呼び出しに応じて、IOCTL_PD_FILE_OPENが指定されているIRP_MJ_DEVICE_CONTROL(のIRP)を、PDストレージ55に供給する。
PDストレージ55は、ステップS171において、PD_FS54がステップS132で関数IoCallDriver()を呼び出すことにより供給される、IOCTL_PD_FILE_OPENが指定されているIRP_MJ_DEVICE_CONTROLを受信し、そのIRP_MJ_DEVICE_CONTROLに対応する拡張コマンドFILE OPEN(図10)を、SBP2ドライバ56および1394バスドライバ57を介して、ドライブ2に出力する。
これにより、ドライブ2では、光ディスク3上のファイルA(仮想ファイルシステム62が外部に見せるファイルA)がオープンされる。
その後、例えば、アプリケーション31が、ステップS112において、ファイルAからのデータの読み出しを要求するAPI関数ReadFile()を呼び出すと、Win32サブシステム51が、その呼び出しに応じた要求を、NT入出力マネージャ52に出力し、NT入出力マネージャ52が、Win32サブシステム51からの要求に応じて、ファイルAからのデータの読み出しを要求するAPI関数ReadFile()に対応するIRP_MJ_READ(のIRP)を、PD_FS54に出力する。
PD_FS54は、ステップS133において、アプリケーション31がステップS112でAPI関数を呼び出すことにより供給される、ファイルAからのデータの読み出しを要求するIRP_MJ_READを受信して、ステップS134に進み、そのIRP_MJ_READに応じて、ファイルAからのデータの読み出しを要求するIOCTLであるIOCTL_PD_FILE_READ(図13)を発行する関数IoCallDriver()を呼び出す。
NT入出力マネージャ52は、PD_FS54による、ステップS134での関数IoCallDriver()の呼び出しに応じて、IOCTL_PD_FILE_READが指定されているIRP_MJ_DEVICE_CONTROL(のIRP)を、PDストレージ55に供給する。
PDストレージ55は、ステップS172において、PD_FS54がステップS134で関数IoCallDriver()を呼び出すことにより供給される、IOCTL_PD_FILE_READが指定されているIRP_MJ_DEVICE_CONTROLを受信し、そのIRP_MJ_DEVICE_CONTROLに対応する拡張コマンドFILE READ(図10)を、SBP2ドライバ56および1394バスドライバ57を介して、ドライブ2に出力する。
これにより、ドライブ2では、光ディスク3上のファイルAからデータが読み出される。ドライブ2において読み出されたデータは、1394バスドライバ57、SBP2ドライバ56、PDストレージ55、PD_FS54、およびFSフィルタドライバ53を介して、アプリケーション31に供給される。
ここで、PDストレージ55には、データの読み書きのための図示せぬリードライトバッファ(Read/Write Buffer)が用意されている。リードライトバッファのサイズは、例えば、ページング時のページサイズ(Page Size)(例えば、4KB(kilo byte))に等しくなっており、一度に読み書きすることができるデータの最大サイズは、このリードライトバッファのサイズに制限される。
このため、PD_FS54は、アプリケーション31からのIRP_MJ_READ(アプリケーション31がAPI関数ReadFile()を呼び出すことによって供給されるIRP_MJ_READ)によって読み出しが要求されるデータのサイズが、リードライトバッファのサイズを越えている場合には、アプリケーション31からのIRP_MJ_READを、リードライトバッファのサイズ以内のデータの読み出しを要求する複数のIRP_MJ_DEVICE_CONTROLに分割し、PDストレージ55に出力する。即ち、PD_FS54は、アプリケーション31からのIRP_MJ_READに応じて、リードライトバッファのサイズ以内のデータの読み出しを要求するIOCTL_PD_FILE_READを発行する関数IoCallDriver()を、複数回呼び出し、これにより、PDストレージ55には、複数の、IOCTL_PD_FILE_READが指定されているIRP_MJ_DEVICE_CONTROLが供給される。
なお、このことは、アプリケーション31からの、ファイルへのデータの書き込みを要求するIRP_MJ_WRITEについても、同様である。
図16では、PD_FS54が、ステップS133で受信したIRP_MJ_READに応じ、ステップS134乃至S136それぞれにおいて、ファイルAからのデータの読み出しを要求するIOCTL_PD_FILE_READが指定されているIRP_MJ_DEVICE_CONTROLが、PDストレージ55に出力されている。即ち、IOCTL_PD_FILE_READが、3回に分けて、PD_FS54からPDストレージ55に出力されている。
PDストレージ55は、ステップS172乃至S174それぞれにおいて、PD_FS54がステップS134乃至S136で出力する、IOCTL_PD_FILE_READが指定されているIRP_MJ_DEVICE_CONTROLを受信し、そのIRP_MJ_DEVICE_CONTROLに対応する拡張コマンドFILE READを、SBP2ドライバ56および1394バスドライバ57を介して、ドライブ2に出力することで、3回に分けて、ファイルAからデータを読み出す。
その後、ステップS113において、アプリケーション31が、ドライブ2において現在オープンされているファイルAと異なるファイルB(FILE "B")のオープンを要求するAPI関数CreateFile()を呼び出すと、ステップS111における場合と同様にして、ファイルBのオープンを要求するAPI関数CreateFile()に対応するIRP_MJ_CREATEが、PD_FS54に供給される。
PD_FS54は、ステップS137において、アプリケーション31からのIRP_MJ_CREATE(アプリケーション31がAPI関数CreateFile()を呼び出すことにより供給される、ファイルBのオープンを要求するIRP_MJ_CREATE)を受信して、ステップS138に進み、そのIRP_MJ_CREATEに応じて、ファイルAのクローズを要求するIOCTLであるIOCTL_PD_FILE_CLOSE(図13)を発行する関数IoCallDriver()を呼び出す。
即ち、上述したように、ドライブ2が扱うことができるファイルハンドルは、1つだけなので、PD_FS54は、ファイルBのオープンを要求する前に、現在オープンされているファイルAのクローズを要求する。
PD_FS54による、ステップS138での関数IoCallDriver()の呼び出しに応じて、NT入出力マネージャ52は、ファイルAのクローズを要求するIOCTL_PD_FILE_CLOSEが指定されているIRP_MJ_DEVICE_CONTROLを、PDストレージ55に供給する。
PDストレージ55は、ステップS175において、PD_FS54がステップS138で関数IoCallDriver()を呼び出すことにより供給される、IOCTL_PD_FILE_CLOSEが指定されているIRP_MJ_DEVICE_CONTROLを受信し、そのIRP_MJ_DEVICE_CONTROLに対応する拡張コマンドFILE CLOSE(図10)を、SBP2ドライバ56および1394バスドライバ57を介して、ドライブ2に出力する。
これにより、ドライブ2では、光ディスク3上のファイルAがクローズされる。
PD_FS54は、ステップS138の処理後、ステップS139に進み、ステップS137で受信した、ファイルBのオープンを要求するIRP_MJ_CREATEに応じて、ファイルBのオープンを要求するIOCTLであるIOCTL_PD_FILE_OPEN(図13)を発行する関数IoCallDriver()を呼び出すことにより、そのIOCTL_PD_FILE_OPENが指定されているIRP_MJ_DEVICE_CONTROLを、PDストレージ55に供給する。
PDストレージ55は、ステップS176において、PD_FS54からのIRP_MJ_DEVICE_CONTROL、即ち、PD_FS54が関数IoCallDriver()を呼び出すことにより供給される、IOCTL_PD_FILE_OPENが指定されているIRP_MJ_DEVICE_CONTROLを受信し、そのIRP_MJ_DEVICE_CONTROLに対応する拡張コマンドFILE OPEN(図10)を、SBP2ドライバ56および1394バスドライバ57を介して、ドライブ2に出力する。
これにより、ドライブ2では、光ディスク3上のファイルB(仮想ファイルシステム62が外部に見せるファイルB)がオープンされる。
その後、例えば、アプリケーション31が、ステップS114において、ファイルBへのデータの書き込みを要求するAPI関数WriteFile()を呼び出すと、Win32サブシステム51が、その呼び出しに応じた要求を、NT入出力マネージャ52に出力し、NT入出力マネージャ52が、Win32サブシステム51からの要求に応じて、ファイルBへのデータの書き込みを要求するAPI関数WriteFile()に対応するIRP_MJ_WRITEを、PD_FS54に出力する。
PD_FS54は、ステップS140において、アプリケーション31がステップS114でAPI関数を呼び出すことにより供給される、ファイルBへのデータの書き込みを要求するIRP_MJ_WRITEを受信して、ステップS141に進み、そのIRP_MJ_WRITEに応じて、ファイルBへのデータの書き込みを要求するIOCTLであるIOCTL_PD_FILE_WRITE(図13)を発行する関数IoCallDriver()を呼び出す。
NT入出力マネージャ52は、PD_FS54による、ステップS141での関数IoCallDriver()の呼び出しに応じて、IOCTL_PD_FILE_WRITEが指定されているIRP_MJ_DEVICE_CONTROLを、PDストレージ55に供給する。
PDストレージ55は、ステップS177において、PD_FS54がステップS141で関数IoCallDriver()を呼び出すことにより供給される、IOCTL_PD_FILE_WRITEが指定されているIRP_MJ_DEVICE_CONTROLを受信し、そのIRP_MJ_DEVICE_CONTROLに対応する拡張コマンドFILE WRITE(図10)を、SBP2ドライバ56および1394バスドライバ57を介して、ドライブ2に出力する。
これにより、ドライブ2では、光ディスク3上のファイルBにデータが書き込まれる。
ここで、上述したように、一度に読み書きすることができるデータの最大サイズは、PDストレージ55におけるリードライトバッファのサイズに制限される。
このため、PD_FS54は、アプリケーション31からのIRP_MJ_WRITE(アプリケーション31がAPI関数WriteFile()を呼び出すことによって供給されるIRP_MJ_WRITE)によって書き込みが要求されるデータのサイズが、リードライトバッファのサイズを越えている場合には、アプリケーション31からのIRP_MJ_WRITEを、リードライトバッファのサイズ以内のデータの書き込みを要求する複数のIRP_MJ_DEVICE_CONTROLに分割し、PDストレージ55に出力する。即ち、PD_FS54は、アプリケーション31からのIRP_MJ_WRITEに応じて、リードライトバッファのサイズ以内のデータの書き込みを要求するIOCTL_PD_FILE_WRITEを発行する関数IoCallDriver()を、複数回呼び出し、これにより、PDストレージ55には、複数の、IOCTL_PD_FILE_WRITEが指定されているIRP_MJ_DEVICE_CONTROLが供給される。
図16では、PD_FS54が、ステップS140で受信したIRP_MJ_WRITEに応じ、ステップS141乃至S143それぞれにおいて、ファイルBへのデータの書き込みを要求するIOCTL_PD_FILE_WRITEが指定されているIRP_MJ_DEVICE_CONTROLが、PDストレージ55に出力されている。即ち、IOCTL_PD_FILE_WRITEが、3回に分けて、PD_FS54からPDストレージ55に出力されている。
PDストレージ55は、ステップS177乃至S179それぞれにおいて、PD_FS54がステップS141乃至S143で出力する、IOCTL_PD_FILE_WRITEが指定されているIRP_MJ_DEVICE_CONTROLを受信し、そのIRP_MJ_DEVICE_CONTROLに対応する拡張コマンドFILE WRITEを、SBP2ドライバ56および1394バスドライバ57を介して、ドライブ2に出力することで、3回に分けて、ファイルBにデータを書き込む
その後、ステップS115において、アプリケーション31が、ドライブ2において現在オープンされているファイルBと異なるファイルAからのデータの読み出しを要求するAPI関数ReadFile()を呼び出すと、ステップS112における場合と同様にして、ファイルAからのデータの読み出しを要求するAPI関数ReadFile()に対応するIRP_MJ_READが、PD_FS54に供給される。
PD_FS54は、ステップS144において、アプリケーション31からのIRP_MJ_READ(アプリケーション31がAPI関数ReadFile()を呼び出すことにより供給される、ファイルAからのデータの読み出しを要求するIRP_MJ_READ)を受信して、ステップS145に進み、そのIRP_MJ_READに応じて、ファイルBのクローズを要求するIOCTLであるIOCTL_PD_FILE_CLOSE(図13)を発行する関数IoCallDriver()を呼び出す。
即ち、上述したように、ドライブ2が扱うことができるファイルハンドルは、1つだけなので、PD_FS54は、ファイルAからのデータの読み出しを要求する前に、現在オープンされているファイルBのクローズを要求する。
PD_FS54による、ステップS145での関数IoCallDriver()の呼び出しに応じて、NT入出力マネージャ52は、ファイルBのクローズを要求するIOCTL_PD_FILE_CLOSEが指定されているIRP_MJ_DEVICE_CONTROLを、PDストレージ55に供給する。
PDストレージ55は、ステップS180において、PD_FS54がステップS145で関数IoCallDriver()を呼び出すことにより供給される、IOCTL_PD_FILE_CLOSEが指定されているIRP_MJ_DEVICE_CONTROLを受信し、そのIRP_MJ_DEVICE_CONTROLに対応する拡張コマンドFILE CLOSE(図10)を、SBP2ドライバ56および1394バスドライバ57を介して、ドライブ2に出力する。
これにより、ドライブ2では、光ディスク3上のファイルBがクローズされる。
PD_FS54は、ステップS145の処理後、ステップS146に進み、ステップS144で受信した、ファイルAからのデータの読み出しを要求するIRP_MJ_READに応じて、さらに、ファイルAのオープンを要求するIOCTLであるIOCTL_PD_FILE_OPEN(図13)を発行する関数IoCallDriver()を呼び出す。
即ち、上述したステップS175において、PDストレージ55が、ファイルAのクローズを要求する拡張コマンドFILE CLOSE(図10)を、ドライブ2に出力することにより、ファイルAは、現在クローズされているので、ファイルAからのデータの読み出しを行うために、PD_FS54は、ファイルAのオープンを要求するIOCTLであるIOCTL_PD_FILE_OPENを発行する関数IoCallDriver()を呼び出す。
PD_FS54による、ステップS146での関数IoCallDriver()の呼び出しに応じて、NT入出力マネージャ52は、ファイルAのオープンを要求するIOCTL_PD_FILE_OPENが指定されているIRP_MJ_DEVICE_CONTROLを、PDストレージ55に供給する。
PDストレージ55は、ステップS181において、PD_FS54がステップS146で関数IoCallDriver()を呼び出すことにより供給される、IOCTL_PD_FILE_OPENが指定されているIRP_MJ_DEVICE_CONTROLを受信し、そのIRP_MJ_DEVICE_CONTROLに対応する拡張コマンドFILE OPEN(図10)を、SBP2ドライバ56および1394バスドライバ57を介して、ドライブ2に出力する。
これにより、ドライブ2では、光ディスク3上のファイルAがオープンされる。
PD_FS54は、ステップS146の処理後、ステップS147に進み、ステップS144で受信した、ファイルAからのデータの読み出しを要求するIRP_MJ_READに応じて、ファイルAからのデータの読み出しを要求するIOCTLであるIOCTL_PD_FILE_READ(図13)を発行する関数IoCallDriver()を呼び出すことにより、そのIOCTL_PD_FILE_READが指定されているIRP_MJ_DEVICE_CONTROLを、PDストレージ55に供給する。
PDストレージ55は、ステップS182において、PD_FS54から供給される、IOCTL_PD_FILE_READが指定されているIRP_MJ_DEVICE_CONTROLを受信し、そのIRP_MJ_DEVICE_CONTROLに対応する拡張コマンドFILE READ(図10)を、SBP2ドライバ56および1394バスドライバ57を介して、ドライブ2に出力する。
これにより、ドライブ2では、光ディスク3上のファイルAからデータが読み出される。ドライブ2において読み出されたデータは、1394バスドライバ57、SBP2ドライバ56、PDストレージ55、PD_FS54、およびFSフィルタドライバ53を介して、アプリケーション31に供給される。
なお、上述したPDストレージ55におけるリードライトバッファのサイズによる読み書きの制限によって、図16では、PD_FS54が、ステップS144で受信したIRP_MJ_READに応じ、ステップS147乃至S149それぞれにおいて、ファイルAからのデータの読み出しを要求するIOCTL_PD_FILE_READが指定されているIRP_MJ_DEVICE_CONTROLが、PDストレージ55に出力されている。即ち、IOCTL_PD_FILE_READが、3回に分けて、PD_FS54からPDストレージ55に出力されている。
PDストレージ55は、ステップS182乃至S184それぞれにおいて、PD_FS54がステップS147乃至S149で出力する、IOCTL_PD_FILE_READが指定されているIRP_MJ_DEVICE_CONTROLを受信し、そのIRP_MJ_DEVICE_CONTROLに対応する拡張コマンドFILE READを、SBP2ドライバ56および1394バスドライバ57を介して、ドライブ2に出力することで、3回に分けて、ファイルAからデータを読み出す。
その後、ステップS116において、アプリケーション31が、ドライブ2において現在オープンされているファイルAと異なるファイルBへのデータの書き込みを要求するAPI関数WriteFile()を呼び出すと、ステップS114における場合と同様にして、ファイルBへのデータの書き込みを要求するAPI関数WriteFile()に対応するIRP_MJ_WRITEが、PD_FS54に供給される。
PD_FS54は、ステップS150において、アプリケーション31からのIRP_MJ_WRITE(アプリケーション31がAPI関数WriteFile()を呼び出すことにより供給される、ファイルBへのデータの書き込みを要求するIRP_MJ_WRITE)を受信して、ステップS151に進み、そのIRP_MJ_WRITEに応じて、ファイルAのクローズを要求するIOCTLであるIOCTL_PD_FILE_CLOSE(図13)を発行する関数IoCallDriver()を呼び出す。
即ち、上述したように、ドライブ2が扱うことができるファイルハンドルは、1つだけなので、PD_FS54は、ファイルBへのデータの書き込みを要求する前に、現在オープンされているファイルAのクローズを要求する。
PD_FS54による、ステップS151での関数IoCallDriver()の呼び出しに応じて、NT入出力マネージャ52は、ファイルAのクローズを要求するIOCTL_PD_FILE_CLOSEが指定されているIRP_MJ_DEVICE_CONTROLを、PDストレージ55に供給する。
PDストレージ55は、ステップS185において、PD_FS54がステップS151で関数IoCallDriver()を呼び出すことにより供給される、IOCTL_PD_FILE_CLOSEが指定されているIRP_MJ_DEVICE_CONTROLを受信し、そのIRP_MJ_DEVICE_CONTROLに対応する拡張コマンドFILE CLOSE(図10)を、SBP2ドライバ56および1394バスドライバ57を介して、ドライブ2に出力する。
これにより、ドライブ2では、光ディスク3上のファイルAがクローズされる。
PD_FS54は、ステップS151の処理後、ステップS152に進み、ステップS150で受信した、ファイルBへのデータの書き込みを要求するIRP_MJ_WRITEに応じて、さらに、ファイルBのオープンを要求するIOCTLであるIOCTL_PD_FILE_OPEN(図13)を発行する関数IoCallDriver()を呼び出す。
即ち、上述したステップS180において、PDストレージ55が、ファイルBのクローズを要求する拡張コマンドFILE CLOSE(図10)を、ドライブ2に出力することにより、ファイルBは、現在クローズされているので、ファイルBへのデータの書き込みを行うために、PD_FS54は、ファイルBのオープンを要求するIOCTLであるIOCTL_PD_FILE_OPENを発行する関数IoCallDriver()を呼び出す。
PD_FS54による、ステップS152での関数IoCallDriver()の呼び出しに応じて、NT入出力マネージャ52は、ファイルBのオープンを要求するIOCTL_PD_FILE_OPENが指定されているIRP_MJ_DEVICE_CONTROLを、PDストレージ55に供給する。
PDストレージ55は、ステップS186において、PD_FS54がステップS152で関数IoCallDriver()を呼び出すことにより供給される、IOCTL_PD_FILE_OPENが指定されているIRP_MJ_DEVICE_CONTROLを受信し、そのIRP_MJ_DEVICE_CONTROLに対応する拡張コマンドFILE OPEN(図10)を、SBP2ドライバ56および1394バスドライバ57を介して、ドライブ2に出力する。
これにより、ドライブ2では、光ディスク3上のファイルBがオープンされる。
PD_FS54は、ステップS152の処理後、ステップS153に進み、ステップS150で受信した、ファイルBへのデータの書き込みを要求するIRP_MJ_WRITEに応じて、ファイルBへのデータの書き込みを要求するIOCTLであるIOCTL_PD_FILE_WRITE(図13)を発行する関数IoCallDriver()を呼び出すことにより、そのIOCTL_PD_FILE_WRITEが指定されているIRP_MJ_DEVICE_CONTROLを、PDストレージ55に供給する。
PDストレージ55は、ステップS187において、PD_FS54から供給される、IOCTL_PD_FILE_WRITEが指定されているIRP_MJ_DEVICE_CONTROLを受信し、そのIRP_MJ_DEVICE_CONTROLに対応する拡張コマンドFILE WRITE(図10)を、SBP2ドライバ56および1394バスドライバ57を介して、ドライブ2に出力する。
これにより、ドライブ2では、光ディスク3上のファイルBにデータが書き込まれる。
なお、上述したPDストレージ55におけるリードライトバッファのサイズによる読み書きの制限によって、図16では、PD_FS54が、ステップS150で受信したIRP_MJ_WRITEに応じ、ステップS153乃至S155それぞれにおいて、ファイルBへのデータの書き込みを要求するIOCTL_PD_FILE_WRITEが指定されているIRP_MJ_DEVICE_CONTROLが、PDストレージ55に出力されている。即ち、IOCTL_PD_FILE_WRITEが、3回に分けて、PD_FS54からPDストレージ55に出力されている。
PDストレージ55は、ステップS187乃至S189それぞれにおいて、PD_FS54がステップS153乃至S155で出力する、IOCTL_PD_FILE_WRITEが指定されているIRP_MJ_DEVICE_CONTROLを受信し、そのIRP_MJ_DEVICE_CONTROLに対応する拡張コマンドFILE WRITEを、SBP2ドライバ56および1394バスドライバ57を介して、ドライブ2に出力することで、3回に分けて、ファイルBにデータを書き込む。
その後、ステップS117において、アプリケーション31が、ファイルAのクローズを要求するAPI関数CloseFile()を呼び出すと、Win32サブシステム51(図4)が、その呼び出しに応じた要求を、NT入出力マネージャ52に出力し、NT入出力マネージャ52が、Win32サブシステム51からの要求に応じて、ファイルAに関するクリーンアップを要求するIRP_MJ_CLEANUPと、ファイルAのクローズを要求するAPI関数CloseFile()に対応するIRP_MJ_CLOSEとを、PD_FS54に出力する。
PD_FS54は、ステップS156とS157において、アプリケーション31がステップS117でAPI関数を呼び出すことにより供給される、ファイルAに関するクリーンアップを要求するIRP_MJ_CLEANUPと、ファイルAのクローズを要求するIRP_MJ_CLOSEとを、それぞれ受信する。
そして、PD_FS54は、ファイルAに関するクリーンアップを要求するIRP_MJ_CLEANUPに応じ、例えば、NTキャッシュマネージャ59(図4)が提供するキャッシュ機能によりキャッシュされたデータをフラッシュ(Flush)する等のクリーンアップ処理を行う。さらに、PD_FS54は、IRP_MJ_CLOSEによってクローズが要求されたファイルAがオープンされているかどうかを判定する(例えば、図15で説明したPD-SBP2ファイルハンドルを使用するファイルオブジェクトが、ファイルAのファイルオブジェクトとなっているかどうかを判定する)。
図16では、上述したステップS185において、PDストレージ55が、ファイルAのクローズを要求する拡張コマンドFILE CLOSE(図10)を、ドライブ2に出力することにより、ファイルAは、現在クローズされているので、PD_FS54では、IRP_MJ_CLOSEによってクローズが要求されたファイルAが、既にクローズされていると判定される。この場合、PD_FS54は、ファイルAのクローズを要求するIRP_MJ_CLOSEに対して、特に処理を行わない。
そして、ステップS118において、アプリケーション31が、ファイルBのクローズを要求するAPI関数CloseFile()を呼び出すと、Win32サブシステム51(図4)が、その呼び出しに応じた要求を、NT入出力マネージャ52に出力し、NT入出力マネージャ52が、Win32サブシステム51からの要求に応じて、ファイルBに関するクリーンアップを要求するIRP_MJ_CLEANUPと、ファイルBのクローズを要求するAPI関数CloseFile()に対応するIRP_MJ_CLOSEとを、PD_FS54に出力する。
PD_FS54は、ステップS158とS159において、アプリケーション31がステップS118でAPI関数を呼び出すことにより供給される、ファイルBに関するクリーンアップを要求するIRP_MJ_CLEANUPと、ファイルBのクローズを要求するIRP_MJ_CLOSEとを、それぞれ受信する。
そして、PD_FS54は、ファイルBに関するクリーンアップを要求するIRP_MJ_CLEANUPに応じ、例えば、上述したようなクリーンアップ処理を行う。さらに、PD_FS54は、IRP_MJ_CLOSEによってクローズが要求されたファイルBがオープンされているかどうかを判定する。
図16では、上述したステップS186において、PDストレージ55が、ファイルBのオープンを要求する拡張コマンドFILE OPEN(図10)を、ドライブ2に出力することにより、ファイルBは、現在オープンされているので、PD_FS54では、IRP_MJ_CLOSEによってクローズが要求されたファイルBが、現在オープンされていると判定される。
この場合、PD_FS54は、ステップS159で受信したファイルBのクローズを要求するIRP_MJ_CLOSEに応じて、ステップS160に進み、そのIRP_MJ_CLOSEに応じて、ファイルBのクローズを要求するIOCTLであるIOCTL_PD_FILE_CLOSE(図13)を発行する関数IoCallDriver()を呼び出す。
PD_FS54による、ステップS160での関数IoCallDriver()の呼び出しに応じて、NT入出力マネージャ52は、ファイルBのクローズを要求するIOCTL_PD_FILE_CLOSEが指定されているIRP_MJ_DEVICE_CONTROLを、PDストレージ55に供給する。
PDストレージ55は、ステップS190において、PD_FS54がステップS160で関数IoCallDriver()を呼び出すことにより供給される、IOCTL_PD_FILE_CLOSEが指定されているIRP_MJ_DEVICE_CONTROLを受信し、そのIRP_MJ_DEVICE_CONTROLに対応する拡張コマンドFILE CLOSE(図10)を、SBP2ドライバ56および1394バスドライバ57を介して、ドライブ2に出力する。
これにより、ドライブ2では、光ディスク3上のファイルBがクローズされる。
以上のように、複数同時オープン機能によれば、ドライブ2において現在オープンされているファイルと異なるファイルにアクセスするアクセス要求があった場合に、PD_FS54(のファイルハンドルリソースマネージャ54A)において、現在オープンされているファイルをクローズし、アクセス要求があったファイルをオープンすることで、ドライブ2が扱う1つのファイルハンドルに対するアクセスの排他制御を行うようにしたので、アプリケーション31では、ドライブ2が1つのファイルハンドルしか扱うことができないことを特に考慮せずに、複数のファイルに対する操作を行うことができる。
なお、本実施の形態では、データの記録や再生が行われる記録媒体として、光ディスクを採用することとしたが、本発明は、その他、例えば、ハードディスクその他の記録媒体などに対してデータの記録や再生を行う場合に適用可能である。
また、本明細書において、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 アプリケーション, 51 Win32サブシステム, 52 NT入出力マネージャ, 53 FSフィルタドライバ, 54 PD_FS, 54A ファイルハンドルリソースマネージャ, 55 PDストレージ, 56 SBP2ドライバ, 57 1394バスドライバ, 58 レジストリ, 59 NTキャッシュマネージャ, 61 実ファイルシステム, 62 仮想ファイルシステム