macy
禁止发言
禁止发言
  • 注册日期2001-12-19
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分6383分
  • 威望48270点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:1808回复:15

搞不定呀(续)

楼主#
更多 发布于:2002-04-09 21:25
用户被禁言,该主题自动屏蔽!

最新喜欢:

flyfoxflyfox
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-04-09 23:47
1)那个IRP不是在低层驱动里完成了吗?在完成例程里的IRP是那里发的?

那是之前系统把这个IRP完成了或者是已经做了排队或正在处理的一个IRP,现在是把请求堆栈一个一个的退出的时候,在DDK里面有一幅很清楚的图做说明了!

2)在PCHAR pContext=Irp->AssociatedIrp.SystemBuffer;里面没看到我要的内容呀?我是根据全路径名的前一部分来判断是否是我的目录,所以在读取我的目录里面的文件时也会运行完成例程,可是这个文件的内容在那里呢?
第一,这个IRP有可能还没有完成(我认为你是在完成例程里面看的)。
第二,有可能是系统填写的内容根本就不是添在这个指针指向的缓冲区
macy
禁止发言
禁止发言
  • 注册日期2001-12-19
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分6383分
  • 威望48270点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2002-04-10 08:55
用户被禁言,该主题自动屏蔽!
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-04-10 08:59
用户被禁言,该主题自动屏蔽!
macy
禁止发言
禁止发言
  • 注册日期2001-12-19
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分6383分
  • 威望48270点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2002-04-10 09:23
用户被禁言,该主题自动屏蔽!
macy
禁止发言
禁止发言
  • 注册日期2001-12-19
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分6383分
  • 威望48270点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2002-04-10 15:38
用户被禁言,该主题自动屏蔽!
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
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.

macy
禁止发言
禁止发言
  • 注册日期2001-12-19
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分6383分
  • 威望48270点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2002-04-10 21:13
用户被禁言,该主题自动屏蔽!
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-04-10 23:27
首先你要知道你发送的设备是什么,当然就是要得到这个设备对象啦!然后调用IOBUILD****后面的忘了,好久没有用了!
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-04-10 23:29
还有就是你解密的时候有可能解密出来的数据比他分配的数据要多,那么请求下来的这个缓冲区就不够大了!那么你怎么办呢?
macy
禁止发言
禁止发言
  • 注册日期2001-12-19
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分6383分
  • 威望48270点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2002-04-11 10:02
用户被禁言,该主题自动屏蔽!
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
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就是.


macy
禁止发言
禁止发言
  • 注册日期2001-12-19
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分6383分
  • 威望48270点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
12楼#
发布于:2002-04-11 12:21
用户被禁言,该主题自动屏蔽!
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-04-11 13:05
呵呵!你在IRP堆栈里面看看吧!可能在的地方是MdlAddress ,
AssociatedIrp.SystemBuffer,
UserBuffer
macy
禁止发言
禁止发言
  • 注册日期2001-12-19
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分6383分
  • 威望48270点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
14楼#
发布于:2002-04-11 21:44
用户被禁言,该主题自动屏蔽!
danier
驱动牛犊
驱动牛犊
  • 注册日期2002-03-29
  • 最后登录2002-04-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-04-16 13:55
我也有同样的问题。
问题是要获得的数据在那?

我想大概在公共的指针buffer说指的缓冲区里面。
游客

返回顶部