我写了一个磁盘过滤驱动,其中过滤到IRP_MJ_WRITE后在其派遣函数中想把本来要写的东西存放到我提前准备好的文件中。现在的问题是在IRP_MJ_WRITE的派遣函数中怎样构建我的IRP_MJ_WRITE来实现呢?我想了一下其实主要就是将本来IRP中的要写的地方的地址映射到我的文件中,但这个映射需要怎样做呢?并且我要把每次写入的内容都保存起来。

解决方案 »

  1.   

    一看就是高手,我挂的是分区。现在就是为了解决重入的问题才要构建自己的IRP然后直接IoCallDriver给下一层Driver,这样就避免了重入,现在的问题就是不知道如何构建自己的IRP。
      

  2.   


    你构建IRP是写文件还是写扇区, 如果是写文件, 因为你是挂分区, 只要你的读写例程处理好了, 重入也不怕,可以看<寒江独钓>的磁盘过滤例子
    如果是写扇区, 去找找构建发IRP写扇区的代码.
    我不能给你代码, 因为是公司的.你可以去IDA一下rawdisk这个产品. 里面有发IRP写扇区的代码.
      

  3.   

    我就是在看<寒江独钓>的磁盘过滤例子,相信您也看过,例子中并没有解决掉重入的问题。他是避免掉了:
    比如他想保护D盘他把转存文件建立在了E盘上,这样跟本不存在重入的问题。如果把这个转存文件建立在了D盘上则就有了重入问题。为了解决掉这个问题头疼了好久了……您能给我指点一下读写例程需要怎样特殊处理一下吗?另外我去看一下rawdisk。
      

  4.   

    不知道楼主看过没有Windows文件系统过滤系统过滤驱动开发教程(第二版)上面有说怎么避免重入的方法!我觉得应该能行!
      

  5.   


    他这个不是文件系统过滤驱动, 是磁盘过滤驱动.
    因为写文件要经过FSD -> DISK, 没什么好方法避免重入.
      

  6.   

    它上面说创建一个线程,让读写请求放入,线程去做,何IRP 来到的
    时候,检查一下当前线程,如果是我们自己的线程,就跳过去,这样也不行??能说下原因么?
      

  7.   

    FSD filter
    FSD
    Disk filter <---- LZ的驱动
    Disk
    上面是存储栈的简化.
    LZ的驱动是Disk filter
    在disk filter驱动中读写文件, 还要经过FSD滴. 这其中发起的IRP不一定是在源线程环境下发送.
    有可能是FSD自己发IRP去读写扇区, 这时候的读写请求是在FSD线程环境.
    要么就把文件写到其他分区, 要么就采用其他算法.
      

  8.   

    避免重入很简单啊.建立一个影子设备就可以了.
    稀疏文件很简单,但遇到FAT32就不行了,空间不一定够.弄个hash表或b+树,跟bitmap挂钩起来就ok了.
    寒江独钓的例子只是个卷过滤,防止不了写扇区的.应用层程序都可以直接操作扇区,要破坏这个还原保护也太容易了.所以那玩意只能做为一个简单的过滤例子学习一下,用作商用,你都会死得很难看. 其实你要写还原保护,去看看diskperf的例子,简单改改就ok了.不过最好是写scsi miniport过滤.....