S.l.e!ep.¢%

像打了激速一样,以四倍的速度运转,开心的工作
简单、开放、平等的公司文化;尊重个性、自由与个人价值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

IFS Kit下关于FastIo的OSR文档翻译(2)

I/O管理器和Fast I/O

I/O管理器在必要的时候负责调用Fast I/O接口。Fast I/O调用返回TRUE或FALSE表示Fast I/O操作是否完成。如果Fast I/O没有被完成或无效,则会产生一个IPR并发送到上层驱动,但是FAST_IO_DISPATCH结构中最近的三个接口却不是这样的,它们为I/O管理员提供了不同的服务,接下来我们将讨论它们。

FastIoCheckIfPossible

这是在FAST_IO_DISPATCH结构中第一个调用的,仅被用来作为一般的文件系统库操作(以FsRtl开头的函数)。原型如下:
typedef BOOLEAN (*PFAST_IO_CHECK_IF_POSSIBLE)(
IN Struct _FILE_OBJECT *FileObject,
IN PLARGE_INTEGER FileOffset,
IN ULONG Length,
IN BOOLEAN Wait,
IN ULONG LockKey,
IN BOOLEAN CheckForReadOperation,
OUT PIO_STATUS_BLOCK IoStatus,
IN struct _DEVICE_OBJECT *DeviceObject
);
这个函数被FsRtl库中提供的通用的Fast I/O函数调用,仅用在读写操作中,以获取使用了通用文件缓存管理系统中的读和写是否能在文件缓存中被响应(由参数CheckForReadOperation的值决定)。注意,除了这个函数没有分配任何数据空间外其它参数和读写的Fast I/O接口参数相似。

FastIoRead and FastIoWrite

当对一个已经分配了有效数据缓存的文件进行读请求时,这个函数被I/O管理器调用。原型如下:
typedef BOOLEAN (*PFAST_IO_READ)(
IN struct _FILE_OBJECT *FileObject,
IN PLARGE_INTEGER FileOffset,
IN ULONG Length,
IN BOOLEAN Wait,
IN ULONG LockKey,
OUT PVOID Buffer,
OUT PIO_STATUS_BLOCK IoStatus,
IN struct _DEVICE_OBJECT *DeviceObject
);
正如前面所讲的,基本的调用参数和FastIoCheckIfPossible相似,就是多了一个必要的数据缓存参数。要保证所有Fast I/O调用接口的参数有效,例如上面的Buffer指针,必需是有效的并且在读线程的上下文中能使用此指针。

Fast I/O函数可以完成以下两件事情之一:第一,当操作完成时设置IoStatus的返回值并给I/O管理器返回TRUE,这时I/O管理器会完成对应的I/O操作。第二,直接返回FALSE给I/O管理器使其构造一个IRP从而调用标准的分派例程。

要注意的是返回TRUE并不能保证数据被传输了。例如,一个从文件结束处开始的读请求会设置IoStatus.Results为STATUS_END_OF_FILE,并且没有数据被复制。但是当一个读操作读到了文件的结尾,这时会将IoStatus.Results设置为STATUS_END_OF_FILE,返回TRUE,并且将读到的数据复制到Buffer里。

同样,返回FALSE并不能说明所有的数据没有被处理。例如,当然很少有这种可能,数据已经被成功处理了,但抛出一个I/O错误,或者内存不可访问。

以上任何一种情况出现都会导致不良影响。例如,从缓存读数据时,可能要读的数据并不在缓存中,这时会导致一个页错误,从而会请求文件系统来处理这个页面错误。

Fast I/O的写函数与读函数不同之处仅仅在于Buffer参数一个是输入型而不是输出型的,其它的基本操作很相似。当然,一些错误可能不同---介质已经满,需要分配新页等等。

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理