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

再次提问:MJ_READ读取数据问题,非常急!!!

楼主#
更多 发布于:2003-01-22 20:10
我用下段代码得到读取的数据,跟踪数据也正确,可是解密后总是不对(有一次对过,但是只是那次成功,然后再运行就又不正确了)这到底是差在什么地方?我试了n遍了,手里又连个资料都没有!各位能不能给我解释一下 ?
if (Irp->MdlAddress != NULL )
 {    
  pUserBuffer = MmGetSystemAddressForMdlSafe( Irp->MdlAddress,NormalPagePriority );
 }
else if (Irp->AssociatedIrp.SystemBuffer !=NULL)
 {
  pUserBuffer=Irp->AssociatedIrp.SystemBuffer;
 }
 else
 {
  pUserBuffer = Irp->UserBuffer;
 }
if(pUserBuffer)
{
   decrypt(pUserBuffer,pUserBuffer,4);
}
Coolice
驱动小牛
驱动小牛
  • 注册日期2002-11-13
  • 最后登录2003-08-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-01-23 09:50
这段代码有两个问题:

1. if (Irp->AssociatedIrp.SystemBuffer !=NULL)
{
pUserBuffer=Irp->AssociatedIrp.SystemBuffer;
}
-> 多余代码,SystemBuffer只有DO_BUFFERED_IO使用,而文件系统永远也不会出现这种情况,只有DO_DIRECT_IO

2. decrypt(pUserBuffer,pUserBuffer,4);

-> 不要尝试在用户的Buffer上做改动,有时候会碰到权限问题。

不过解密后总是不对,原因可能不在上述之列,最有可能的两个原因:
1. 漏了IRP_MJ_READ(有可能Driver启动前就已经发过了)
2. Decrypt有问题(确认一下输入输出Buffer是同一个地址时,解密算法有没有问题?)
Brain
驱动牛犊
驱动牛犊
  • 注册日期2003-01-11
  • 最后登录2007-06-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-01-23 20:23
漏洞我找到了,谢谢提醒,我是用powerpoint打开ppt文件,只过滤了 powerpoint得进程,实际在这之前iexplore已经打开过进程,并读过ppt的数据了。但是还有一个很重要的问题:在win2000下,第一次读取文件数据是从硬盘上读去的,但再读数据的时候,系统就用fastio_read读去,并不从硬盘上读数据,但我希望它只从硬盘上读去数据,我试过在应用层用flushfileBuffer清内存,但是出过问题,能不能在驱动里让对文件的读取操作只从硬盘上读?如何实现?这个问题已经困扰了我很久了!都郁闷死我了!
rsman
驱动小牛
驱动小牛
  • 注册日期2003-01-14
  • 最后登录2016-01-22
  • 粉丝0
  • 关注0
  • 积分969分
  • 威望101点
  • 贡献值0点
  • 好评度92点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-01-23 20:55
漏洞我找到了,谢谢提醒,我是用powerpoint打开ppt文件,只过滤了 powerpoint得进程,实际在这之前iexplore已经打开过进程,并读过ppt的数据了。但是还有一个很重要的问题:在win2000下,第一次读取文件数据是从硬盘上读去的,但再读数据的时候,系统就用fastio_read读去,并不从硬盘上读数据,但我希望它只从硬盘上读去数据,我试过在应用层用flushfileBuffer清内存,但是出过问题,能不能在驱动里让对文件的读取操作只从硬盘上读?如何实现?这个问题已经困扰了我很久了!都郁闷死我了!


在驱动里,用CcFlushXXX函数应该可以完成你的要求。
rsman
Coolice
驱动小牛
驱动小牛
  • 注册日期2002-11-13
  • 最后登录2003-08-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-01-24 10:27
用CcFlushXXX函数在调试时,是个不错的方法,但是Release版本不推荐,Release更正确的做法是象SFILTER一样,从系统启动就开始工作。
Brain
驱动牛犊
驱动牛犊
  • 注册日期2003-01-11
  • 最后登录2007-06-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-01-24 11:24
谢谢二位帮助,这个帖子没有分,请到《vcmfc : 还是请教mj_read 的问题! 》那个帖子中留个言我好把分散给你们。能不能请二位到我对文件驱动了解得太少了,能不能推荐些资料?我放假这几天想先看看。
Coolice
驱动小牛
驱动小牛
  • 注册日期2002-11-13
  • 最后登录2003-08-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-01-24 11:59
参考资料vcmfc的那个帖子很全:
http://www.driverdevelop.com/forum/viewthread.php?tid=32002

还有那本Windows NT File System Internals千万要下载仔细研究,很多FSD的原理都有描述。
游客

返回顶部