阅读:1809回复:15
搞不定呀(续)用户被禁言,该主题自动屏蔽! |
|
最新喜欢:flyfox |
沙发#
发布于:2002-04-09 23:47
1)那个IRP不是在低层驱动里完成了吗?在完成例程里的IRP是那里发的?
那是之前系统把这个IRP完成了或者是已经做了排队或正在处理的一个IRP,现在是把请求堆栈一个一个的退出的时候,在DDK里面有一幅很清楚的图做说明了! 2)在PCHAR pContext=Irp->AssociatedIrp.SystemBuffer;里面没看到我要的内容呀?我是根据全路径名的前一部分来判断是否是我的目录,所以在读取我的目录里面的文件时也会运行完成例程,可是这个文件的内容在那里呢? 第一,这个IRP有可能还没有完成(我认为你是在完成例程里面看的)。 第二,有可能是系统填写的内容根本就不是添在这个指针指向的缓冲区 |
|
板凳#
发布于:2002-04-10 08:55
用户被禁言,该主题自动屏蔽! |
|
地板#
发布于:2002-04-10 08:59
用户被禁言,该主题自动屏蔽! |
|
地下室#
发布于:2002-04-10 09:23
用户被禁言,该主题自动屏蔽! |
|
5楼#
发布于:2002-04-10 15:38
用户被禁言,该主题自动屏蔽! |
|
6楼#
发布于:2002-04-10 18:33
Tom_lyd 的回答比较接近正解.
直接使用原始IRP不能解决要求的. FILEMON不要结果数据,知识要个文件名, 你的要求不同. 不能简单模仿. 对于你的情况, 当然你要处理IRP_MJ_READ, IRP_MJ_WRITE,但是必须按照下面的方法来做 以 READ 为例: 1. 你的FILTER应该分析读的要求 2. 因为你需要处理返回数据, 所以你不能让下层设备有机会COMPLETE 原始IRP . 你要BUILD 一个自己的KERNEL IRP(包括申请一个新的结果接受BUFFER), 3. 用新的IRP 直接调用下层设备驱动程序 4.等待下层设备驱动的返回, (READ的时候IRPL有时为DISPATCH LEVEL, 你需要一个自己的QUEUE) 5. 一下层返回的结果为源,进行你的解密处理, 把结果放到原始IRP的输出BUFFER中 6.释放该释放的东西, 7.直接COMPLETE 原始IRP. |
|
7楼#
发布于:2002-04-10 21:13
用户被禁言,该主题自动屏蔽! |
|
8楼#
发布于:2002-04-10 23:27
首先你要知道你发送的设备是什么,当然就是要得到这个设备对象啦!然后调用IOBUILD****后面的忘了,好久没有用了!
|
|
9楼#
发布于:2002-04-10 23:29
还有就是你解密的时候有可能解密出来的数据比他分配的数据要多,那么请求下来的这个缓冲区就不够大了!那么你怎么办呢?
|
|
10楼#
发布于:2002-04-11 10:02
用户被禁言,该主题自动屏蔽! |
|
11楼#
发布于:2002-04-11 11:20
这周搞定,恐怕不太可能. 写还是容易, 调更花时间.加上测试,不太好想了.
---怎么用新的IRP调下层设备驱动? 可否说清楚点? IoAllocateIrp, 初始化必要的项目,具体你可以参照 DDK\SRC\STORAGE\CDROM\CDROM.C 看CDROMSTARTIO就可以了. 它BUILD了一个SCSI_PASSTHOUGH, 你在READ里BUILD READ IRP , 在WRITE里BUILD WRITE IRP 就是. 然后IOCALLDRIVER(参数和FILEMON基本相同,不同的是IRP被替换了) --------你的意思是调下层驱动时换掉原来的IRP,有什么用呀? 因为你把原始的IRP传下去,下层设备在COMPLETE IRP 之后,即使在COMPLETE ROUTINE 里, 大多数域就不能用了.特别是你想处理的BUFFER,一访问就蓝屏, 我也有过这种经验. 你的这种情况COMPLETE ROUTINE基本上没有用. ---------那自己的IRP应该怎么做呀?最好写点代码出来吧。 我有保密协定, 而且看机能限定的东西会束缚你, 看DDK的源程序更好. ---------老板要这这周做出来呀,我的驱动很菜,很急的说!谢谢。 我周末也要RELEASE一个版本, 很难帮你. 如果到下周末,或许能帮你些忙. ---guardee的问题. 还有就是你解密的时候有可能解密出来的数据比他分配的数据要多,那么请求下来的这个缓冲区就不够大了!那么你怎么办呢? 一般对于上层程序来说, 他一般不应该意识文件是加过密的还是没加过密的,否则就不要这个FILTER. 做这个FILTER的人必须知道具体的加密/解密算法,读的时候,上层的BUFFER是给解密后结果的,比如2048 BYTE.如果在硬盘上的实际存储是4096(或者1024),你BUILD 一个合适OFFSET, 要求4096BYTE(或者1024)的IRP就是. |
|
12楼#
发布于:2002-04-11 12:21
用户被禁言,该主题自动屏蔽! |
|
13楼#
发布于:2002-04-11 13:05
呵呵!你在IRP堆栈里面看看吧!可能在的地方是MdlAddress ,
AssociatedIrp.SystemBuffer, UserBuffer |
|
14楼#
发布于:2002-04-11 21:44
用户被禁言,该主题自动屏蔽! |
|
15楼#
发布于:2002-04-16 13:55
我也有同样的问题。
问题是要获得的数据在那? 我想大概在公共的指针buffer说指的缓冲区里面。 |
|