下载后可任意编辑Windows 文件系统过滤驱动开发教程(7)7.IRP 完成函数,中断级,如何超越中断级别的限制 先讨论一下 Volumne 设备是如何得到的.首先看以下几个函数: // ------------------wdf.h 中的内容 ------------------------- typedef VPB wd_vpb; _inline wd_vpb * wd_dev_vbp(wd_dev *dev) { return dev->Vpb; } _inline wd_dev * wd_vbp_dev(wd_vpb *vpb) { return vpb->DeviceObject; } VPB 是 Volume parameter block.一个数据结构.它的主要作用是把实际存储媒介设备对象和文件系统上的卷设备对象联系起来. wd_dev_vbp 可以让你从一个 Storage Device Object 得到一个 VPB,而 wd_vbp_dev 这个函数可以得到这个 VPB 所对应的 Volmue 设备. 现在首先要得到 Storage Device Object.实际上这个东西保存在当前 IO_STACK_LOCATION中. // ------------------wdf.h 中的内容 ----------------------- _inline wd_dev *wd_irpsp_mount_storage(wd_io_stack *irpsp) { return irpsp->Parameters.MountVolume.Vpb->RealDevice; }; 那么,从 irp 出发,我最终可以通过以下的方式得到 Volumue 设备: wd_irpsp *irpsp = wd_cur_io_stack(irp); 下载后可任意编辑wd_dev *storage_dev = wd_irpsp_mount_storage(irp); wd_vpb *vpb = wd_dev_vbp(storage_dev); wd_dev *volume_dev = wd_vbp_dev(vpb); 不过实际情况并不这么简单.这里的 IRP 是一个 MOUNT 请求.而 volume 设备对象实际上是这个请求完成之后的返回结果.因此,在这个请求还没有完成之前,我们就试图去获得 Volume设备对象,当然是竹篮打水一场空了. 这里,你可以直接拷贝当前 IO_STACK_LOCATION,然后向下发送请求,但在此之前,要先给irp 分配一个完成函数.irp 一旦完成,你的完成函数将被调用.这样的话,你可以在完成函数中得到 Volume 设备,并实施你的绑定过程. 这里要讨论一下中断级别的问题.常常碰到人问某函数只能在 Passive Level 调用是什么意思.总之我们的任何代码执行的时候,总是处在某个当前的中断级之中.某些系统调用只能在低级别中断级中执行.请注意,假如一个调用可以在高处运行,那么它能在低处运行,反过来则不行. 我们需要知道的只是我们关怀 Passive Level 和 Dispatch Level.而且 Dispatch Level 的中断级较高.一般 ddk 上都会标明,假如注明 irq level>=dispatch...