信息处理装置和方法、程序,以及程序记录介质的制作方法

文档序号:7619763阅读:88来源:国知局
专利名称:信息处理装置和方法、程序,以及程序记录介质的制作方法
技术领域
本发明涉及信息处理装置和方法、程序,以及程序记录介质。更具体地,本发明涉及一种信息处理装置和方法、一种程序和一种程序记录介质,在其中例如,能记录并能从记录介质实时播放音-视频数据(AV数据)。
背景技术
将高比特率的AV数据记录到光盘并从光盘播放具有很大的需求。
本发明的受让人以前在公开号为No.2004-005895的日本未审专利申请中提出了一种用于记录诸如视频数据以及与之关联的音频数据等多种数据格式的光盘驱动器,该光盘能以例如光盘的扇区为单位周期地记录(无需将其记录在相邻的扇区),更具体地,可以让视频数据和音频数据的边界与光盘扇区的边界一致。
在该光盘驱动器中,一定量的视频数据或音频数据可以共同地记录在光盘上连续的存储区域上,因此,这样的数据无需查找即可被读出或写入。
此外,由于视频数据或音频数据以光盘扇区为单元进行记录,因此视频数据或音频数据无需一起记录在一个扇区中从而使仅读取视频数据或音频数据成为可能。即,例如,当用户只需要视频数据或音频数据时,所需的视频数据或音频数据能从光盘中读出,与视频数据和音频数据同时记录在一个扇区中相比,这提高了仅读出视频数据(或音频数据)的效率(速度)。

发明内容
本发明的受让人还提出了如下类型的光盘驱动器。光盘上的连续空闲区域具有至少一个预定的尺寸,其上与已记录的记录区域相邻的空闲区域被保留,因此数据可以记录在该保留的空间上。
在这种情况下,理想地,能将一定的数据串记录在光盘上连续的记录区域中。因此,数据能在无需查找的情况下记录或播放以便高比特率的AV数据能实时地记录在光盘上或从光盘播放。
以上所描述的能在无需查找情况下记录并播放数据的光盘驱动器以下称之为“专业光盘(PD)驱动器”。使用PD驱动器记录数据的光盘以下称之为“专业光盘(PD)”。
由于使用了更快的中央处理单元(CPU)和更低价格的大容量存储设备,因此可以实现高性能而价格低廉的计算机。在这样的计算机中,应用程序(程序)执行例如编辑大量AV数据(以下称之为“AV应用程序”)的处理。
将PD驱动器安装在计算机中或外部地将PD驱动器与计算机连接以便使AV应用程序能够访问PD驱动器从而向/从PD读出/写入AV数据的需求正在迅速增长。
然而,在这种情况中,不能保证从/向PD实时地读取/写入AV数据。
更具体地,在当前的计算机中,总地来说,通过使用多任务操作能同时执行多个应用程序。但是,具体地说,在多个应用程序上执行分时处理。因此,例如,当在AV应用程序访问PD之前如果已经有另一个应用程序访问了PD,那么当AV应用程序访问PD时在PD驱动器中会产生预期外的查找。
此外,当AV应用程序试图访问PD时另一个应用程序已经在访问该PD,那么它就必须等待。
在以上所描述的情况下,很难实时地从PD读取AV数据或将其写入PD。
因此希望能够实时地在或从诸如光盘的记录介质上记录或读出数据。
根据本发明的一个实施例的信息处理装置可以处理来自应用程序的访问记录介质的访问请求。该信息处理装置包括用来设置专用于来自应用程序的访问请求的优先级或表示是否来自应用程序的访问请求已被允许的许可信息的设置装置;用来根据所提供的优先级或许可信息按序存储访问请求的队列控制装置;和用来根据优先级或许可信息按序处理所存储的访问请求的访问请求处理装置。
设置装置可以将来自规定应用程序的访问请求的优先级设置得高于自其它应用程序的访问优先级。
访问请求处理装置可以连续地处理来自规定应用程序的访问请求并只有当许可信息表示该访问请求已被允许时才处理来自另一个应用程序的访问请求。
信息处理装置可以进一步包括用来设置是否使用高速缓存功能的高速缓存功能设置装置。访问请求处理装置可以根据是否使用高速缓存功能而处理访问请求。
访问请求处理装置可以根据是否使用高速缓存功能而处理来自规定应用程序的访问请求。
信息处理装置还可以是一个用来过滤访问请求以及将该过滤后的访问请求发送到文件系统驱动器的过滤驱动器。
从记录介质读出或将写入到记录介质的数据可以包括至少音频-视频数据。
在记录介质的记录区域中,在具有至少预定尺寸的连续空闲区域当中,与已经暂存了数据的记录区域最近的空闲区域可以被保留和数据可以记录在该保留的空闲区域中。
根据本发明实施例用于处理来自应用程序对记录介质进行访问的访问请求的信息处理方法包括以下步骤设置专用于来自应用程序的访问请求的优先级或表示是否来自应用程序的访问请求已被允许的许可信息;根据所提供的优先级或许可信息按序存储访问请求;和根据优先级或许可信息按序处理所存储的访问请求。
根据本发明实施例允许计算机处理来自应用程序对记录介质进行访问的访问请求的程序包括以下步骤设置专用于来自应用程序的访问请求的优先级或表示是否来自应用程序的访问请求已被允许的许可信息;根据所提供的优先级或许可信息按序存储访问请求;和根据优先级或许可信息按序处理所存储的访问请求。
根据本发明的实施例的程序记录介质,在其上记录允许计算机处理来自应用程序对记录介质进行访问的访问请求的程序。该程序包括以下步骤设置专用于来自应用程序的访问请求的优先级或表示是否来自应用程序的访问请求已被允许的许可信息;根据所提供的优先级或许可信息按序存储访问请求;和根据优先级或许可信息按序处理所存储的访问请求。
根据本发明的实施例,响应来自应用程序的访问请求,设置专用于该访问请求的优先级或表示是否访问请求已被允许的许可信息。根据所提供的优先级或许可信息按序存储访问请求。接着根据优先级或许可信息按序处理所存储的访问请求。
根据本发明的实施例,来自某个应用程序的访问请求能够被优先处理,或只有来自一规定应用程序的访问请求才能被接受。因此,数据能实时地记录或播放。


