阅读:2436回复:16
又来问问题了,mj_read 读数据缓冲区
我在mj_read 消息里读数据
buffer里面的数据是空的,(程序源码用的是filemon的) 只有在FilemonHookDone函数里面才能得到数据。但是我想在mj_read消息里处理buffer,怎么做? |
|
最新喜欢:![]() |
沙发#
发布于:2003-02-10 18:56
不解其意!
|
|
板凳#
发布于:2003-02-11 11:51
我是说在case IRP_MJ_READ: 中不能获得读的数据内容,只有在 IoSetCompletionRoutine( Irp, FilemonHookDone, (PVOID) seqNum, TRUE, TRUE, TRUE );中的FilemonHookDone函数里才能得到读去的数据内容。(而win98 read消息里就可以直接得到buffer。)
我想在case IRP_MJ_READ:中直接得到读取的内容,如何做到? |
|
地板#
发布于:2003-02-11 14:59
肯定是要调用低层的驱动程序去读取数据,在完成例程里面查看读出的数据。
|
|
|
地下室#
发布于:2003-02-11 15:07
不好意思,低层的驱动程序是指什么?是不是zwreadfile 之类的?驱动我刚接触,还不熟悉,请指教!
|
|
5楼#
发布于:2003-02-11 15:10
补充一下,我是想在调用 IoSetCompletionRoutine( Irp, FilemonHookDone, (PVOID) seqNum, TRUE, TRUE, TRUE );之前处理读取的缓冲数据。
|
|
6楼#
发布于:2003-02-11 15:19
因为你的驱动程序只是一个过滤,真正执行文件读取的程序不是你的任务,而是FSD的任务,你需要把特定的IRP请求传给低层驱动程序(低层驱动程序又可以传给更低层的驱动,直至FSD从硬盘扇区中读取数据),待其返回后才可能取得数据。
程序执行到你的IRP_MJ_READ时,还没有开始读数据,怎么能看到数据呢?当然得等到低层驱动把数据准备好了,你才能看得到。你只不过需要准备一些合适的参数,如文件名、文件当前指针等。 |
|
|
7楼#
发布于:2003-02-11 16:05
老大,你说的“低层驱动把数据准备好了”怎么实现?我想知道具体的实现方法,用ZwReadFile可以吗?谢谢你的帮助
|
|
8楼#
发布于:2003-02-11 16:42
既然你挂接了文件驱动,ZwReadFile调用又会导致你的IRP_MJ_READ最先被调用(文件系统过滤只允许在上层过滤,不允许在下层过滤,所以你的行为永远在先),然后,你又来一次ZwReadFile,这样周而而复始,死矣。当然这种情况也有办法避免。
我想不通的是,你为什么要在系统还没有完成读文件之前就想知道文件的内容呢?心急吃不了豆腐啊 如果你想直接读的话就不必通过驱动程序,可以直接去读FAT或者MFT,再直接扇区读取也可以。 |
|
|
9楼#
发布于:2003-02-11 17:13
记住:只处理nocache的IRP,其它不要去读,否则,你死定了。 :D
|
|
10楼#
发布于:2003-02-11 17:14
好好记住:sijun的话。是要点。 :D
|
|
11楼#
发布于:2003-02-11 17:15
有道理!但是我想作一个对指定文件夹加密的程序,因为我在mj_read 里能获得文件名,从而判断路径来对读到的指定文件夹的文件进行加密,如果在IoSetCompletionRoutine( Irp, FilemonHookDone, (PVOID) seqNum, TRUE, TRUE, TRUE );中的FilemonHookDone 函数中处理的话,得不到当前操作的文件名和句柄。望指教
|
|
12楼#
发布于:2003-02-11 17:17
to VCmfc :
好!!!我一定记住sijun的话!!! 不过他说什么了????能不能告诉我一下 ? |
|
13楼#
发布于:2003-02-11 17:50
呵呵,我帮他说吧
read/write只处理nocache和paging io |
|
14楼#
发布于:2003-02-11 17:52
兄弟,起哄啊,我知道他说的什么意思!只不过是和他开个玩笑而已,你还当真了,呵呵!
|
|
15楼#
发布于:2003-02-11 17:54
呵呵
|
|
16楼#
发布于:2003-02-13 14:35
问题解决了!谢谢各位!尤其Tom_lyd老大,真的让我懂得了很多
分给到下个帖子,请各位去一下 |
|