liuyang714
驱动牛犊
驱动牛犊
  • 注册日期2003-06-04
  • 最后登录2003-08-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1586回复:6

怎样发出一个 FASTIO 的 IO CONTROL 命令?

楼主#
更多 发布于:2003-08-02 15:53
看了 Filemon 的源代码,里面的命令都是通过 fast io 接口来执行的,但是怎么都找不到是怎么做到这一点的。我修改了 filemon 头文件里面的 io control 命令定义,把 METHOD_BUFFER 改成 METHOD_NEITHER, 修改了 CreateFile 调用,定义了 FILE_FLAG_NO_BUFFERING,好像都没有效果啊?所有 Filemon 发出的 IO CONTROL 命令还是真接发送到 fastio dispatch 接口里面去了,这是怎么回事呢?
怎样才能发送 buffered io,怎样才能发送 direct io 呢?
robin12
驱动牛犊
驱动牛犊
  • 注册日期2002-02-11
  • 最后登录2014-03-27
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望63点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-08-02 16:27
我认为应该是Io manager,VMM manager,CACHE manager发送IO命令给
filemon所hook的设备,应此发送命令时所使用的缓冲方式是由设备的某一个域决定的,至于fase IO是由于io manager检测发现可以用快速 IO 直接从内存中读写数据时才发出,如果所需数据不在内存中
则会发送IRP―XXX调用filemon的相应函数。
liuyang714
驱动牛犊
驱动牛犊
  • 注册日期2003-06-04
  • 最后登录2003-08-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-08-02 17:28
filemon 在 IRP_MJ_DEVICE_CONTROL 的注释里提到了:
 This path will never execute because we have registered a  fast I/O path for device control. That means that the fast I/O entry point will ALWAYS be called for Device Control operations

是不是注册了 driver 的 fastio dispatch,device direct io 就不会再接收到 IRP_MJ_DEVICE_CONTROL 的命令了呢?所有的命令都会传向由 fastio dispatch 处理呢?
yyhabc
驱动小牛
驱动小牛
  • 注册日期2003-01-06
  • 最后登录2013-03-18
  • 粉丝0
  • 关注0
  • 积分327分
  • 威望47点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-08-05 08:38
fast io可以在发起这个io的时候指定。一般是一个标志位决定。
SupermiLG
驱动牛犊
驱动牛犊
  • 注册日期2003-01-28
  • 最后登录2006-02-03
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-08-09 06:18
嗬嗬,看你研究得挺惨的,帮你一把。fast io 接口是这么一回事:I/O管理起在进行I/O操作时,首先查看该设备是否支持fast io。也就是fast io dispach 的哪张表项是否为空,如果不为空,则调用之,当发现函数返回值为FALSE时,才build a Irp ,然后下传。如果你愣是要用IRP来接包的话,在fast io的函数中简单的返回FALSE就可以了。这与你的设备是buffer io还是direct i/o无关
SupermiLG
驱动牛犊
驱动牛犊
  • 注册日期2003-01-28
  • 最后登录2006-02-03
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-08-09 06:26
在解释清楚一点,
user mode 调用 DeviceIoControl(....);
                   |
 -------------------------------------
kernel mode        |
             I/O   Manager
                   |
              test fast i/o
                   |
              +----------+
 return true  |          | return false
              |          |
           Success      I/O Manager Build a IRP
                          |
                        Call your device with the IRP


understand ? hehehhehehe
liuyang714
驱动牛犊
驱动牛犊
  • 注册日期2003-06-04
  • 最后登录2003-08-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-08-09 10:26
谢谢,明白了。
研究得并不惨,只不过麻烦一点而已,项目迟迟不下来,也好让我慢慢研究文档和资料,有东西没弄懂,总要想方设法弄懂啊,呵呵
游客

返回顶部