阅读:1586回复:6
怎样发出一个 FASTIO 的 IO CONTROL 命令?
看了 Filemon 的源代码,里面的命令都是通过 fast io 接口来执行的,但是怎么都找不到是怎么做到这一点的。我修改了 filemon 头文件里面的 io control 命令定义,把 METHOD_BUFFER 改成 METHOD_NEITHER, 修改了 CreateFile 调用,定义了 FILE_FLAG_NO_BUFFERING,好像都没有效果啊?所有 Filemon 发出的 IO CONTROL 命令还是真接发送到 fastio dispatch 接口里面去了,这是怎么回事呢?
怎样才能发送 buffered io,怎样才能发送 direct io 呢? |
|
沙发#
发布于:2003-08-02 16:27
我认为应该是Io manager,VMM manager,CACHE manager发送IO命令给
filemon所hook的设备,应此发送命令时所使用的缓冲方式是由设备的某一个域决定的,至于fase IO是由于io manager检测发现可以用快速 IO 直接从内存中读写数据时才发出,如果所需数据不在内存中 则会发送IRP―XXX调用filemon的相应函数。 |
|
板凳#
发布于: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 处理呢? |
|
地板#
发布于:2003-08-05 08:38
fast io可以在发起这个io的时候指定。一般是一个标志位决定。
|
|
地下室#
发布于: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无关
|
|
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 |
|
6楼#
发布于:2003-08-09 10:26
谢谢,明白了。
研究得并不惨,只不过麻烦一点而已,项目迟迟不下来,也好让我慢慢研究文档和资料,有东西没弄懂,总要想方设法弄懂啊,呵呵 |
|