2024年6月10日发(作者:枚虹影)
这样,在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执行各种类型进程的程序不需要按流
程图所描述的顺序执行。它们可以并行或单独执行(例如,并行处理或对象处理)。
可以理解的是,本领域的技术人员可以在所附权利要求或其等同的范围内根据需要
或其它的因素而对本发明作出各种修改、组合、近似组合,或选择。
2024年6月10日发(作者:枚虹影)
这样,在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执行各种类型进程的程序不需要按流
程图所描述的顺序执行。它们可以并行或单独执行(例如,并行处理或对象处理)。
可以理解的是,本领域的技术人员可以在所附权利要求或其等同的范围内根据需要
或其它的因素而对本发明作出各种修改、组合、近似组合,或选择。