图1是示出根据本发明的一个实施例的信息处理系统的结构实例的方框图;图2是示出个人计算机(PC)的硬件结构实例的方框图;图3图示了CPU执行的程序;图4是示出操作系统(OS)的内部结构(文件系统)的一个实例的方框图;图5是OS执行的整个处理流程的流程图;图6是示出执行第一功能或第二功能的PD过滤器的结构的方框图;图7示出了PD_API所提供的API函数;图8示出了由IRP_MJ_DEVICE_CONTROL指定的用户定义的IOCTL代码;图9是示出使用第一功能所执行的进程的流程图;图10和11是示出使用第一功能所执行的进程的流程图;图12示出了由PD_API所提供的API函数;图13示出了由IRP_MJ_DEVICE_CONTROL指定的用户定义的IOCTL代码;图14示出了使用第二功能所执行的进程的流程图;图15和16是示出使用第二功能所执行的进程的流程图;图17示出执行第三功能的PD过滤器的结构实例的方框图;图18是示出使用第三功能所执行的进程的流程图;图19是示出执行高速缓存器ON/OFF功能的PD过滤器的结构实例的方框图;图20示出了由PD_API所提供的API函数;图21示出了由IRP_MJ_DEVICE_CONTROL指定的用户所定义的IOCTL代码;图22是示出使用高速缓存器ON/OFF功能执行进程的流程图;图23是示出使用高速缓存器ON/OFF功能执行进程的流程图;图24的框图示出了通过组合第一和第二功能之一与高速缓存器ON/OFF功能使用的PD过滤器的结构例;图25的框图示出了通过组合第三功能和高速缓存器ON/OFF功能使用的PD过滤器的结构例。
具体实施例方式
以下通过结合附图的优选实施例来对本发明进行描述。
图1所示根据本发明的实施例的信息处理系统包括个人计算机(PC)1和驱动器2。
PC 1中存储有操作系统(OS)和应用(程序),并在OS的控制下通过执行应用程序执行各种类型的进程。
驱动器2,即以上所描述的PD驱动器,通过1394电缆4连接到PC 1。光盘3,即PD,能安装到驱动器2或从驱动器2拆除以便驱动器2能利用电气和电子工程师协会(IEEE)1394标准与PC 1通信而从光盘3读出或写入例如AV数据的数据。
驱动器2并不一定是PD驱动器且光盘3也不一定是PD。此外,PC1和驱动器2能根据除IEEE 1394标准以外的其它标准彼此相互通信。
图2示出了PC1硬件结构的一个范例。
PC1具有内置CPU 12。输入/输出接口20通过总线11连接到CPU 12。响应用户通过输入/输出接口20操作包括键盘、鼠标、麦克风等输入单元17所输入的指令,CPU 12执行存储在只读存储器(ROM)13中的程序。CPU 12还执行存储在硬盘15中的程序、从卫星或网络发送并通过通信单元18接收并插入到硬盘15上的程序和从驱动器19上的记录介质21上读取并插入到硬盘15上的程序以及加载到随机存取存储器(RAM)14的程序。CPU 12接着执行根据方框图的流程或结构所示的进程,这将在以下论述。接着,CPU 12通过输入/输出接口20从包括液晶显示屏(LCD)或扬声器的输出单元16输出处理结果。可选地,CPU 12通过输入/输出接口20从通信单元18发送处理结果或将其记录到硬盘15上。
在PC 1中,遵从IEEE 1394标准执行通信的IEEE 1394接口(I/F)22连接到输入/输出接口20。驱动器2通过1394电缆4连接到IEEE 1394接口22。CPU 12通过总线11、输入/输出接口20、IEEE 1394接口22以及1394电缆4访问驱动器2以从安置在驱动器2中的光盘3读取数据或将数据写入光盘。
CPU 12执行OS以及各种可以预先存储在例如内建于PC 1上的硬盘15或ROM13等中的记录介质上的应用程序。
可选地,程序可以暂时或永久存储(记录)在例如软盘、高密度只读存储器(CD-ROM)、磁光(MO)盘、数字化视频光盘(DVD)或磁盘等可拆卸的记录介质21上。可拆卸记录介质21也可称之为“打包的软件”。
如上所述,程序可以从上述可拆卸记录介质21安装到PC 1上。可选地,程序可以从下载站点通过数字广播卫星有线或无线地传送到PC 1,例如通过一个局域网(LAN)或因特网的网络。在这种情况下,PC 1通过通信单元18接收程序并将其安装到内置的硬盘15上。
图3图示了由图2所示的CPU 12所执行的程序。
例如,至少有OS 30和应用程序31通过33安装在图2所示的硬盘15上。当PC 1加电时,CPU 12从硬盘15将OS 30加载到RAM 14上并执行它。响应操作输入单元17开始应用程序31、32,或33的请求,CPU 12将相应的应用程序31、32,或33从硬盘15加载到RAM 14上,并在OS 30的控制下执行它。
随后,响应来自应用程序31、32或33访问安置在驱动器2中的光盘3的请求,OS 30处理该访问请求。在驱动器2中,数据基于来自应用程序31、32或33的访问请求而记录在光盘3上。可选地,在驱动器2中,数据能基于来自应用程序31、32或33的访问请求从光盘3播放,并且数据能通过OS30而传送给产生访问请求的应用程序31、32或33。
安装在如图2所示的硬盘15上的应用程序的数量并不限于3个,可以更多或更少。
现在假定,在安装在硬盘15中的三个应用程序31、32和33当中,应用程序33从外部源读取AV数据,并编辑、记录和播放AV数据。因此,应用程序33也可以被称之为“AV应用程序33”。
AV应用程序33调用PD_API(PD_API.DLL)41,其是一个动态链接库(DLL),并通过PD_API 41产生一个访问光盘3的请求。PD_API 41是一个用来提供唯一应用程序接口(API)的DLL,这在以下涉及对光盘3的访问的内容中再讨论。
至于OS 30,可以使用Unix,Linux,或微软公司的Windows,也可以使用其它的OS。在该实施例中,可以使用例如WindowsNT,Windows2000,或WindowsXP的WindowsNT OS来作为OS 30。
图4图示了OS 30的结构的一个实例,即WindowsNT OS,更具体地,是OS 30中涉及访问驱动器2中的光盘3的部分。
在图4中,示出了涉及应用程序31到33的OS 30的设备驱动器的层结构。
可以是一个WindowsNT OS的OS 30通过基于微核技术和面向对象技术的子系统而执行单独的服务。
作为子系统之一的Win32子系统51提供各种应用程序接口(API)函数给应用程序31到33,并执行例如存储器管理、进程管理和画图等处理。
更具体地,当从应用程序31、32或33调用包含输入/输出(I/O)的API函数时,Win32子系统51向NTI/O管理器52输出对应于该API函数的I/O请求。
由Win32子系统51提供的API函数包括用来创建文件的函数CreateFile()、用来读取文件(记录在文件中的数据)的函数ReadFile()、用来写入文件(数据)的函数WriteFile()和用来执行其它进程的函数DeviceIoControl()。
NTI/O管理器52提供用来将I/O请求包(IRP)传送到层结构设备驱动器的服务。
IRP是包含有关请求设备驱动器的进程信息的包。IRP包括一个分类请求内容的代码、表示读取数据(文件)请求的IRP_MJ_READ、表示写入(记录)数据请求的IRP_MJ_WRITE、表示创建一个文件请求的IRP_MJ_CREATE和表示执行其它类型进程请求的IRP_MJ_DEVICE_CONTROL。在IRP_MJ_DEVICE_CONTROL IRP中,I/O控制(IOCTL)由用户定义的子码来具体限定。
例如,NT I/O管理器52将从Win32子系统51来的基于CreatFile()的I/O请求转变成IRP_MJ_CREATE IRP。将ReadFile()和WriteFile()分别转换成IRP_MJ_READ IRP和IRP_MJ_WRITE IRP,而将DeviceIoControl()转换成IRP_MJ_DEVICE_CONTROL IRP。
在WindowsNT OS中,IRP在存储类的驱动器或更高的层中处理。
在图4中,有三个对应于存储类驱动器层或更高的层、即,存储类型的驱动器PD存储器55、比存储类驱动器高一层并作为文件系统驱动器的PD_FS54和比文件系统驱动器高一层的作为文件系统过滤驱动器的PD过滤器53的设备驱动器。
因此,在该实施例中,NT I/O管理器52提供用来将IRP传送给PD过滤器53、PD_FS 54和PD存储器55的服务。
更具体地,NT I/O管理器52将来自Win32子系统51的I/O请求转换成一个相应的IRP,并将该IRP输出到例如PD过滤器53中。接着,PD过滤器53输出一个请求到NT I/O管理器以响应来自NT I/O管理器52的IRP。然后,NT I/O管理器52将来自PD过滤器53的请求转换成相应的IRP,并将其输出到PD_FS 54。随后,PD_FS 54输出一个请求到NT I/O管理器以响应来自NT I/O管理器52的IRP。接着NT I/O管理器52将来自PD_FS 54的请求转换成相应的IRP并将其输出到PD存储器55。
PD过滤器53是一个用于驱动器2的文件系统过滤器,而驱动器2可以是一个比PD_FS 54要高的PD驱动器。PD过滤器53通过Win32子系统51和NT I/O管理器52将包含由应用程序31到33所提供的文件系统和其它请求的文件系统请求过滤,并将过滤后的结果和特定的请求通过NT I/O管理器52发送到PD_FS 54。
PD过滤器53包括一个过滤器核心53A,其用来执行PD过滤器53的主进程,例如对来自应用程序31到33的请求进行过滤。PD过滤器53根据寄存器58中设置(存储的)信息对请求进行过滤,其中,寄存器58为Windows寄存器。
用于驱动器2的PD_FS 54是一个文件系统驱动器,其管理已经记录或将要记录在安置在驱动器2中的光盘3(PD)上的文件。即,PD_FS 54通过基于用于表示管理记录在光盘3上的数据(文件)信息的文件系统的NT I/O管理器52输出一个来自PD过滤器53的读取或写入请求给PD存储器55。
通常,文件系统驱动器具有一个对文件流(在文件上已记录或将要记录的数据)进行高速缓存的高速缓存功能和文件的元信息。通过使用该高速缓存功能,能迅速地取得高速缓存的文件流和元信息而无需物理访问光盘3。
在WindowsNT OS中,NT高速缓存管理器59具有一个高速缓存功能,同时PD_FS 54通过使用该NT高速缓存管理器59而提供高速缓存功能。
PD_FS 54具有一个FS核心54A,该核心用来执行PD_FS 54的主进程。
PD存储器55是一个存储类型的驱动器,其是用于驱动器2的真实的设备驱动器,并通过NT I/O管理器52将一个来自比PD存储器55的层要高的设备驱动器PD_FS 54中的IRP请求转换成小型计算机系统接口(SCSI)代码并将其输出到一个串行总线协议(SBP)2的驱动器56。
将PD存储器55中的IPR转换成SCSI代码的原因是SCSI代码与在SBP2的驱动器56中处理的SBP2具有最大的兼容性。
SBP2驱动器56将来自存储器55的SCSI代码转换成与SBP2标准兼容的SBP2数据,并将该SBP2数据提供给1394驱动器57。
在该实施例中,SBP2被用于能处理用于执行与1394总线驱动器57所控制的IEEE 1394标准所兼容的通信的文件系统的协议。然而,除了SBP2也可以使用别的协议。
IEEE总线驱动器57控制IEEE 1394接口22(图2)以将来自SBP2驱动器56的SBP2数据发送到驱动器2或接收从光盘3读取的数据并从驱动器2发送。
在该实施例中,在PC 1和驱动器2之间执行与IEEE 1394标准兼容的通信。然而,也可以执行除IEEE 1394通信外其它的通信,在这种情况下,除了1394总线驱动器57以外,还使用相应于在PC 1和驱动器2之间通信的总线驱动器。
在图4中,由AV应用程序33所使用的PD_API 41提供了唯一的API函数。更具体地,当唯一的API函数由AV应用程序33调用时,PD_API 41使用对应的由Win32子系统51提供的API函数DeviceIoControl()以通过NTI/O管理器52向PD过滤器53提供具有用户定义的IOCTL的IRP_MJ_DEVICE_CONTROL IRP。这样,PD_API 41控制PD过滤器53的唯一函数、即由IOCTL表示的函数。
包含PD_API 41的AV应用程序33通过记录在与使用驱动器2所需的PD过滤器53、PD_FS 54,和PD存储器55在一起的可拆卸记录介质21(图2)上而出售。在其上记录AV应用程序33、PD过滤器53、PD_FS 54,和PD存储器55的可拆卸记录介质21可以作为一个单独的单元而出售。可选地,可拆卸记录介质21可以作为包含在驱动器2中的驱动器2的附件出售。
在图4中,应用程序31到33以及Win32子系统51都在用户模式下工作,而NT I/O管理器52、PD过滤器53、PD_FS 54、PD存储器55、SBP驱动器56和1394总线驱动器57均工作在内核模式下。
在图4中,NT I/O管理器52将IRP发送到作为文件系统过滤器驱动器的PD过滤器53和作为文件系统驱动器的PD_FS 54,以请求该文件系统过滤器驱动器或文件系统驱动器来执行特定的进程。WindowsNT OS的NT I/O管理器52不仅能发送IRP,而且还能发送FastIO给文件系统过滤器驱动器或文件系统驱动器来请求驱动器执行进程。
即,NT I/O管理器52也提供用来将FastIO发送给文件系统过滤器驱动器或文件系统驱动器来请求它执行进程。
因此,WindowsNT OS的文件系统过滤器驱动器和文件系统驱动器通常同时支持IRP和FastIO。
根据FastIO,文件能直接从NT高速缓存管理器59读出或写入到NT高速缓存管理器。
假定在该实施例中,在IRP和FastIO之间使用了IRP。但,FastIO也能用以下所描述的函数来执行。
现根据图5的流程图说明全部的进程都通过如图4所示的在OS 30中响应来自应用程序31、32,或33的对光盘3的访问请求的PD过滤器53、PD_FS54、PD存储器55、SBP2驱动器56,和1394总线驱动器57而执行。
在以下说明及图5到25中,除非必要均省去对Win32子系统51和NT I/O管理器52的解释和描述。
当应用程序31、32,或33调用表示访问光盘3的请求的函数时,相应的请求会从Win32子系统51提供给NT I/O管理器52。接着,NT I/O管理器52将相应于来自Win32子系统51的请求的IRP提供给PD过滤器53。
在步骤S1中,PD过滤器53从NT I/O管理器52接收IRP。接着,在步骤S2中,PD过滤器53将从NT I/O管理器52接收的I RP过滤。在步骤S3中,PD过滤器53将来自NT I/O管理器52的IRP提供给一个队列(在图4中未示出)并将其存储其中。随后,PD过滤器53读取存储在队列中的IRP并通过NT I/O管理器52将它提供给PD_FS 54。
在步骤S4中,PD_FS 54执行用于使用由来自PD过滤器53的IRP所请求的数据中的NT高速缓存管理器59的高速缓存功能所需的高速缓存进程。在步骤S5中,PD_FS 54确定来自PD过滤器53的IRP所请求的数据是否已高速缓存在NT高速缓存管理器59中。
如果在步骤S5中确定了IRP所请求的数据高速缓存在了NT高速缓存管理器59中,则进程转到步骤S6。在步骤S6中,PD_FS 54接收了由来自NT高速缓存管理器59中的IRP所请求的数据,并通过PD过滤器53和Win32子系统51,将对已经调用了相应于IRP的API函数的应用程序31、32,或33的IR作出的应答返回。
如果在步骤S5中确定IRP所请求的数据没有被高速缓存在NT高速缓存管理器59中,则进程转到步骤S7。在步骤S7中,PD_FS 54将来自PD过滤器53的IRP通过NT I/O管理器52提供给PD存储器55。
在步骤S8中,PD存储器55将来自PD_FS 54的IRP转换成相应的SCSI编码并将其提供给SBP2驱动器56。
在步骤S9中,SBP2驱动器56将SCSI代码转换成SBP2数据并将其提供给1394总线驱动器57。
在步骤S10中,1394总线驱动器57控制IEEE 1394接口22(图2)来将来自SBP2驱动器56的SBP2数据发送给驱动器2。
接着,1394总线驱动器57等待一个对在步骤S10中从驱动器2发送的SBP2数据的应答。在步骤S11中,1394总线驱动器57接收应答并将其返回到已经发送了在步骤S1中通过SBP2驱动器56、PD存储器55、PD_FS 54、PD过滤器53,和Win32子系统51所接收的IRP的应用程序31、32,或33。
在图4中,如果在应用程序31到33中,一个应用程序在另一个应用程序(例如,应用程序33)之前访问了光盘3,那么当应用程序33访问光盘3时还需要查询。应用程序33也必须等待对光盘3的访问。
在图4中,应用程序33是一个能将AV数据写入(记录)到光盘3或将AV数据从光盘3读取(播放)的AV应用程序。
如果驱动器2指定来读取或写入AV数据以实时响应只来自于AV应用程序33的访问,那么需要通过应用程序31或32对光盘3的访问来进行查询。同时,AV应用程序33也必须等待对光盘3的访问。结果,AV应用程序33实时地读取或写入AV数据就变得很困难。
因此,PD过滤器53至少具有以下三个功能之一,并能实时且可靠地从光盘3读取AV数据或将AV数据写入到光盘3。
在第一个功能中,PD过滤器53设置相应于来自应用程序31、32,或33的对光盘3的访问请求的IRP的特定优先级并将IRP与其优先级一起存储在一个队列中。接着,PD过滤器53根据IRP所设置的优先级处理存储在队列中的IRP。由于这样的结构,PD过滤器53可以预先处理表示来自AV应用程序33的访问请求的IRP,从而能确保AV应用程序33实时地读取和写入AV数据。
图6图示了实现上述第一个功能的PD过滤器53的结构实例。在图6中,还示出了应用程序31到33。
为WindowsNT OS的OS 30,以所谓的“进程”为单位执行程序。为了执行进程,要给该进程指定至少一个线程,并且进程是在线程中执行的。
在图6中,应用程序31包含了两个进程71和72。进程71由两个线程71A和71B所执行,而进程72由一个线程72A所执行。
应用程序32包括一个进程73,并且进程73由两个线程73A和73B执行。
AV应用程序33包含两个进程74和75。进程74由两个线程74A和74B所执行,而进程75由一个线程75A所执行。进程75是PD_API 41的进程。
API函数对Win32子系统51的调用以线程为单位来执行。因此,在图6所示的结构中,API函数在线程71A、71B、72A、73A、73B、74A、74B和75A的每个中都能被调用。
从线程中调用API函数就是从由线程所执行的进程调用API函数。
当API函数在线程71A到75A之一中被调用时,相应的IRP从NT I/O管理器52提供给PD过滤器53。
在PD过滤器53中,过滤器内核53A设置一个关于用于来自NT I/O管理器52的IRP的对光盘3的访问的特定优先级(以下也将其称之为“IRP优先级”)。
为WindowsNT OS的OS 30,具有一个设置进程和线程的优先级并根据优先级执行进程和线程的标准的优先级函数。根据该优先级函数,PC 1的资源,例如,CPU 12,RAM 14,等,可以预先指定给由OS 30所设置的具有高优先级的进程和线程。
因此,通过使用优先级函数,能设置AV应用程序33的进程74和75比应用程序31的进程71和72和应用程序32的进程73具有更高的优先级,从而能使得AV应用程序33能在应用程序31和32之前访问光盘3。
然而,OS 30的优先级函数所影响的不仅仅是对光盘3的访问,还包括CPU 12的使用以及对RAM 14的访问。
因此,如果通过使用优先级函数而给AV应用程序33的进程设置了较高的优先级,那么OS 30所提供的其它重要服务的进程就必须等待很长一段时间才能使用CPU 12或RAM 14。这就导致了重要服务的执行的中断,更糟的情况,还会导致PC 1的挂起。
这样,在PD过滤器53中,过滤器内核53A设置IRP优先级,该优先级不取决于由标准优先级函数所设置的NT I/O管理器52提供的IRP的优先级。
IPR的优先级仅仅是用于访问光盘3的优先级。因此,当为AV应用程序33设置一个更高的优先级时,该IRP优先级影响的仅仅是涉及访问光盘3的进程,而并不限定其它由OS 30所提供的服务的进程,例如CPU 12或RAM 14的使用。根据IRP的优先级,可以防止由OS 30所提供的重要的服务的中断或PC 1的挂起。
PD过滤器53设置了来自NT I/O管理器52的IRP的IRP优先级,并将该IRP提供给队列81A或81B并将其存储在其中。即,队列81A或81B将IRP与过滤核心53A所提供的IRP的优先级一起存储在其中。
在图6所示的结构中,提供了两个队列81A或81B,假定在驱动器2中存在两卷。即,队列81A和81B与两个相应的卷关联。PD过滤器53提供响应与81A关联的卷的IRP给队列81,提供响应与81B关联的卷的IRP给队列81B。队列81A和81B在以下也可简称为“队列81”,除非有必要将这二者进行区分。
PD过滤器53根据给IRP所设置的优先级处理存储在队列81中的IRP。即,PD过滤器53预先从队列81中读取具有一个高优先级的IRP,并通过NTI/O管理器52将其提供给PD_FS 54。
用于执行第一功能的进程的线程(与应用于第二功能和第三功能相同)在PD过滤器53的文件系统过滤驱动器层形成。存储IRP的队列81也通过该文件系统的过滤驱动器层形成。
为了预先通过使用PD过滤器53先于来自应用程序31和32的IRP处理来自AV应用程序33的IRP到,PD过滤器53为具有寄存在PD过滤器53中的进程ID的IRP设置最高的IRP优先级,并为在PD过滤器53中没有寄存的进程ID的IRP设置最低的IRP优先级。
即,OS 30通过给进程指定唯一的进程ID而管理各个进程,并且来自每个进程的IRP(与由每个进程所调用的API函数所关联的IRP)具有唯一的进程ID。随后,如果为来自NT I/O管理器52所接收的特定进程中的IRP所提供的进程ID与寄存在PD过滤器53中的进程ID一致,那么PD过滤器53为该接收到的IRP设置最高的IRP优先级。如果用于该接收到的IRP的进程ID与寄存在PD过滤器53中的进程ID不同(或如果在PD过滤器53中没有寄存器进程ID),那么PD过滤器53为该IRP设置最低的IRP优先级。
表示IRP优先级的数据可以是例如5比特。在这种情况中,最高的IRP优先级是31,而最低的IRP优先级为0。
为了使用PD过滤器53的第一功能,当其被加载时,使用(加载)在AV应用程序33中的PD_API 41请求PD过滤器53寄存器进程75的进程ID,在加载PD_API 41时,是通过使用由Win32子系统51所提供的API函数DeviceIoControl()。即,当AV应用程序33开始通过AV应用程序33的进程75加载PD_API 41时,PD_API 41调用请求PD过滤器53寄存指定给进程75的进程ID的API函数DeviceIoControl()。
当完成进程75时,PD_API 41调用请求PD过滤器53删除指定给进程75的进程ID的API函数DeviceIoControl()。
因此,只要存在PD_API 41的进程75,最高的IRP优先级就在PD过滤器53中为进程75的IRP(与通过Win32子系统51所提供的API函数相关联的IRP)设置并通过进程75而调用(PD_API 41)。
图7示出了当PD过滤器53执行使用第一功能的进程时用来让PD_API 41控制PD过滤器53的API函数。图7所示的API函数提供给AV应用程序33。
在图7中,允许PD_API 41控制PD过滤器53的API函数包括两个函数,即,PdGetPriority()和PdSetPriority()。在这两个API函数PdGetPriority()和PdSetPriority()中,使用进程ID和IRP优先级作为参数。
当API函数PdGetPriority()通过指定作为参数的进程ID来调用时,用于响应具有指定的进程ID的由PD过滤器53所设置的IRP优先级与该参数一起返回。在API函数PdGetPriority()中,当为具有该特定的进程ID的进程而由PD过滤器53所设置的IRP优先级的捕获成功时,将1作为返回值返回,而当IRP优先级的捕获失败时,将0作为返回值返回。
根据API函数PdGetPriority(),能确定由PD过滤器53而为来自一个特定的进程的IRP所设置的IRP优先级。
当API函数PdSetPriority()通过指定进程ID和IRP优先级作为参数而调用时,由为具有作为参数的特定的进程ID的进程而由PD过滤器53所设置的IRP优先级变为用作为参数的IRP优先级。在API函数PdSetPriority()中,当由PD过滤器53所设置的IRP优先级成功改变后,将1作为返回值返回,当IRP的优先级没有成功改变时,返回0。
根据API函数PdSetPriority(),能设置由PD过滤器53为来自具有寄存在PD过滤器53中的进程ID的进程中的IRP或来自具有没有寄存在PD过滤器53中的进程ID的进程中的IRP所设置的IRP优先级。
当调用API函数PdGetPriority()时,PD_API 41调用请求PD过滤器53来发送由PD过滤器53所设置的IRP优先级的API函数DeviceIoControl()。
当调用API函数PdSetPriority()时,PD_API 41调用请求PD过滤器53来改变由PD过滤器53所设置的IRP优先级的API函数DeviceIoControl()。
正如以上所论述的,为了使用PD过滤器53的第一功能,PD_API 41调用表示寄存器进程ID的请求的API函数DeviceIoControl()和表示删除进程ID的请求的API函数DeviceIoControl(),而且如果需要,API函数DeviceIoControl()表示发送由PD过滤器53所设置的IRP优先级的请求而API函数DeviceIoControl()表示改变由PD过滤器53所设置的IRP优先级的请求。
当调用API函数DeviceIoControl()时,Win32子系统51给NT I/O管理器52发送一个响应API函数DeviceIoControl()的请求。接着NT I/O管理器52将该请求转换成IRP_MJ_DEVICE_CONTROL IRP,并将其提供给PD过滤器53。
如上所述,在IRP_MJ_DEVICE_CONTROL IRP中,用户所定义的IOCTL用子码来指明。
图8图示出了当PD过滤器53通过使用第一功能来执行进程时在IRP_MJ_DEVICE_CONTROL中特定的用户定义的IOCTL。
在图8中,四个IOCTL(子码),即IOCTL_PD_SET_PROCESSID,IOCTL_PD_DELETE_PROCESSID,IOCTL_PD_SET_PRIORITY,和IOCTL_PD_GET_PRIORITY,都可以作为用户定义的IOCTL。
IOCTL_PD_SET_PROCESSID是作为响应表示寄存器进程ID的请求的API函数DeviceIoControl()的IRP_MJ_DEVICE_CONTROL的子码的IOCTL。表示寄存器进程ID的请求的API函数DeviceIoControl()使用进程ID来作为参数寄存,而且IOCTL_PD_SET_PROCESSID为请求PD过滤器53来将进程ID寄存到PD过滤器53中的请求的IOCTL。
IOCTL_PD_DELETE_PROCESSID是作为响应表示删除进程ID的请求的API函数DeviceIoControl()的IRP_MJ_DEVICE_CONTROL的子码的IOCTL。表示删除进程ID的请求的API函数DeviceIoControl()使用进程ID来作为参数删除,而且IOCTL_PD_DELETE_PROCESSID为请求PD过滤器53来将进程ID从PD过滤器53中删除的请求的IOCTL。
IOCTL_PD_SET_PRIORITY是作为响应表示改变由PD过滤器53所设置的IRP优先级的请求的API函数DeviceIoControl()的IRP_MJ_DEVICE_CONTROLIRP的子码的IOCTL。根据该IOCTL,将为具有该进程ID的IRP所设置的IRP优先级变为也作为API函数PdSetPriority()的参数的IRP优先级,其中前面的IRP优先级用作具有用来作为图7所示的响应表示改变由PD过滤器53所设置的IRP优先级的请求的API函数DeviceIoControl()的API函数PdSetPriority()的参数。
IOCTL_PD_GET_PRIORITY是作为响应表示获取由PD过滤器53所设置的进程ID的请求的API函数DeviceIoControl()的IRP_MJ_DEVICE_CONTROLIRP的子码的IOCTL。根据该IOCTL,请求具有这样的进程ID所设置的IRP优先级,其中进程ID用来作为图7所示的响应表示获取由PD过滤器53所设置的IRP优先级的请求的API函数DeviceIoControl()的API函数PdSetPriority()的参数。
作为IRP_MJ_DEVICE_CONTROL IRP的子码的用户定义的IOCTL通过使用由Win32子系统51所提供的API函数DeviceIoControl()而从子系统51发送到NT I/O管理器52,并通过NT I/O管理器52将其作为IRP_MJ_DEVICE_CONTROL IRP的子码。
现结合图9中的流程图,来描述当PD过滤器53执行第一功能时,图6所示的AV应用程序33、PD_API 41,和PD过滤器53所执行的全部进程。
当启动AV应用程序33时,在步骤S21中,AV应用程序33通过进程75加载PD_API 41。接着,在步骤S31中,PD_API 41API函数DeviceIoControl(),该函数调用表示寄存已经加载了PD_API 41的进程75的进程ID的请求,以便将具有作为寄存器进程75的进程ID的请求的IOCTL的IOCTL_PD_SET_PROCESSID的IRP_MJ_DEVICE_CONTROL从NT I/O管理器52提供给PD过滤器53。
在步骤S41中,PD过滤器53从NT I/O管理器52接收的IRP并根据I RP的IOCTL_PD_SET_PROCESSID寄存PD_API 41的进程75的进程ID。
因此,随后,除非删除PD_API 41的进程75的进程ID,否则为来自进程75的I RP设置最高的IRP优先级,而给来自其它进程的IRP设置最低的IRP优先级。因此,在PD过滤器53中,来自进程75的IRP能优先处理。
更具体地,如果在步骤S22中,比如说AV应用程序33调用表示读取文件请求的API函数ReadFile()作为访问光盘3的请求,那么在步骤S32中PD_API 41接收对API函数ReadFile()的调用。
在步骤S33中,为了响应对来自AV应用程序33的API函数ReadFile()的调用,PD_API 41调用Win32子系统51所提供的相同的API函数ReadFile(),接着,表示读取文件请求的IRP_MJ_READ IRP被从NT I/O管理器52提供给PD过滤器53。
在步骤S42中,PD过滤器53从NT I/O管理器52接收的IRP_MJ_READ IRP,并为IRP_MJ_READ IRP设置IRP优先级。
更具体地,在步骤S42中由PD过滤器53所接收的IRP_MJ_READ IRP为来自PD_API 41的进程75的IRP。进程75的进程ID在步骤S41中被寄存在PD过滤器53中。因此,在步骤S42中由PD过滤器53从进程75所接收的IRP_MJ_READ IRP具有最高的IRP优先级。
结果,在PD过滤器53中,只要没有其它具有最高IRP优先级的IRP就会立即处理来自PD_API 41的进程75中的IRP_MJ_READ IRP。
在步骤S43中,PD过滤器53优先将来自PD_API 41的进程75中的IRP_MJ_READ IRP提供给PD_FS 54。
接着,当AV应用程序33结束时,在步骤S23中,AV应用程序33请求PD_API 41的进程75来卸载PD_API 41。
为了响应该请求,在步骤S34中,PD_API 41调用表示删除进程75的进程ID请求的API函数DeviceIoControl()以便具有指定为表示删除进程75的进程ID请求的IOCTL的IOCTL_PD_DELETE_PROCESSID的IRP_DEVICE_CONTROL IRP从NT I/O管理器52提供给PD过滤器53。
在步骤S44中,PD过滤器53从NT I/O管理器52接收IRP并根据IRP的IOCTL_PD_DELETE_PROCESSID而删除PD_API 41的进程75的进程ID。
从而,在PD过滤器53中,IRP根据由OS 30的标准的优先级函数所设置的优先级而处理IRP。
图6所示的PD过滤器53执行第一功能的进程将在以下结合图10和11进行论述。
首先参考图10的流程图来论述从当由图6所示的具有第一功能的PD过滤器53接收IRP到当在队列81中存储IRP(用于将IRP输入到队列81中的进程)期间的进程。
为了响应对表示在驱动器2上通过应用程序31到33中的进程71到75之一执行涉及I/O的进程的API函数的调用,Win32子系统51输出一个请求给NT I/O管理器52,并且NT I/O管理器52将相应于API函数的IRP提供给PD过滤器53以响应从Win32子系统51所输出的请求。
在PD过滤器53中,在步骤S51中,过滤器内核53A接收已经调用了来自NT I/O管理器52的API函数的进程所请求的IRP。在步骤S52中,过滤器内核53A确定IRP是否为具有指定为IOCTL的IOCTL_PD_SET_PROCESSID(图8)的IRP_MJ_DEVICE_CONTROL IRP。
如果在步骤S52中确定在步骤S51中由过滤器内核53A所接收的IRP为具有指定为IOCTL的IOCTL_PD_SET_PROCESSID的IRP_MJ_DEVICE CONTROLIRP,则进程跳到步骤S53。在步骤S53中,过滤器内核53A寄存(存储)包含在IRP中的进程ID,即,已经调用了相应于IRP的API函数的进程的进程ID,并且进程返回步骤S51。
也就是说,具有指定为IOCTL的IOCTL_PD_SET_PROCESSID的IRP包含已经调用了相应于IRP的API函数的进程的进程ID,并且过滤器内核53A寄存该进程ID。由过滤器内核53A所寄存的进程ID以下也称之为“寄存的进程ID”。
如果在步骤S52中确定进程所请求的IRP不是具有指定为IOCTL的IOCTL_PD_SET_PROCESSID的IRP,则进程转到步骤S54以确定IRP是否是具有规定为IOCTL的IOCTL_PD_DELETE_PROCESSID(图8)的IRP_MJ_DEVICE_CONTROL IRP。
如果在步骤S54中确定IRP为具有指定为IOCTL的IOCTL_PD_DELETE_PROCESSID的IRP,则进程转到步骤S55。在步骤S55中,过滤器内核53A删除所寄存的进程ID,并且进程返回到步骤S51。
如果在步骤S54中确定IRP不是具有规定为IOCTL的IOCTL_PD_DELETE_PROCESSID的IRP,则进程转到步骤S56以确定IRP是否是表示访问光盘3的请求的IRP。
如果在步骤S56中确定进程所请求的IRP不是表示访问请求的IRP,即,IRP为具有指定为表示改变由PD过滤器53所设置的IRP优先级请求的IOCTL的IOCTL_PD_SET_PRIORITY(图8)的IRP_MJ_DEVICE_CONTROL IRP或具有指定为表示获取由PD过滤器53所设置的IRP优先级的IOCTL的IOCTL_PD_GET_PRIORITY(图8)的IRP_MJ_DEVICE_CONTROL IRP,则进程转到步骤S57。在步骤S57中,过滤器内核53A基于IRP而执行进程,并通过NT I/O管理器52和Win32子系统51将响应进程的结果返回给已调用了API函数的进程。接着,进程返回到步骤S51。
如果进程所请求的IRP为具有指定为IOCTL的IOCTL_PD_SET_PRIORITY的IRP,则在步骤S57中,过滤器内核53A将为由具有在IOCTL_PD_SET_PRIORITY中特定的进程ID的进程所请求的IRP而设置的IRP优先级改变为也在IOCTL_PD_SET_PRIORITY中指定的IRP优先级。如果进程所请求的IRP为具有指定为IOCTL的IOCTL_PD_GET_PRIORITY的IRP,在步骤S 57中,过滤器内核53A返回为由具有在IOCTL_PD_GET_PRIORITY中特定的进程ID的进程所请求的IRP而设置的IRP优先级作为响应。
如果在步骤S56中确定进程所请求的IRP为表示访问请求的IRP,即,IRP为表示读取文件请求的IRP_MJ_READ IRP或表示写入文件请求的IRP_MJ_WRITE IRP,则进程转到步骤S58。在步骤S58中,过滤器内核53A确定包含在进程所请求的IRP中的进程ID,即,已经调用了相应于IRP的API函数的进程的进程ID,是否与寄存的进程ID一致。
如果在步骤S58中确定包含在进程请求的IRP中的进程ID与寄存的进程ID不一致,则进程转到步骤S59。在步骤S59中,过滤器内核53A为进程所请求的IRP设置最低的IRP优先级并且进程转到步骤S61。
如果在步骤S58中确定包含在进程请求的IRP中的进程ID与寄存的进程ID一致,则进程转到步骤S60。在步骤S60中,过滤器内核53A为进程所请求的IRP设置最高的IRP优先级并且进程转到步骤S61。
在步骤S61中,过滤器内核53A将具有与在步骤S59或步骤S60中设置的IRP优先级的IRP输出到队列81并将其存储在其中,并等待另一个IRP。进程接着返回到步骤S51。
在图10中,如果包含在进程请求的IRP中的进程ID与寄存的进程ID不同,则给IRP设置最低的IRP优先级。如果包含在IRP中的进程ID与寄存的进程ID相同,则给IRP设置最高的IRP优先级。然而,也可以给IRP设置IRP优先级的其它级别。
给具有特定进程ID的IRP设置IRP优先级,例如,具有与寄存的进程ID一致的进程ID的IRP,能通过图7所示的API函数PdSetPriority()而指定。
对于所寄存的进程ID来说,可以寄存多个进程ID。在这种情况中,一个唯一的IRP优先级能指定给每个寄存的ID,并且能为具有与所寄存的进程ID一致的进程ID的IRP指定给某个寄存的进程ID指定的IRP优先级。
在存储于由图6所示的具有第一功能的PD过滤器53所产生的队列81中的IRP上的进程(用于从队列81输出一个IRP的进程)将在以下参考图11的流程进行描述。
在PD过滤器53中,在步骤S71中,过滤器内核53A从存储在队列81中的IRP中寻找一个最高的IRP优先级。
在步骤S72中,过滤器内核53A处理在步骤S71中所寻找到的具有最高IRP优先级的IRP,同时进程返回步骤S71。更具体地,在步骤S72中,过滤器内核53A预先从队列81中读取具有最高IRP优先级的IRP并通过NT I/O管理器52将它输出到PD_FS 54。
如果在步骤S71中寻找到多个具有最高IRP优先级的IRP,则过滤器内核53A根据OS 30的标准优先级函数或IRP存储到队列81中的时间而处理多个IRP。即,过滤器内核53A基于标准优先级函数或最早存储的IRP预先从队列81中读取来自具有最高优先级的进程中的IRP并将其输出到PD_FS 54。
如上所论述的,在PD过滤器53中,为IRP设置与OS 30的标准优先级函数不同的IRP优先级。更具体地,具对于由有与寄存的进程ID一致的进程ID的进程而所请求的IRP,为该IRP设置最高的IRP优先级,而对于由具有与寄存的进程ID不一致的进程ID的进程所请求的IRP,为该IRP设置最低的IRP优先级。
接着,PD过滤器53队列81中存储提供的IRP优先级的IRP,并根据IRP优先级处理存储在队列81中的IRP。
在AV应用程序33中,当通过进程75加载PD_API 41时,PD_API 41请求PD过滤器53来寄存器进程75的进程ID,同时PD过滤器53寄存PD_API 41的进程75的进程ID。
接着,AV应用程序33产生一个请求来通过PD_API 41的进程75访问光盘3。
因此,在PD过滤器53中,表示AV应用程序33访问光盘3的请求的IRP优先于应用程序31和32的IRP而执行。这样,AV应用程序33就不必等到执行完应用程序31或32的IRP或由应用程序31或32的IRP上的进程所引起的驱动器2中所需的寻址。结果,就可以避免AV应用程序33所产生的从光盘3读取数据或将数据写入到光盘3中的中断,并且从而能实时地将AV数据记录到光盘3上或从光盘3上播放。
为了实时地将AV数据记录在光盘3上或从光盘3上播放AV数据,仅仅需要表示AV应用程序33对光盘3的访问的请求的IRP在AV应用程序33记录或播放AV数据时预先处理。
在上描述实施例中,如参考图9所论述的,表示AV应用程序33对光盘3的访问的请求的IRP仅仅在PD过滤器53加载PD_API 41时预先处理。
因此,除了在AV应用程序33开始加载PD_API 41时开始而在AV应用程序33完成时卸载PD_API 41外,PD_API 41也可以在AV应用程序33记录或播放AV数据的操作开始时加载而在记录或播放操作完成时卸载。
以下将描述用于可靠地实时读取和写入AV数据的PD过滤器53的第二功能。
更具体地,根据第二功能,PD过滤器53设置一个表示代表从应用程序31到33对光盘3访问的请求的IRP进程是否被允许或禁止的暂停标志,同时将来自应用程序31到33的IRP存储在队列81中。接着PD过滤器53根据暂停标志处理存储在队列81中的IRP。由于这样的结构,PD过滤器53中断来自除AV应用程序33外其它应用程序的IRP的处理,而只处理来自应用程序33的IRP。结果,应用程序33能实时且可靠地读取或写入AV数据。
就是说,通过使用第二功能,PD过滤器53进入以下两种状态之一根据暂停标志仅仅允许处理特定的IRP而不处理其它IRP的中断状态和所有IRP都能处理的运行状态。
具有以上所述的第二功能的PD过滤器53的结构举例来说,如图6所示。
更具体地,在具有第二功能的PD过滤器53中,除了寄存器进程ID以及为IRP设置IRP优先级外,过滤器内核53A还设置暂停标志。过滤器内核53A还根据IRP优先级以及暂停标志,处理存储在队列81中的IRP。
为了使用PD过滤器53的第二功能,AV应用程序33所使用的PD_API 41提供了用于给AV应用程序33设置PD过滤器53是中断状态或运行状态的API函数。
图12图示了当PD过滤器53执行使用第二功能的进程时允许PD_API 41控制PD过滤器53的API函数。图12所示的API函数提供给了AV应用程序33。
在图12中,省略了以上所述的用于控制PD过滤器53的API函数。
在图12中,用于允许PD_API 41控制PD过滤器53的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能为每个卷,即,每个与相应的卷关联的队列,设置处于中断状态或运行状态。例如,在PD过滤器53中,在队列81A和81B中设置中断状态或运行状态。
但为了简明起见,相同的状态,即中断状态或运行状态,都可以为队列81A和81B设置。
在API函数PdPauseOtherAppIrp()中,如果PD过滤器53已经成功地设置为中断状态,则将1作为返回值返回,而如果PD过滤器53没有成功设置为中断状态,则将0作为返回值返回。类似地,在API函数PdRunOtherAppIrp()中,如果PD过滤器53已经成功地设置为运行状态,则将1作为返回值返回,而如果PD过滤器53没有成功设置为运行状态,则将0作为返回值返回。
当调用API函数PdPauseOtherAppIrp()时,PD_API 41调用请求PD过滤器53处于中断状态的API函数DeviceIoControl()。
当调用API函数PdRunOtherAppIrp()时,PD_API 41调用使PD过滤器53处于运行状态的API函数DeviceIoControl()。
当调用API函数DeviceIoControl()时,Win32子系统51输出一个响应API函数DeviceIoControl()的请求给NT I/O管理器52,并且NT I/O管理器52将该请求转换成IRP_MJ_DEVICE_CONTROL IRP并将其提供给PD过滤器53。
如上所述,在IRP_MJ_DEVICE_CONTROL中,IOCTL指定为用户定义的子码。
图13图示了当PD过滤器53执行使用第二功能的进程时在IRP_MJ_DEVICE_CONTROL中指定的用户所定义的IOCTL。
如图12,在图13中,并未示出以上所论述的用户所定义的IOCTL。
在图13中,两个TOCTL子码,即,IOCTL_PD_PAUSE_OTHERAPPIRP和IOCTL_PD_RUN_OTHERAPPIRP,都可以作为用户所定义的IOCTL。
IOCTL_PD_RUN_OTHERAPPIRP为响应表示将PD过滤器53设置为处于中断状态的请求的API函数DeviceIoControl()的IRP_MJ_DEVICE_CONTROL IRP的字码的IOCTL。
IOCTL_PD_PAUSE_OTHERAPPIRP为响应表示将PD过滤器53设置为处于运行状态的请求的API函数DeviceIoControl()的IRP_MJ_DEVICE_CONTROL IRP的子码的IOCTL。
用户所定义的IOCTL,即IRP_MJ_DEVICE_CONTROL IRP的子码,通过使用由Win32子系统51所提供的API函数DeviceIoControl()从Win32系统51传送到NT I/O管理器52,并被NT I/O管理器52指定为IRP_MJ_DEVICE_CONTROL IRP的子码。
现将参考图14的流程图描述当PD过滤器53执行第二功能时图6所示的AV应用程序33、PD_API 41,以及PD过滤器53的全部进程。
为了响应用户操作输入单元17(图2)所产生的将AV数据记录在光盘3上或从光盘3播放AV数据的请求,在步骤S91中,AV应用程序33调用API函数PdPauseOtherAppIrp()。
在步骤S101中,PD_API 41从AV应用程序33接收对API函数PdPauseOtherAppIrp()的调用。接着,在步骤S102中,PD_API 41调用表示为响应对API函数PdPauseOtherAppIrp()的调用而让PD_API 41调用请求PD过滤器53处于中断状态的API函数DeviceIoControl()以便具有作为表示PD过滤器53处于中断状态的具有IOCTL的IOCTL_PD_PAUSE_OTHERAPPIRP的IRP_MJ_DEVICE_CONTROL IRP从NT I/O管理器52提供给PD过滤器53。
在步骤S111中,PD过滤器53从NT I/O管理器52接收IRP并根据IOCTL_PD_PAUSE_OTHERAPPIRP将暂停标志设置为1,从而使得PD过滤器53能在中断状态下操作。
在中断状态下,PD过滤器53中断除了PD_API 41的进程75外其它所有的进程请求的IRP的处理而仅仅处理PD_API 41的进程75所请求的IRP。
如果,在步骤S92中,AV应用程序33调用表示作为访问光盘3的请求的读取文件的请求的API函数ReadFile(),则在步骤S103中PD_API 41接收对API函数ReadFile()的调用。
在步骤S104中,为了响应对来自AV应用程序33的API函数ReadFile()的调用,PD_API 41调用相同的API函数ReadFile()以便表示读取文件请求的IRP_MJ_READ IRP从NT I/O管理器52提供给PD过滤器53。
在步骤S112中,PD过滤器53从NT I/O管理器52接收IRP_MJ_READ IRP。在步骤S113中,PD过滤器53存储在步骤S112中接收到的IRP,即,队列81(图6)中,PD_API 41的进程75所请求的IRP。接着,PD过滤器53从队列81读取IRP并将它提供给PD_FS 54。
如上所述,会立即处理AV应用程序33的进程75的IRP。
另一方面,如果除了AV应用程序33外的应用程序31和32的进程71到73在步骤S81到S83中调用了表示作为访问光盘3的请求的读取文件请求的API函数ReadFile(),则表示读取文件请求的IRP_MJ_READ IRP就从NT I/O管理器52提供给PD过滤器53。
在步骤S114到S116中,PD过滤器53接收了响应在步骤S81到S83中调用的API函数ReadFile()的IRP,并将该IRP存储在队列81中。
在这种情况中,由于PD过滤器53处于中断状态,因此在步骤S114到S116中PD过滤器53不能处理存储在队列81中的IRP,该IRP即除AV应用程序33的进程75外的进程71到73的IRP。也就是说,在PD过滤器53中,来自应用程序31的进程71和72中的IRP以及应用程序32的应用程序73依然存储在队列81中而并未提供给PD_FS 54。
接着,为了响应停止记录在光盘3上的AV数据的播放操作或完成用户操作输入单元17而完成AV应用程序33的请求,AV应用程序33在步骤S93中调用API函数PdRunOtherAppIrp()。
在步骤S105中,PD_API 41接收AV应用程序33对API函数PdRunOtherAppIrp()的调用。接着,在步骤S106中,PD_API 41调用请求PD过滤器53为运行状态来响应对API函数PdRunOtherAppIrp()的调用的API函数DeviceIoControl(),以便请求PD过滤器53为运行状态的IOCTL具有指定为IOCTL的IOCTL_PD_RUN_OTHERAPPIRP的IRP_MJ_DEVICE_CONTROLIRP从NT I/O管理器52提供给PD过滤器53。
在步骤S117中,PD过滤器53从NT I/O管理器52接收IRP并根据表示运行状态的IOCTL_PD_RUN_OTHERAPPIRP为0而复位暂停标志,从而允许PD过滤器53在运行状态下运行。
接着,PD过滤器53开始(重新开始)处理除了PD_API 41的进程75外的进程的IRP。
在这种情况下,在PD过滤器53中,在步骤S114到S116中所接收的进程71到73的IRP依旧存储在队列81中而不被处理。
接着,在步骤S118到S120中,PD过滤器53读取存储在队列81中的进程71到73的IRP,并将其提供给PD_FS 54。
接着,在步骤S84中,当除了AV应用程序33外的应用程序31到32的进程71到73中的一个调用表示作为访问光盘3的请求的读取文件的请求的API函数ReadFile()时,表示读取文件请求的IRP_MJ_READ IRP就从NT I/O管理器52提供给PD过滤器53。
在步骤S121中,PD过滤器53接收IRP来响应由进程71到73之一在步骤S84中所调用的API函数ReadFile()并将其IRP存储在队列81中。
在这种情况下,由于PD过滤器53处于运行状态,则在步骤S122中,其读取在步骤S121中存储在队列81中的IRP并将其提供给PD_FS 54。
如上所述,当PD过滤器53处于中断状态时,其仅仅从AV应用程序33输出IRP给PD_FS 54。当PD过滤器53从中断状态转到运行状态时,其也输出除了AV应用程序33外其它的应用程序的IRP给PD_FS 54。
图6所示的由PD过滤器53所执行的进程将在以下参考图15和16进行描述。
首先,将参考图15的流程图来论述从当由图6所示的提供第二功能的PD过滤器53所接收的IRP到存储在队列81中的IRP的进程(用于将IRP输入到队列81中的进程)。
在图15中,所执行的进程类似于图10的流程图所描述的进程,除了用于设置暂停标志的步骤S156到S159。
为了响应表示由应用程序31到33的进程71到75之一而在驱动器2上执行有关I/O的进程的请求的API函数的调用,Win32子系统51输出一个请求给NT I/O管理器52,而NT I/O管理器52将相应于API的函数的IRP提供给PD过滤器53以响应从Win32子系统51输出的请求。
在PD过滤器53中,在步骤S151中,过滤器内核53A接收由已经调用了NT I/O管理器52的AIP函数所请求的IRP。在步骤S152中,过滤器内核53A确定IRP是否是具有指定为IOCTL的IOCTL_PD_SET_PROCESSID(图8)的IRP_MJ_DEVICE_CONTROL IRP。
如果在步骤S152中确定在步骤S151中由过滤器内核53A所接收的IRP是指定为IOCTL的IOCTL_PD_SET_PROCESSID的IRP_MJ_DEVICE_CONTROL IRP,则进程转到步骤S153。在步骤S153中,过滤器内核53A寄存(存储)包含在IRP中的进程ID,即,已经调用了相应于IRPAPI函数的进程的进程ID,并等待另一个IRP。接着进程返回步骤S151。
也就是说,在步骤S153中,已经调用的相应于在步骤S151中由过滤器内核53A所接收的IRPAPI函数的进程的进程ID被寄存(寄存的进程ID)。
如果在步骤S152中确定进程所请求的IRP不是具有指定为IOCTL的IOCTL_PD_SET_PROCESSID的IRP_MJ_DEVICE_CONTROL IRP,则进程转到步骤S154以确定IRP是否是具有指定为IOCTL的IOCTL_PD_DELETE_PROCESSID(图8)的IRP_MJ_DEVICE_CONTROL IRP。
如果在步骤S154中确定IRP是具有指定为IOCTL的IOCTL_PD_DELETE_PROCESSID的IRP,则进程转到步骤S155。在步骤S155中,过滤器内核53A删除寄存的进程ID并等待另一个IRP。接着进程转到步骤S11。
如果在步骤S154中确定IRP不是具有指定为IOCTL的IOCTL_PD_DELETE_PROCESSID的IRP,则进程转到步骤S156以确定IRP是否是具有指定为IOCTL的IOCTL_PD_PAUSE_PROCESSID(图13)的IRP_MJ_DEVICE_CONTROL IRP。
如果在步骤S156中确定进程所请求的IRP是具有指定为IOCTL的IOCTL_PD_PAUSE_OTHERAPPIER的IRP,则进程转到步骤S157。在步骤S157中,过滤器内核53A设置暂停标志,其是一个为1的变量,表示中断状态,并等待另一个IRP。接着进程转到步骤S151。过滤器内核53A(PD过滤器53)接着在中断状态下运行。
如果在步骤S156中确定进程所请求的IRP不是具有指定为IOCTL的IOCTL_PD_PAUSE_OTHERAPPIER的IRP,则进程转到步骤S158以确定进程请求的IRP是否是具有指定为IOCTL的IOCTL_PD_RUN_OTHERAPPIER(图13)的IRP_MJ_DEVICE_CONTROL IRP。
如果在步骤S158中确定进程所请求的IRP是具有指定为IOCTL的IOCTL_PD_RUN_OTHERAPPIER的IRP,则进程转到步骤S159。在步骤S159中,过滤器内核53A重设暂停标志为表示运行状态的0,并等待另一个IRP。接着进程转到步骤S151。过滤器内核53A接着在运行状态下运行。
如果在步骤S158中确定进程所请求的IRP不是具有指定为IOCTL的IOCTL_PD_RUN_OTHERAPPIER的IRP,则进程转到步骤S160以确定IRP是否是表示对光盘3访问的请求的IRP。
如果在步骤S160中确定进程请求的IRP不是表示访问请求的IRP,即,IRP为表示由PD过滤器53所设置的改变IRP优先级请求的具有指定为IOCTL的IOCTL_PD_SET_PRIORITY(图8)的IRP_MJ_DEVICE_CONTROL IRP或表示由PD过滤器53所设置的获取IRP优先级请求的具有指定为IOCTL的IOCTL_PD_GET_PRIORITY(图8)的IRP_MJ_DEVICE_CONTROL IRP,则进程转到步骤S161。在步骤S161中,如同图10中的步骤S57,过滤器内核53A基于IRP执行进程,并返回作为响应的进程结果给通过NT I/O管理器52和Win子系统51而调用了API函数的进程,并等待另一个IRP。接着进程返回步骤S151。
如果在步骤S160中确定进程请求的IRP是表示访问请求的IRP,即,IRP为表示读取文件请求的IRP_MJ_READ IRP或表示写入文件请求的IRP_MJ_WRITE IRP,则进程转到步骤S162。在步骤S162中,过滤器内核53A确定进程ID是否包含在进程所请求的IRP中,即,已经调用相应于该IRP的API函数的进程的进程ID是否与寄存的进程ID一致。
如果在步骤S162中确定包含在进程所请求的IRP中的进程ID与寄存的进程ID不一致,则进程转到步骤S163。在步骤S163中,过滤器内核53A为进程请求的IRP设置最低的IRP优先级,同时进程转到步骤S165。
如果在步骤S162中确定包含在进程所请求的IRP中的进程ID与寄存的进程ID一致,则进程转到步骤S164。在步骤S164中,过滤器内核53A为进程请求的IRP设置最高的IRP优先级,同时进程转到步骤S165。
在步骤S165中,过滤器内核53A输出提供有由在步骤S163或S164中设置的IRP优先级的IRP给队列81并将其存储在其中,同时等待另一个IRP。接着进程转到步骤S151。
由图6所示执行第二功能的PD过滤器53存储于队列81上的IRP所执行的进程(用于从队列81输出一个IRP的进程)将在以下参考图16的流程图来描述。
在PD过滤器53中,在步骤S171中,过滤器内核53A确定暂停标志是否设置为1。
如果在步骤S171中确定暂停标志设置为1,即,PD过滤器53处于中断状态,则进程转到步骤S172以确定是否为队列81设置最高的IRP优先级。
如果在步骤S172中为队列81设置最高的IRP优先级,即,具有与寄存的进程ID一致的进程ID的进程所请求的IRP存储在队列81中,则进程转到步骤S173中。在步骤S173中,过滤器内核53A处理存储在队列81中具有最高IRP优先级的IRP,同时进程返回到步骤S171。也就是说,在步骤S173中,过滤器内核53A从队列81读取具有最高IRP优先级的IRP并通过NT I/O管理器52将其输出到PD_FS 54。
如果在步骤S172中确定具有最高IRP优先级的IRP没有存储在队列81中,即,具有与寄存的进程ID一致的进程ID的进程所请求的IRP没有存储在队列81中,则进程跳过步骤S173而返回到步骤S171。
因此,如果PD过滤器53处于中断状态,则由具有与所寄存的进程ID不同的进程ID的进程所请求的IRP不会输出到PD_FS 54。
如果在步骤S171中确定暂停标志重新复位为0,即PD过滤器53处于运行状态,则进程转到步骤S174。
更具体地,如同步骤S71,在步骤S174中,过滤器内核53A从存储在队列81中的IRP中寻找最高的IRP优先级。
如同步骤S72,在步骤S175中,过滤器内核53A处理在步骤S174中寻找到的具有最高IRP优先级的IRP,同时进程转到步骤S171。更具体地,在步骤S175中,过滤器内核53A优先从队列81中读取具有最高IRP优先级的IRP并通过NT I/O管理器52将其输出到PD_FS 54。
因此,当PD过滤器53处于运行状态时,如在图11中,PD过滤器53从队列81中读取IRP并将其输出到PD_FS 54。
如上所论述的,在PD过滤器53中,为具有与所寄存的进程ID相同的进程ID的进程设置最高的IRP优先级,而为具有与所寄存的进程ID不同的进程ID的进程设置最低的IRP优先级。
PD过滤器53存储由在队列81中的IRP优先级所提供的IRP。如果PD过滤器53处于运行状态,则根据IRP优先级处理存储在队列81中的IRP。如果PD过滤器53处于中断状态,则在存储于队列81中的IRP中仅仅处理最高IRP优先级所提供的IRP,即,具有与所寄存的进程ID相同的进程ID的进程所请求的IRP。
因此,在AV应用程序33(图6)中,由进程75所加载的PD_API 41请求PD过滤器53寄存器进程75的进程ID。因此,当AV应用程序33记录或播放AV数据时,PD_API 41请求PD过滤器53处于中断状态。根据这样的安排,在PD过滤器53中,为PD_API 41的进程75所请求的IRP设置最高的IRP优先级,同时只有最高IRP优先级提供的IRP,即,只是PD_API 41的进程75所请求的IRP,能被处理和输出给PD_FS 54。
因此,只处理PD_API 41的进程75所请求的IRP。这样,就不需要AV应用程序33等待直到关于来自应用程序31或32的IRP处理完成或由应用程序31或32的IRP的进程在驱动器2上产生一个寻址请求。从而,能阻止AV应用程序33从光盘3读取数据或向光盘3写入数据的中断,因此,AV数据能实时地将AV数据记录在光盘3上或从光盘3上播放。
根据第一功能,如果PD_API 41的进程75所请求的IRP没有存储在队列81中,则应用程序31和32的IRP可能从PD过滤器53输出到PD_FS 54。相反地,根据第二功能,如果PD过滤器53设置为中断状态,则即便当PD_API41的进程75所请求的IRP没有存储在队列81中,应用程序31和32的IRP也不会从PD过滤器53输出到PD_FS 54。
在图15和16的流程图中,在PD过滤器53处于中断状态时,只有最高IRP优先级所提供的IRP作为特定的IRP输出给PD_FS 54。可选地,只有具有与所寄存的进程ID一致的进程ID的IRP才可以作为特定的IRP输出到PD_FS 54。即,在PD过滤器53中,只有与所寄存的进程ID相同的IRP才可以输出到PD_FS 54而无需设置IRP优先级。
用于可靠而实时地读取和写入AV数据的PD第三功能将在过滤器53的以下描述。
更具体地,根据第三功能,PD过滤器53具有一个一个用来打开或关闭除了AV应用程序33外,即,来自应用程序31和32,的应用程序的IRP的输出到PD_FS 54的功能开关,从而阻止应用程序31或32的IRP输出到PD_FS54。通过使用该功能,PD过滤器53向PD_FS 54只输出AV应用程序33的IRP而不输出应用程序31或32的IRP,从而确保了AV应用程序33能实时地读取和写入AV数据。
图17示出了执行上述第三功能的PD过滤器53的结构实例。
在图17中,PD过滤器53的过滤器内核53A具有一个用来打开或关闭应用程序31或32的IRP向PD_FS 54输出的开关101。
当OS 30运行或当光盘3安置在驱动器2中时,开关101根据存储在寄存器58中的开关设置信息打开或关闭。在相应于驱动器2的卷安置好后很难改变开关101的状态。
当AV应用程序33安装时开关设置信息存储在寄存器58中。也就是说,当安装AV应用程序33时,引导用户来选择是否将开关101打开或关闭。用户所选择的开关101的状态存储在寄存器58中作为开关设置信息。存储在寄存器58中的开关设置信息可以在安装AV应用程序33之后为AV应用程序33在选择屏幕上进行改变。
当打开开关101时,PD过滤器53向PD_FS 54输出所有的应用程序(图17中的应用程序31到33)的IRP。
当开关101关闭时,PD过滤器53只从AV应用程序33的PD_API 41输出IRP,并对其它的应用程序31和32屏相应于蔽安置在驱动器2中的光盘3的卷上的文件系统,从而阻止应用程序31或32的IRP输出到PD_FS 54。
在这种情况下,为了响应除了PD_API 41外其它进程来的IRP,开关101返回状态值,其表示虽然卷已安置好,但仅仅能读取而在卷中并无文件或目录。
根据这样的结构,当开关101关闭时,安置在驱动器2中的光盘3作为不提供文件或目录的卷来处理因此很难停止,拒绝,或格式化Windows浏览器上的文件。
现参考图18的流程图描述使用第三功能的在图17中示出的PD过滤器53所进行的处理。
当OS 30开始或当光盘3安置在驱动器2中时,在步骤S191中,过滤器内核53A从寄存器58获取开关设置信息。
在步骤S192中,过滤器内核53A根据开关设置信息打开或关闭开关101。
过滤器内核53A接着等待应用程序31到33之一的一个IRP,并在步骤S193中接收该IRP。
在步骤S194中,过滤器内核53A确定在步骤S193中接收的IRP是否是AV应用程序33的PD_API 41的一个IRP。如果在S194中确定在步骤S193中接收到的IRP是来自AV应用程序33的IRP,则进程转到步骤S195。在步骤S195中,过滤器内核53A输出该IRP给PD_FS 54并等待来自应用程序31到33之一中的另一个IRP。接着进程转到步骤S193。
如果在S194中确定在步骤S913中接收到的IRP不是来自AV应用程序33的IRP,即,在步骤S193中接收到的IRP来自于应用程序31或32,则进程转到步骤S196以确定开关101是否关闭。
如果在步骤S196中确定开关101不是关闭的,即,开关101是打开的,则进程转到步骤S195。在步骤S195中,过滤器内核53A输出在步骤S193中接收到的IRP给PD_FS 54并等待另一个来自于应用程序31到33之一的IRP。接着进程转到步骤S193。
如果在步骤S196中确定开关101是关闭的,则进程转到步骤S197。在步骤S197中,开关101返回一个文件系统的匿名回复,在其中文件系统是匿名的,即,对应用程序31或32来说表示虽然安装了卷,但在读取时无无文件或目录的状态,其是在步骤S193中接收到的IRP的输出源。接着开关101等待另一个来自于应用程序31到33之一的IRP。接着进程转到步骤S193,此时进程做类似地重复。
如上所述,在PD过滤器53中,当开关101关闭时,只有应用程序33的IRP输出到PD_FS 54。这样,就不必让AV应用程序33一直等到关于应用程序31或32的IRP处理完成或由应用程序31或32的IRP的进程在驱动器2上产生一个寻址请求。因此,能阻止AV应用程序33从光盘3读取数据或向光盘3写入数据的中断,因此,AV数据能实时地将AV数据记录在光盘3上或从光盘3上播放。
在步骤S194中关于是否IRP是AV应用程序33的IRP的确定可以预先通过将进程75的进程ID寄存在PD过滤器53中以及确定该IRP的进程ID是否与所寄存的进程ID一致而进行确定。
在上述描述的实施例中,第一到第三功都能在PD过滤器53中执行。但其也可以在PD_FS 54中执行。
PD_FS 54(图4)执行为使用用于由IRP从PD过滤器53请求的数据的NT高速缓存管理器59的高速缓存功能而请求的高速缓存处理,如图5中的步骤S4所论述的。
如果来自PD过滤器53的IRP所请求的数据高速缓存在NT高速缓存管理器59中,则其从PD_FS 54返回到PD过滤器53。如果来自PD过滤器53的IRP所请求的数据没有高速缓存在NT高速缓存管理器59中,则其从PD_FS 54输出到PD存储器55。
因此,如由果IRP所请求的数据高速缓存在NT高速缓存管理器59中,则该高速缓存进程会产生一个额外的开销,即,通过执行该高速缓存进程的例程,由CPU 12(图2)将其与PC 1对照而无需高速缓存功能。
该开销延迟了从PD_FS 54到PD存储器55的IRP的输出,这进一步阻止了实时地记录或播放AV数据。因此需要在从AV应用程序33输出IRP时不产生延迟。
这样的延迟可以通过不使用高速缓存功能而阻止。
如果根本不使用高速缓存功能,则来自PD过滤器53的所有IRP都会从PD_FS 54输出到PD存储器55。即,来自应用程序31到33来的所有IRP都会通过PD_FS 54从PD过滤器53输出到PD存储器55。
更具体地,在这种情况下,不仅是来自AV应用程序33的IRP,而且来自AV应用程序33之外其它应用程序,即,来自应用程序31和32的IRP也会通过PD_FS 54从PD过滤器53输出到PD存储器55。这样,就会由于读取由应用程序31或32所请求的数据而产生一个寻址。
该寻址的产生妨碍了实时读取来自AV应用程序33的IRP的AV数据。
当使用高速缓存功能时,如果来自应用程序31或32的IRP所请求的数据高速缓存在NT高速缓存管理器59中,则所高速缓存的数据从PD_FS 54返回到PD过滤器53。在这种情况下,能阻止由从光盘3读取来自应用程序31或32的IRP所请求的数据在驱动器2上所产生的寻址。
这样,在AV应用程序33中,由执行高速缓存处理而产生的延迟能通过不使用高速缓存功能而防止。结果,能更好地实时记录或播放AV数据。
相反地,在除了AV应用程序33外的应用程序31和32中,由于使用了高速缓存功能而导致了在驱动器2中的寻址的减少。结果,也能提高实时地记录或播放AV数据。
因此,在PD过滤器53中,来自应用程序31和32的IRP通过使用高速缓存功能而处理。另一方面,对于来自AV应用程序33的IRP,执行用于设置是否使用高速缓存功能的高速缓存器ON/OFF功能以便来自AV应用程序33的IRP能根据高速缓存功能的设置值来进行处理。
图19图示了执行该高速缓存器ON/OFF功能的PD过滤器53的结构的一个实例。
该高速缓存器ON/OFF功能仅仅提供给AV应用程序33,其加载PD_API 41,并且应用程序31和32总是使用该高速缓存功能。即,该高速缓存器ON/OFF功能与应用程序31和32相关。因此,图19中仅仅示出了提供高速缓存器ON/OFF功能的AV应用程序33。
在图19中,PD过滤器53具有一个命令缓冲器111。该命令缓冲器111暂时存储来自AV应用程序33的PD_API 41中的IRP,即,从NT I/O管理器52输出IRP作为由PD_API 41调用API函数的结果。
在图19所示的PD过滤器53中,过滤器内核53A设置高速缓存功能是否由AV应用程序33的PD_API 41来使用,并根据所设置的结果处理来自存储在命令缓冲器111中的AV应用程序33中的IRP。
更具体地,如果使用高速缓存功能,则过滤器内核53A控制向PD_FS 54输出存储在命令缓冲器111中的AV应用程序33中的IRP以便在PD_FS 54中使用高速缓存功能。
如果没有使用高速缓存功能,则过滤器内核53A控制向PD_FS 54输出来自存储在命令缓冲器111中的AV应用程序33中的IRP以便IRP直接输出给PD存储器而无需使用在PD_FS 54中的高速缓存功能。
图20示出了当使用缓存器ON/OFF功能时用于让PD_API 41控制PD过滤器53的API函数。该API函数被输出到AV应用程序33。
在图20中,API函数包括四个函数,即,PdOpenFile()、PdcloseFile()、PdReadFile(),和PdWriteFile()。
以上所述的四个函数都是用来执行文件处理的文件流API函数。API函数与在Win32子系统51中所提供的那四个函数类似。
也就是说,PD_API 41分别把由Win32子系统51所提供的文件流API函数提供给了唯一的文件流API函数,例如PdOpenFile()、PdCloseFile()、PdReadFile(),和PdWriteFile()。
API函数PdOpenFile()为一个表示打开文件请求的API函数,它使用作为参数的要打开的文件的文件名(包括路径名),文件打开时的打开模式(例如,只读模式),以及表示是否使用高速缓存功能的高速缓存信息作为参数。
通过指定作为参数的文件名,打开模式,以及高速缓存信息调用API函数PdOpenFile(),可以以由参数所指定的打开模式打开由参数指定的文件名的文件。此外,API函数PdOpenFile()允许PD过滤器53的过滤器内核53A根据作为参数的高速缓存信息而设置是否使用高速缓存功能。在API函数PdOpenFile()中,当成功打开文件时,打开的文件的文件句柄作为返回值而返回,而当打开文件失败时,将0xffffffff作为返回值返回。0x表示以后的值为十六进制。
API函数PdCloseFile()为表示关闭文件请求的API函数,它使用要关闭的文件的文件句柄作为参数。通过指定作为参数的要关闭的文件的句柄而调用API函数PdCloseFile(),可以关闭由文件句柄所指定的文件。在API函数PdCloseFile()中,当成功关闭文件时,将返回1作为返回值,而当关闭文件失败时,返回0作为返回值。
API函数PdReadFile()为表示从一个文件读取数据的请求的API函数,它使用要从其中读取数据的文件的文件句柄、指向暂时存储从文件中读出的数据的缓冲器的缓冲器指针,以及表示从文件中读取的数据的尺寸的字节数作为参数。通过指定作为参数的文件句柄、缓冲器指针,和字节数而调用API函数PdReadFile(),能读取由文件句柄所指定的文件的所指定的字节数的数据并将其存储在由缓冲器指针所指向的存储区域中。在API函数PdReadFile()中,当成功读取数据时,将读取的数据的字节数作为返回值返回,当读取数据失败时,将0作为返回值返回。API函数PdReadFile()响应Win32子系统51所提供的API函数PdReadFile()。
API函数PdWriteFile()是表示将数据写入到一个文件中的请求的API函数,它使用将要写入数据的文件的文件句柄、指向用于暂时存储要写入文件的数据的缓冲器的缓冲器指针,以及表示要写入文件的数据的尺寸的字节数作为参数。通过通过指定作为参数的文件句柄、缓冲器指针,和字节数而调用API函数PdWriteFile(),能写入由文件句柄所指定的文件的所指定的字节数的数据并将其存储在由缓冲器指针所指向的存储区域中。在API函数PdWriteFile()中,当成功读取数据时,将读取的数据的字节数作为返回值返回,当读取数据失败时,将0作为返回值返回。API函数PdWriteFile()响应Win32子系统51所提供的API函数PdWriteFile()。
当调用API函数PdOpenFile()、PdCloseFile()、PdReadFile(),或PdWriteFile()时,PD_API 41调用相应的由Win32子系统51所提供的API函数DeviceIoControl()。
接着,Win32子系统51输出一个请求给NT I/O管理器52来响应API函数DeviceIoControl(),而NT I/O管理器52将该请求转换成IRP_MJ_DEVICE_CONTROL IRP并将其提供给PD过滤器53。
如上所示,在IRP_MJ_DEVICE_CONTROL中,IOCTL由用户定义的子码而指定。
图21图示了当调用PdOpenFile()、PdCloseFile()、PdReadFile(),和PdWriteFile()时,由IRP_MJ_DEVICE_CONTROL所指定的用户所定义的IOCTL。
在图21中,四个IOCTL(子码)即,图20所示的分别相应于API函数的PdOpenFile()、PdCloseFile()、PdReadFile(),和PdWriteFile()的IOCTL_PD_OPEN_FILE、IOCTL_PD_CLOSE_FILE、IOCTL_PD_READ_FILE,和IOCTL_PD_WRITE_FILE都可以作为用户定义的IOCTL。
IOCTL_PD_OPEN_FILE为IOCTL,其是一个与响应API函数PdOpenFile()而调用的请求打开一个文件的API函数DeviceIoControl()相关联的IRP_MJ_DEVICE_CONTROL IRP的子码。
IOCTL_PD_CLOSE_FILE为IOCTL,其是一个与响应API函数PdCloseFile()而调用的请求关闭一个文件的API函数DeviceIoControl()相关联的IRP_MJ_DEVICE_CONTROL IRP的子码。
IOCTL_PD_READ_FILE为IOCTL,其是一个与响应API函数PdReadFile()而调用的请求读取一个文件的API函数DeviceIoControl()相关联的IRP_MJ_DEVICE_CONTROL IRP的子码。
IOCTL_PD_WRITE_FILE为IOCTL,其是一个与响应API函数PdWriteFile()而调用的请求将数据写入一个文件的API函数DeviceIoControl()相关联的IRP_MJ_DEVICE_CONTROL IRP的子码。
如上所描述的,用户所定义的IRP_MJ_DEVICE_CONTROL IRP的子码IOCTL,通过使用由Win32子系统51所提供的API函数DeviceIoControl()而发送到NT I/O管理器52并由NT I/O管理器52指定为IRP_MJ_DEVICE_CONTROL IRP的子码。
在过滤器53执行高速缓存器ON/OFF功能时,AV应用程序33的全部进程,图19所示的PD_API 41、PD过滤器53,以及PD_FS 54将在以下参考图22的流程图进行描述。
如果不使用高速缓存功能而执行从光盘3读取AV数据或将AV数据写入光盘3,则在步骤S201中,AV应用程序33调用请求通过使用表示高速缓存功能不用做参数的高速缓存信息(高速缓存关闭)而打开文件的API函数PdOpenFile()。
在步骤S211中,PD_API 41接收从AV应用程序33对API函数PdOpenFile()的调用。接着,在步骤S212中,为响应对API函数PdOpenFile()的调用,PD_API 41调用请求打开文件的API函数DeviceIoControl()。随后,NT I/O管理器52提供具有指定为请求PD过滤器53打开一个文件的IOCTL的IOCTL_PD_OPEN_FILE的IRP_MJ_DEVICE_CONTROL IRP。在这种情况下,IOCTL_PD_OPEN_FILE包含表示不使用高速缓存功能的高速缓存信息。
在步骤S221中,PD过滤器53从NT I/O管理器52接收IRP并将高速缓存标志重置为0以表示根据IRP的IOCTL_PD_OPEN_FILE没有使用高速缓存功能。因此,在AV应用程序33中通过指定为参数的高速缓存信息(高速缓存关闭)而请求打开的文件不需要使用高速缓存功能(高速缓存关闭状态)就可以处理。
在高速缓存关闭的状态中,为分别响应PD_API 41对PdOpenFile()、PdcloseFile()、PdReadFile(),和PdWriteFile()的,PD过滤器调用53直接输出给PD_FS 54与API函数DeviceIoControl()相关联的具有指定为IOCTL的IOCTL_PD_OPEN_FILE,IOCTL_PD_CLOSE_FILE,IOCTL_PD_READ_FILE,和IOCTL_PD_WRITE_FILE的IRP_MJ_DEVICE_CONTROLIRP。因此,PD过滤器53控制PD_API 41的IRP的输出以便PD_API 41的IRP所请求的数据能不使用高速缓存功能函数而被读出或写入。
也就是说,在步骤S221中,在设置高速缓存关闭状态之后,PD过滤器53直接输出从NT I/O管理器52所接收的具有作为IOCTL的IOCTL_PD_OPEN_FILE的IRP_MJ_DEVICE_CONTROL IRP给PD_FS 54。
在步骤S231中,PD_FS 54从PD过滤器53接收具有IOCTL_PD_OPEN_FILE的IRP_MJ_DEVICE_CONTROL IRP并将其输出给PD存储器55。接着,打开光盘3上的文件。
随后,如果,在步骤S202中,AV应用程序33调用作为访问光盘3的请求的请求打开或写入一个文件(文件流)的API函数PdReadFile()和PdWriteFile(),则在步骤S213中PD_API 41接收对API函数PdReadFile()和PdWriteFile()的调用。
在步骤S214中,为分别响应来自AV应用程序33的API函数PdReadFile()和PdWriteFile(),PD_API 41调用请求读取或写入一个文件的API函数DeviceIoControl()以便将具有指定为请求读取文件的IOCTL的IOCTL_PD_READ_FILE的IRP_MJ_DEVICE_CONTROL IRP或具有指定为请求写入文件的IOCTL的IOCTL_PD_WRITE_FILE的IRP_MJ_DEVICE_CONTROL IRP从NT I/O管理器52提供到PD过滤器53。
在步骤S223中,PD过滤器53从NT I/O管理器52接收IRP_MJ_DEVICE_CONTROL IRP。在步骤S224中,PD过滤器53将IRP_MJ_DEVICE_CONTROL IRP输出到PD_FS 54。
如上所述,处于高速缓存关闭状态的PD过滤器53直接将IRP_MJ_DEVICE_CONTROL IRP从PD_API 41输出到PD_FS 54。
因此,在该情况下,在步骤S224中,PD过滤器53直接输出具有指定为请求读取文件的IOCTL的IOCTL_PD_READ_FILE的IRP_MJ_DEVICE_CONTROLIRP或具有指定为请求写入文件的IOCTL的IOCTL_PD_WRITE_FILE的IRP_MJ_DEVICE_CONTROL IRP给PD_FS 54。
在步骤S232中,PD_FS 54从PD过滤器53接收IRP_MJ_DEVICE_CONTROLIRP。
为响应调用由Win32子系统51所提供的API函数PdReadFile()和PdWriteFile(),PD_FS 54将NT高速缓存管理器59的高速缓存功能提供给从NT I/O管理器52输出到PD过滤器53的IRP_MJ_READ IRP或IRP_MJ_WRITEIRP。相反地,PD_FS 54并不给IRP_MJ_DEVICE_CONTROL IRP提供高速缓存功能。
因此,在步骤S232中,PD_FS 54直接将IRP_MJ_DEVICE_CONTROL IRP从PD过滤器53输出到PD存储器55。也就是说,不使用高速缓存功能。
随后,如果,在步骤S203中,AV应用程序33调用请求关闭在步骤S201中打开的文件的API函数PdCloseFile(),PD_API 41接收在步骤S215中由AV应用程序33所调用的API函数PdCloseFile()。接着,在步骤S216中,为响应对API函数PdCloseFile()的调用,PD_API 41调用请求文件关闭的API函数DeviceIoControl()以便将具有指定为请求关闭文件的IOCTL的IOCTL_PD_CLOSE_FILE的IRP_MJ_DEVICE_CONTROL IRP从NT I/O管理器52提供给PD过滤器53。
在步骤S225中,PD过滤器53从NT I/O管理器52接收IRP。在步骤S226中,PD过滤器53直接将IRP输出给PD_FS 54。
在步骤S233中,PD_FS 54从PD过滤器53接收具有指定为IOCTL的IOCTL_PD_CLOSE_FILE的IRP_MJ_DEVICE_CONTROL IRP,并将其输出给PD存储器55。接着,关闭光盘3上的文件。
另一方面,如果在步骤S241中,使用高速缓存功能来执行从光盘3读取AV数据或将AV数据写入到光盘3,则AV应用程序33调用请求通过使用表示将高速缓存功能用作参数的高速缓存信息(高速缓存开启)而打开文件的API函数PdOpenFile()。
在步骤S251中,PD_API 41接收由AV应用程序33对API函数PdOpenFile()的调用。接着,在步骤S252中,为响应对API函数PdOpenFile()的调用PD_API 41调用请求打开文件的API函数DeviceIoControl()以便将具有指定为请求PD过滤器53打开一个文件的IOCTL的IOCTL_PD_OPEN_FILE的IRP_MJ_DEVICE_CONTROL IRP从NT I/O管理器52提供到PD过滤器53。在这种情况下,IOCTL_PD_OPEN_FILE包含表示使用高速缓存功能的高速缓存信息。
在步骤S261中,PD过滤器53从NT I/O管理器52接收IRP并将高速缓存标志置为1以表示根据IRP的IOCTL_PD_OPEN_FILE使用高速缓存功能。因此,在AV应用程序33中通过将高速缓存信息(高速缓存开启)指定为参数而请求打开的文件使用高速缓存功能(高速缓存开启状态)就可以处理。
在高速缓存开启的状态下,PD过滤器53控制由PD_API 41的IRP所请求的数据来通过使用高速缓存功能读取或写入。
也就是说,在步骤S261中,设置高速缓存开启状态后,PD过滤器53将从NT I/O管理器52所接收的具有指定作为IOCTL的IOCTL_PD_OPEN_FILE的IRP_MJ_DEVICE_CONTROL IRP输出给PD_FS 54。
在步骤S271中,PD_FS 54接收具有指定作为IOCTL的IOCTL_PD_OPEN_FILE的IRP_MJ_DEVICE_CONTROL IRP并将其输出给PD存储器55。接着,打开光盘3上的文件。
随后,如果,在步骤S242中,AV应用程序33调用作为访问光盘3的请求的请求打开或写入一个文件)的API函数PdReadFile()和PdWriteFile(),则在步骤S253中PD_API 41接收对API函数PdReadFile()和PdWriteFile()的调用。
在步骤S254中,为分别响应来自AV应用程序33的对API函数PdReadFile()和PdWriteFile()的调用,PD_API 41调用请求读取或写入一个文件的API函数DeviceIoControl()以便将具有指定为请求读取文件的IOCTL的IOCTL_PD_READ_FILE的IRP_MJ_DEVICE_CONTROL IRP或具有指定为请求写入文件的IOCTL的IOCTL_PD_WRITE_FILE的IRP_MJ_DEVICE_CONTROLIRP从NT I/O管理器52提供到PD过滤器53。
在步骤S263中,PD过滤器53从NT I/O管理器52接收IRP_MJ_DEVICE_CONTROL IRP。在步骤S264中,PD过滤器53将IRP_MJ_DEVICE_CONTROL IRP输出到PD_FS 54。
在这种情况下,在高速缓存开启状态下的PD过滤器53转换具有IOCTL_PD_READ_FILE的IRP_MJ_DEVICE_CONTROL IRP或具有IOCTL_PD_WRITE_FILE的IRP_MJ_DEVICE_CONTROL IRP,并将该转换的IRP输出给PD_FS 54。
在步骤S264中,为响应对请求读取由Win32子系统51所提供的文件的API函数ReadFile()的调用,具有IOCTL_PD_READ_FILE的IRP_MJ_DEVICE_CONTROL IRP被转换成从NT I/O管理器52输出到PD过滤器53的IRP_MJ__READ。该IRP_MJ__READ接着输出到PD_FS 54。
为响应对请求写入由Win32子系统51所提供的文件的API函数WriteFile()的调用,具有IOCTL_PD_WRITE_FILE的IRP_MJ_DEVICE_CONTROLIRP被转换成从NT I/O管理器52输出到PD过滤器53的IRP_MJ_WRITE。该IRP_MJ_WRITE接着输出到PD_FS 54。
在步骤S272中,PD_FS 54从PD过滤器53接收的IRP_MJ_READ或IRP_MJ_WRITE。
如以上所述,PD_FS 54通过NT高速缓存管理器59提供高速缓存功能给IOCTL_MJ_READ或IOCTL_MJ_WRITE。
在步骤S272中,PD_FS 54通过使用高速缓存功能读取或写入由从PD过滤器53所接收的IRP_MJ_READ或IRP_MJ_WRITE。
更具体地,如果来自从PD过滤器53的IRP_MJ_READ IRP所请求读取的数据高速缓存在NT高速缓存管理器59中,则PD_FS 54返回所高速缓存的数据给PD过滤器53作为响应。如果由IRP_MJ_READ IRP所请求的数据没有高速缓存在NT高速缓存管理器59中,则PD_FS 54从PD过滤器53将IRP_MJ_READIRP输出到PD存储器55。
随后,如果在步骤S243中,AV应用程序33调用了请求关闭在步骤S241中打开的文件的API函数PdCloseFile(),则PD_API 41在步骤S255中接收来自AV应用程序33对API函数PdCloseFile()的调用。接着,在步骤S256中,为响应对API函数PdCloseFile()的调用PD_API 41调用请求关闭文件的API函数DeviceIoControl()以便将请求文件关闭的具有IOCTL_PD_CLOSE_FILE的IRP_MJ_DEVICE_CONTROL IRP从NT I/O管理器52提供到PD过滤器53。
在步骤S265中,PD过滤器53接收来自NT I/O管理器52的IRP。在步骤S266中,PD过滤器53输出IRP给PD_FS 54。
在步骤S273中,PD_FS 54从PD过滤器53接收具有IOCTL_PD_CLOSE_FILE的IRP_MJ_DEVICE_CONTROL IRP,并将其输出给PD过滤器55。这样,将关闭光盘3上的文件。
根据例如可以是PC 1或驱动器2的性能(例如,CPU 12的时钟频率或驱动器2最差寻址时间)或用户的操作,可以确定是否使用了高速缓存功能,这在用作调用请求打开一个文件的API函数PdOpenFile()的参数的高速缓存信息中表明了。
图19所示的通过使用高速缓存器ON/OFF功能而由PD过滤器53执行的进程将在以下参考图23的流程图进行描述。
为了响应应用程序31到33的进程71到75中的一个对表示请求执行对驱动器2涉及I/O的进程的请求的API函数的调用,NT I/O管理器52将相应于该API函数的IRP提供给PD过滤器53。
在该实施例中,由应用程序31到33所调用的API函数(包括PD_API 41)包括由Win32子系统51所提供的API函数和由PD_API 41所提供的API函数。
为响应对由Win32子系统51所提供的API函数的调用,Win32子系统51输出一个相应于该API函数的请求给NT I/O管理器52,同时NT I/O管理器52将相应于该API函数的IRP提供给PD过滤器53。为响应对由PD_API 41所提供的API函数的调用,PD_API 41调用相应的API函数DeviceIoControl()。接着,为响应API函数DeviceIoControl(),Win32子系统51输出一个请求给NT I/O管理器52,同时NT I/O管理器52将相应的IRP提供给PD过滤器53。
因此,无论由应用程序31到33中的一个所调用的API函数是否是由Win32子系统51所提供的API函数还是由PD_API 41所提供的API函数,相应于该API函数的IRP都最终从NT I/O管理器52提供给PD过滤器53。
在步骤S301中,PD过滤器53接收NT I/O管理器52所提供的IRP并将其存储在命令缓冲器111中。接着,在步骤S302中,过滤器内核53A确定在步骤S301中存储在命令缓冲器111中的IRP是否是具有指定为IOCTL的IOCTL_PD_OPEN_FILE的IRP_MJ_DEVICE_CONTROL IRP。
如上所述,IOCTL_PD_OPEN_FILE包含了高速缓存信息。
如果在步骤S302中确定存储在命令缓冲器111中的IRP为具有指定为IOCTL的IOCTL_PD_OPEN_FILE的IRP,则进程转到步骤S303以确定在IOCTL_PD_OPEN_FILE中由IRP所指定的的高速缓存信息是否表示使用了高速缓存功能。
如果在步骤S303中确定高速缓存信息表示使用了高速缓存功能,则进程转到步骤S3O4。在步骤S304中,过滤器内核53A设置为变量的高速缓存标志为1,以表示使用了高速缓存信息(高速缓存开启状态)。
如果在步骤S303中确定表示没有使用高速缓存功能的高速缓存信息,则进程转到步骤S305。在步骤S305中,过滤器内核53A设置高速缓存标志为0以表示没有使用高速缓存信息(高速缓存关闭状态)。
在步骤S306中,过滤器内核53A输出存储在命令缓冲器111中的具有IOCTL_PD_OPEN_FILE的IRP给PD_FS 54并等待另一个IRP。进程接着返回步骤S301。
在这种情况下,PD_FS 54接收来自过滤器内核53A的IRP并将其输出到PD存储器55。接着,打开文件。
如果在步骤S302中确定存储在命令缓冲器111中的IRP不是具有指定为IOCTL的IOCTL_PD_OPEN_FILE的IRP,则进程转到步骤S307以确定存储在命令缓冲器111中的IRP是否是请求关闭一个文件的具有指定为IOCTL的IOCTL_PD_CLOSE_FILE的IRP_MJ_DEVICE_CONTROL IRP。
如果在步骤S307中确定存储在命令缓冲器111中的IRP为具有IOCTL_PD_CLOSE_FILE的IRP,则进程转到S308。在步骤S308中,过滤器内核53A输出具有IOCTL_PD_CLOSE_FILE的IRP给PD_FS 54并等待另一个IRP。接着进程返回步骤S301。
在这种情况下,PD_FS 54接收具有IOCTL_PD_CLOSE_FILE的IRP并将其输出到PD存储器55。接着,关闭文件。
如果在步骤S307中确定存储在命令缓冲器111中的IRP不是具有IOCTL_PD_CLOSE_FILE的IRP,则进程转到S309以确定存储在命令缓冲器111中的IRP_MJ_DEVICE_CONTROL IRP是否是具有IOCTL_PD_READ_FILE的IRP_MJ_DEVICE_CONTROL IRP或具有IOCTL_PD_WRITE_FILE的IRP_MJ_DEVICE_CONTROL IRP。
如果在步骤S309中确定存储在命令缓冲器111中的IRP不是具有IOCTL_PD_READ_FILE的IRP_MJ_DEVICE_CONTROL IRP或具有IOCTL_PD_WRITE_FILE的IRP_MJ_DEVICE_CONTROL IRP,则进程转到步骤S310。在步骤S310中,过滤器内核53A输出存储在命令缓冲器111中的IRP给PD_FS54并等待另一个IRP。接着进程返回步骤S301。
如果在步骤S309中确定存储在命令缓冲器111中的IRP为具有IOCTL_PD_READ_FILE或IOCTL_PD_WRITE_FILE的IRP,则进程转到步骤S311以确定高速缓存标志是否为1。
如果在步骤S311中确定高速缓存标志为1,即,PD过滤器53的过滤器内核53A处于高速缓存开启状态,则进程转到步骤S312。在步骤S312中,过滤器内核53A转换存储在命令缓冲器111中的IRP。
也就是说,在这种情况下,存储在命令缓冲器111中的IRP为请求读取一个文件的具有指定为IOCTL的IOCTL_PD_READ_FILE的IRP_MJ_DEVICE_CONTROL IRP或请求写入一个文件的具有指定为IOCTL的IOCTL_PD_WRITE_FILE的IRP_MJ_DEVICE_CONTROL IRP。
如果存储在命令缓冲器111中的IRP为请求读取文件的具有指定为IOCTL的IOCTL_PD_READ_FILE的IRP_MJ_DEVICE_CONTROL IRP,则在步骤S312中,为响应由Win32子系统51所提供的对API函数ReadFile()的调用,过滤器内核53A将IRP_MJ_DEVICE_CONTROL IRP转换为从NT I/O管理器52输出到PD过滤器53的IRP_MJ_READ IRP。
如果存储在命令缓冲器111中的IRP为具有指定为IOCTL的IOCTL_PD_WRITE_FILE的IRP_MJ_DEVICE_CONTROL IRP,则在步骤S312中,为响应由Win32子系统51所提供的对API函数WriteFile()的调用,过滤器内核53A将IRP_MJ_DEVICE_CONTROL IRP转换为从NT I/O管理器52输出到PD过滤器53的IRP_MJ_WRITE IRP。
接着,在步骤S313中,过滤器内核53A将在步骤S312中所转换的IRP,即,IRP_MJ_READ或IRP_MJ_WRITE,输出给PD_FS 54,并等待另一个IRP。接着进程返回到步骤S301。
在这种情况下,PD_FS 54接收来自过滤器内核53A的IRP_MJ_READ或IRP_MJ_WRITE,并使用高速缓存功能来读取或写入由IRP所请求的数据。
如上所述,PD_FS 54通过NT高速缓存管理器59将高速缓存功能提供给IRP_MJ_READ或IRP_MJ_WRITE。
因此,如果从过滤器内核53A接收到的IRP为IRP_MJ_READ,则PD_FS 54核对IRP请求读取的数据是否高速缓存在NT高速缓存管理器59中。如果该数据高速缓存在NT高速缓存管理器59中,则PD_FS 54返回该高速缓存的数据给PD过滤器53作为响应。如果IRP_MJ_READ所请求的数据没有高速缓存在NT高速缓存管理器59中,则PD_FS 54将IRP_MJ_READ IRP输出给PD存储器55。
PD存储器55包括用来读取或写入数据的读/写缓冲器(未示出)。该读/写缓冲器的尺寸等于所使用的分页的尺寸,例如4KB,而可以一次读取或写入的数据的最大量由该读/写缓冲器的尺寸所限定。
因此,如果由来自过滤器内核53A的IRP_MJ_READ所请求读取的数据的尺寸超出了该读/写缓冲器的尺寸,则PD_FS 54将IRP_MJ_READ IRP分成多个具有读/写缓冲器尺寸的请求读取的数据的IRP_MJ_READ IRP,并将这些IRP输出到PD存储器55。将相同的提供给来自过滤器内核53A的IRP_MJ_WRITE。
如果在步骤S311中确定高速缓存标志不是1,即,高速缓存标志为0并且PD过滤器53的过滤器内核53A处于高速缓存关闭状态,则进程转到步骤S314。在步骤S314中,过滤器内核53A直接输出给PD_FS 54存储在命令缓冲器111中的IRP,即,请求读取文件的具有IOCTL_PD_READ_FILE的IRP_MJ_DEVICE_CONTROL IRP或请求写入文件的具有IOCTL_PD_WRITE_FILE的IRP_MJ_DEVICE_CONTROL IRP,并等待另一个IRP。随后进程转到步骤S301。
在这种情况下,PD_FS 54接收具有IOCTL_PD_READ_FILE或IOCTL_PD_WRITE_FILE的IRP_MJ_DEVICE_CONTROL IRP,并立即将该IRP输出到PD存储器55而无需使用高速缓存功能。
如以上所述,一次读取或写入的最大数据量通过PD存储器55的读/写高速缓存的尺寸而限定。
因此,如果在步骤S314中要输出给PD_FS 54的由IRP_MJ_DEVICE_CONTROL IRP所请求的要读取或写入的数据量超出了读/写高速缓存的尺寸,则过滤器内核53A将IRP_MJ_DEVICE_CONTROL IRP分成多个请求具有读/写高速缓存尺寸的将要读取或写入的数据的IRP_MJ_DEVICE_CONTROL IRP,并将这些IRP输出给PD_FS 54。
可以选择是否高速缓存功能仅仅为具有用户所定义的图21所示的IOCTL码的IRP_MJ_DEVICE_CONTROL IRP而由高速缓存器ON/OFF功能使用。为响应图20所示的对仅仅由PD_API 41所提供的API函数的调用,该具有IOCTL的IRP从NT I/O管理器52输出到PD过滤器53。
因此,在该实施例中,能使用高速缓存器ON/OFF功能的应用程序限制AV应用程序33加载PD_API 41。
如果在AV应用程序33中没有使用高速缓存功能,则能阻止由于在IRP上的高速缓存处理的额外开销而导致的在处理AV应用程序33的IRP上的延迟,从而使得AV应用程序33实时记录或播放AV数据的操作得以提高。
另一方面,其它的应用程序31和32请求通过直接调用Win32子系统51所提供的API函数ReadFile()或WriteFile()来读取或写入数据。因此,应用程序31和32也总是使用高速缓存功能来读取或写入数据。
通过使用高速缓存功能,从应用程序31或32的IRP到PD存储器55或PD_FS 54的输出频率降低了。因此可能阻止由于应用程序31或32的IRP请求读取或写入数据而导致在驱动器2中寻址的发生。同时也可能阻止在应用程序31或32的IRP请求读取或写入数据之后由AV应用程序33的IRP请求读取或写入数据而导致的在驱动器2中的寻址。结果,使得AV应用程序33实时记录或播放AV数据的操作得以提高。
以上所述的第一到第三函数中的任一均可与高速缓存器ON/OFF功能合并。
图24示出了当第一和第二函数与高速缓存器ON/OFF功能合并时PD过滤器53的结构实例。
在图24中,通过使用第一函数,PD过滤器53能为表示来自应用程序31到33之一的访问光盘3的请求的IRP设置IRP优先级,并将该IRP优先级所提供的IRP存储在队列81中。接着,PD过滤器53根据为IRP所设置的IRP优先级读取存储在队列81中的IRP,并将该IRP输出给PD_FS 54。
可选地,通过使用第二函数,PD过滤器53设置暂停标志,该暂停标志标志表示请求访问光盘3的IRP进程是否被允许或是被禁止,同时PD过滤器53将来自应用程序31到33的IRP存储在队列81中。接着,PD过滤器53根据暂停标志读取存储在队列81中的IRP并将其输出给PD_FS 54。
此外,PD过滤器53设置AV应用程序33的IRP是否使用高速缓存功能,并且当输出IRP给PD_FS 54时,PD过滤器53根据以上的设置来处理IRP。
图25示出了当第三函数与高速缓存器ON/OFF功能合并时PD过滤器53的结构实例。
在图25中,通过使用第三函数,PD过滤器53具有用来功能性地打开或关闭向PD_FS 54输出除了AV应用程序33外的其它应用程序,即,应用程序31或32,的IRP的开关101,并且根据存储在寄存器58中的开关设置信息来打开或关闭开关101,从而控制输出给PD_FS 54的来自应用程序31和32的IRP。
此外,PD过滤器53设置AV应用程序33是否使用了高速缓存功能,并且当输出IRP给PD_FS 54时,PD过滤器53根据以上的设置来处理IRP。
如上所述,通过将第一到第三功能与高速缓存器ON/OFF功能合并,能阻止由应用程序31或32访问光盘3所导致的寻址,从而确保AV应用程序33实时地记录或播放AV数据的操作。
在以上所述实施例中,光盘3可以用做记录或播放数据的记录介质。但,也可以使用其它任何类型的记录介质,如硬盘或其它光盘状的能由记录或播放数据而产生寻址的记录介质。
在本说明书中,由各个步骤所形成的让PC 1执行各种类型进程的程序不需要按流程图所描述的顺序执行。它们可以并行或单独执行(例如,并行处理或对象处理)。
可以理解的是,本领域的技术人员可以在所附权利要求或其等同的范围内根据需要或其它的因素而对本发明作出各种修改、组合、近似组合,或选择。
权利要求
1.一种用于处理来自应用程序对记录介质进行访问的访问请求的信息处理装置,包括设置装置,用于设置专用于来自该应用程序的该访问请求的优先级或表示是否允许对来自该应用程序的访问请求进行处理的许可信息;队列控制装置,用于将被提供有优先级或许可信息的访问请求存储在队列中;和访问请求处理装置,用于根据优先级或许可信息处理存储在队列中的访问请求。
2.根据权利要求1的信息处理装置,其中,设置装置将来自一规定应用程序的访问请求的优先级设置得高于来自另一个应用程序的访问请求的优先级。
3.根据权利要求1的信息处理装置,其中,访问请求处理装置只有当许可信息表示允许对访问请求进行处理时,才连续处理来自规定应用程序的访问请求以及处理来自其它应用程序的访问请求。
4.根据权利要求1的信息处理装置,进一步包括高速缓存功能设置装置,用来设置是否使用高速缓存功能,其中,访问请求处理装置根据是否使用高速缓存功能而处理访问请求。
5.根据权利要求4的信息处理装置,其中,访问请求处理装置根据是否使用高速缓存功能而处理来自规定应用程序的访问请求。
6.根据权利要求1的信息处理装置,其中,信息处理装置是一个用来过滤访问请求以及将所过滤的访问请求传送到文件系统驱动器的过滤驱动器。
7.根据权利要求1的信息处理装置,其中,从记录介质读出或写入到记录介质的数据至少包括音频-视频数据。
8.根据权利要求1的信息处理装置,其中,在记录介质的记录区域中,在具有至少预定尺寸的连续空闲区域中,最接近于刚刚暂时记录数据的记录区域的空闲区域被保留同时数据存储在该保留的空闲区域中。
9.一种用于处理来自应用程序对记录介质进行访问的访问请求的信息处理方法,包括以下步骤设置专用于来自该应用程序的该访问请求的优先级或表示是否允许对来自该应用程序的访问请求进行处理的许可信息;将提供有优先级或许可信息的访问请求存储在队列中;和根据优先级或许可信息处理存储在队列中的访问请求。
10.一种用于处理来自应用程序对记录介质进行访问的访问请求的计算机可处理程序,包括以下步骤设置专用于来自该应用程序的该访问请求的优先级或表示是否允许对来自该应用程序的访问请求进行处理的许可信息;将提供有优先级或许可信息的访问请求存储在队列中;和根据优先级或许可信息处理存储在队列中的访问请求。
11.一种程序记录介质,在其上记录用于处理来自应用程序对记录介质进行访问的访问请求的程序,该程序包括以下步骤设置专用于来自该应用程序的该访问请求的优先级或表示是否允许对来自该应用程序的访问请求进行处理的许可信息;将提供有优先级或许可信息的访问请求存储在队列中;和根据优先级或许可信息处理存储在队列中的访问请求。
12.一种用于处理来自应用程序对记录介质进行访问的访问请求的信息处理装置,包括一个设置单元,用于设置专用于来自该应用程序的该访问请求的优先级或表示是否允许对来自该应用程序的访问请求进行处理的许可信息;一个队列控制器,用来将提供有优先级或许可信息的访问请求存储在队列中;和一个访问请求处理器,用来根据优先级或许可信息处理存储在队列中的访问请求。
全文摘要
本发明涉及一种用于处理从应用程序访问记录介质的访问请求的信息处理装置,其包括了以下部件设置单元,用于给来自应用程序的访问请求设置唯一的优先级或设置表示对来自应用程序的访问请求的处理是否被允许的许可信息;队列控制器,用来将提供有优先级或许可信息的访问请求存储在队列中;和访问请求处理器,用来根据优先级或许可信息处理存储在队列中的访问请求。
文档编号H04N5/91GK1734433SQ200510079300
公开日2006年2月15日 申请日期2005年4月15日 优先权日2004年4月15日
发明者木村真 申请人:索尼株式会社
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1