针对FastIoRead及FastIoWrite的实现,很多文件系统驱动都简单地调用系统提供的File System Runtime Routine: FsRtlCopyRead和FsRtlCopyWrite。
但这样做会有一个隐患,以Ext2Fsd来说,实际的文件大小是存储在inode.i_size中的,不是在FSRTL_COMMON_FCB_HEADER中(或FSRTL_ADVANCED_FCB_HEADER,前者超集)。Cache Manager内部只会处理FSRTL_COMMON_FCB_HEADER中的FileSize,从而导致Fcb中的FileSize和内部的inode.i_size大小不一致。这个 bug还是测试在EXT2卷上用DDK编译/build程序时发现的。
解决办法就是实现自己的FastIoWrite,如果写请求超出文件大小则拒绝此请求,然后走正常的IRP流程。其实,结合上篇blog: AdvanceOnly- FileEndOfFileInformation,还有另外一种方案,即在处理FileEndOfFileInformation w/ AdvanceOnly 时来更新内部的inode.i_size至最新大小,但此方法有待验证。