阅读:921回复:1
问一个关于传递irp的问题
小弟刚接触驱动不久,有个问题一直感到很迷惑:
一般对irp不做处理的传递是: IoSkipCurrentIrpStackLocation(Irp); IoCallDriver(dx->NextStackDevice,Irp); 以上NextStackDevice是本驱动邦定到的设备驱动,那么能知道具体是什么驱动吗? 如果一直按照这样传递,是不是有可能这个Irp会经过系统所有的驱动? 如果自己写了个驱动Wdm1,使用IoAttackDeviceToDeviceStack()邦定到设备堆栈后,自己又写了个Wdm2的驱动程序,使用IoAttackDeviceToDeviceStack()是不是就邦定到Wdm1上了?这时自己又写一个Wdm3的驱动程序使用IoAttackDeviceToDeviceStack(),那么发向Wdm1的Irp包就会经过Wdm2和Wdm3吗? |
|
沙发#
发布于:2007-02-02 16:04
引用第0楼devil209于2007-02-02 09:47发表的“问一个关于传递irp的问题”: 当然能知道是什么驱动。在驱动绑定设备的时候,一般有两种方式,一种是主动绑定,就是你提供设备名,然后调用函数来将他绑定,例如: RtlInitUnicodeString( &nameString, L"\\Device\\RawDisk" ); status = IoGetDeviceObjectPointer( &nameString, FILE_READ_ATTRIBUTES, &fileObject, &rawDeviceObject ); 这样就会得到返回的rawDeviceObject 。 另外一种就是注册回呼函数,例如静态文件过滤系统经常用到的IoRegisterFsRegistrationChange( DriverObject, SfFsNotification );当有文件系统启动或关闭的时候就会调用SfFsNotification函数。这样你就可以根据传递给SfFsNotification的参数来得到你需要的信息 |
|