一个驱动可以创建多个设备,典型的例子就是楚狂人在TDI驱动教程中创建了TCP,UDP,ICMP的三个过滤设备。
实际上为了能和应用层做IO管理,可能还需要创建一个控制设备,这个设备只负责接收应用层下发的策略。
但我觉得这存在问题,特别是在驱动卸载的时候存在问题。如果驱动只对应一个设备,能保证DriverUnload调用时是独占的,即不存在同步问题。但当对应多个设备时,可能在驱动卸载的时候(调用DriverUnload时),挂接的设备过来的IRP请求,即便做了同步,DriverUnload完成以后驱动被卸掉了,这时候会发生DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS错误。
msdn中说明驱动在卸载前一定要去除自己注册的回调函数,dispatch道理也一样,但是因为一个驱动对应多个设备,保证不了在卸载驱动时被其他设备触发dispatch,所以必定存在概率BSOD。
测试了《寒江独钓》里的关于tdi_fw,多次加载卸载出现蓝屏,通过windbg查看是发生在dispatch函数开头,应该就是这个问题导致。