阅读:1911回复:6
再次提问:MJ_READ读取数据问题,非常急!!!
我用下段代码得到读取的数据,跟踪数据也正确,可是解密后总是不对(有一次对过,但是只是那次成功,然后再运行就又不正确了)这到底是差在什么地方?我试了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); } |
|
沙发#
发布于: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是同一个地址时,解密算法有没有问题?) |
|
板凳#
发布于:2003-01-23 20:23
漏洞我找到了,谢谢提醒,我是用powerpoint打开ppt文件,只过滤了 powerpoint得进程,实际在这之前iexplore已经打开过进程,并读过ppt的数据了。但是还有一个很重要的问题:在win2000下,第一次读取文件数据是从硬盘上读去的,但再读数据的时候,系统就用fastio_read读去,并不从硬盘上读数据,但我希望它只从硬盘上读去数据,我试过在应用层用flushfileBuffer清内存,但是出过问题,能不能在驱动里让对文件的读取操作只从硬盘上读?如何实现?这个问题已经困扰了我很久了!都郁闷死我了!
|
|
地板#
发布于:2003-01-23 20:55
漏洞我找到了,谢谢提醒,我是用powerpoint打开ppt文件,只过滤了 powerpoint得进程,实际在这之前iexplore已经打开过进程,并读过ppt的数据了。但是还有一个很重要的问题:在win2000下,第一次读取文件数据是从硬盘上读去的,但再读数据的时候,系统就用fastio_read读去,并不从硬盘上读数据,但我希望它只从硬盘上读去数据,我试过在应用层用flushfileBuffer清内存,但是出过问题,能不能在驱动里让对文件的读取操作只从硬盘上读?如何实现?这个问题已经困扰了我很久了!都郁闷死我了! 在驱动里,用CcFlushXXX函数应该可以完成你的要求。 |
|
|
地下室#
发布于:2003-01-24 10:27
用CcFlushXXX函数在调试时,是个不错的方法,但是Release版本不推荐,Release更正确的做法是象SFILTER一样,从系统启动就开始工作。
|
|
5楼#
发布于:2003-01-24 11:24
谢谢二位帮助,这个帖子没有分,请到《vcmfc : 还是请教mj_read 的问题! 》那个帖子中留个言我好把分散给你们。能不能请二位到我对文件驱动了解得太少了,能不能推荐些资料?我放假这几天想先看看。
|
|
6楼#
发布于:2003-01-24 11:59
参考资料vcmfc的那个帖子很全:
http://www.driverdevelop.com/forum/viewthread.php?tid=32002 还有那本Windows NT File System Internals千万要下载仔细研究,很多FSD的原理都有描述。 |
|