写了一个文件过滤驱动filter,使用DriverMonitor动态加载的时候所有盘都可以挂接上,没问题。可是用inf文件安装后随系统启动加载(StartType=0)就出问题了:我有3个盘,c盘是fat32,d盘是ntfs,f盘是虚拟光驱。调试显示这时候会收到4个Mount卷的IRP,可是4个都是CdRom的,也就是说4个都是光驱的,只收到f盘的mount,没收到c和d盘的Mount IRP,也就挂接不到c和d盘了,请问可能是什么原因OS:2000 Server
用的2003的ifs ddk

解决方案 »

  1.   

    这个地方会IFS的人好像不多呢。到driverdevelop?
      

  2.   

    http://www.osronline.com/showThread.cfm?link=41410这个帖子问的和我一样的问题,有了点眉目,期待高人
      

  3.   

    IRP_MJ_FILE_SYSTEM_CONTROL/IRP_MN_MOUNT_VOLUME应该是针对FS的CDO发送的,这里没收到该IRP,应该是挂接CDO出了问题。我想确定一下,是否在DriverEntry里面注册了加载文件系统的回调函数,在该回调函数里面对fs的cdo做挂接就可以了???还有其他地方需要挂接吗??
      

  4.   

    上面说的注册回调的方式应该是动态加载的卷才有作用,象u盘。随系统启动的时候不会是通过这个回调函数挂接cdo的吧?????那又是在哪儿挂接cdo的???本来我认为应该在IRP_MJ_FILE_SYSTEM_CONTROL/IRP_MN_LOAD_FILE_SYSTEM里面挂接cdo,这就要求IRP_MN_LOAD_FILE_SYSTEM在IRP_MN_MOUNT_VOLUME前发生,可我看到资料说的刚好相反,说是IRP_MN_MOUNT_VOLUME后才会IRP_MN_LOAD_FILE_SYSTEM晕了
      

  5.   

    一个驱动只对应一个CDO,你的系统里面有多个文件系统,有可能生成多种设备,你的驱动本身应该生成一个控制设备,来修改驱动的内部配置。
    在DriverEntry里面你应该生成一个CDO,而不是在IRP_MJ_FILE_SYSTEM_CONTROL或者它的minor function里面来挂接CDO。
      

  6.   

    to pioneer_public() :你误解了我的意思,我自己的cdo当然是一个在DriverEntry里面生成的,我是说需要在注册的回调函数里面挂接FSD,我测试只挂接到了CdRom,所以导致只有光驱的Mount IRPto codewarrior(会思考的草):没在xp测试过,边上都没xp系统,呵呵,我想可能是加载时机不对,导致注册的回调函数错过被正常调用的机会
      

  7.   

    1.试试sfilter是否可以正确挂接;
    2.IoRegisterFsRegistrationChange在xp以上的系统上不枚举已经加载的文件系统的。
      

  8.   

    to : codewarrior(会思考的草) 
    关于 IoRegisterFsRegistrationChange 你讲反了吧,在XP以上的系统上是枚举所有存在的文件系统,除了RAW。而在2000下,是不会枚举在filter之前加载的文件系统的。
      

  9.   

    Your completion routine is still too early.  The IO Manager will
    not know that the mount has completed until all the mount IRP's
    processing is finished, which includes the execution of all the
    completion routines.  
      

  10.   

    nod,不好意思呵呵讲反了:)
      

  11.   

    分别用2000ifsddk和2003ifddk里的sfilter试试看吧。
      

  12.   

    先谢谢大家的回答看到文档说了xp以后的会忽略raw。不过我用的是2k测试的,只是在加载cdfs的时候调用了注册的回调函数,其他没调用到,也就是在加载我的驱动以前c和d盘已经完成了mount,
    就是pioneer_public() 说的“而在2000下,是不会枚举在filter之前加载的文件系统的。”codewarrior(会思考的草) 兄建议“分别用2000ifsddk和2003ifddk里的sfilter试试看吧。”,我到处找了都没看到有2k的ddk,哪位知道麻烦给个连接。0011411(爱也许是假的,可是当时的快乐是真的。) 
    “Your completion routine is still too early.  The IO Manager will
    not know that the mount has completed until all the mount IRP's
    processing is finished, which includes the execution of all the
    completion routines.  ”   Thanks for your answer,It's so useful for me.再次谢谢大家
      

  13.   

    恩,发我邮箱也可以[email protected]
      

  14.   

    哈哈哈!!!!!!终于看到Disk的Mount了:)
    爽啊
      

  15.   

    不清除那个标识,是收不到IRP的……