阅读:2549回复:4
minifilter的例子swapbuffer的疑问1.在PreRead例程中,new了一个buffer,将iopb->Parameters.Read.ReadBuffer和p2pCtx都指向这个newBuf。 但是在PostRead例程中,传入的iopb->Parameters.Read.ReadBuffer 仍然是原来的地址。 所以不知道PreRead例程中对iopb->Parameters.Read.ReadBuffer=newbuf 这个有什么用。。 2.不明白swapbuffer的是怎么进行缓存的交换的。。 3.为什么一次打开文件,会有两次的preread和postread。 |
|
|
沙发#
发布于:2008-01-04 11:12
1。这是正确的。
数据已经Read到你的交换缓冲区(newbuf), 而在后处理中iopb->Parameters.Read.ReadBuffer仍然指向原来的缓冲区; 并且新的MDL由FltMgr来负责释放,你自己不能释放它! 2。请参考:微软官方网站上的讲义 - ModifyingParameters.ppt和BufferManagement.ppt |
|
|
板凳#
发布于:2008-01-04 15:58
意思是通过FltSetCallbackDataDirty(Data).就已经将数据读到了newbuf中。
然后是通过p2pCtx->SwappedBuffer=newBuf,将我们的新的newbuf传递给PostRead来处理。 不知道这样的理解是否正确? |
|
|
地板#
发布于:2008-03-12 18:49
3。一次是缓存读磁盘,另一次是应用程序读缓存
|
|
地下室#
发布于:2008-04-18 16:44
你应该想象一下
filter只是加在某一级上的过滤层 如果没这层。程序也能正常工作。 如果你没有 newbuf 系统就自己走自己的readbuf了。fltmgr自己分配,自己释放。 现在把swapbuffer这个例子加进去 fltmgr把 从下层读来的数据放到了在 新建的这一层上分配的内存。 然后post里 再把这些数据拷贝到 mdl里 送给上层。 所以说post里指哪也不用管了。数据已经得到了 在newbuffer里.Readbuff就没用了。不用关心了。 说的比较乱。。自己感觉是这个意思。。有错请指出。 |
|