阅读:2118回复:14
如何将一个在2k下虚拟设备与一个硬件设备联系起来!
我在2k下写了一个虚拟读卡器的驱动,能模拟读卡器的行为。现在我想让其监测硬件USB Token的行为,把它的插拔当作卡的插拔。我在虚拟读卡器的DriverEntry中,用IoRegisterPlugPlayNotification()注册监听了Token的插拔。然后,我如何能够将发给虚拟读卡器的IRP转发给Token呢?我能不能用IoAttachDeviceToDeviceStack()将我的虚拟设备处理例层添加到Irp栈中,如果可以,IoAttachDeviceToDeviceStack()的参数应该填什么?
|
|
沙发#
发布于:2003-12-31 19:31
>> 我如何能够将发给虚拟读卡器的IRP转发给Token呢?
可以用IoGetDeviceObjectPointer打开读卡机的驱动,然后用IoBuildDeviceIoControlRequest之类的构造IRP,然后IoCallDriver进行调用,但是,原来的驱动也会对系统请求作出响应,你怎么处理 两个驱动之间的关系呢? >> 我能不能用IoAttachDeviceToDeviceStack()将我的虚拟设备处理 >> 例层添加到Irp栈中, >> 如果可以,IoAttachDeviceToDeviceStack()的参数应该填什么? 看看DDK中关于Filter Driver的讨论。 |
|
|
板凳#
发布于:2004-01-04 09:31
我的目的是将token的插拔模拟为读卡器中卡的插拔。即系统认为虚拟读卡器是一直连接在系统上的,token拔出后,系统只是认为读卡器中没有插入卡而已。如果将虚拟读卡器的驱动作为Token的过滤驱动,那么Token的插拔是否会直接读卡器的插拔呢?
|
|
地板#
发布于:2004-01-04 11:57
>> 我的目的是将token的插拔模拟为读卡器中卡的插拔。
你说的是Medium,不是Device,这种情况下你IoRegisterPlugPlayNotification应该是没用的吧?我觉得你要想监视这个应该象系统一样,用个定时器隔段时间发个CHECK_VERIFY请求到真正的读卡器驱动,或注意它返回的STATUS_VERIFY_REQUIRED。 >> 即系统认为虚拟读卡器是一直连接在系统上的,token拔出后, >> 系统只是认为读卡器中没有插入卡而已。 是的,这种情况下不管是你的驱动还是真正的读卡器驱动都应该返回STATUS_NO_MEDIA_IN_DEVICE。 >> 如果将虚拟读卡器的驱动作为Token的过滤驱动,那么Token的 >> 插拔是否会直接读卡器的插拔呢? 没看懂。 :( 上面说的这些都认为真正的读卡器驱动是一个MASS STORAGE驱动,如果不是,那你应该根据读卡器的驱动形式来决定应该如何去做。 |
|
|
地下室#
发布于:2004-01-06 13:48
Sorry, 我表述的不太清楚。我的目的是做一个虚拟读卡器的驱动,让系统始终认为系统上有一个读卡器存在。而当真实的物理读卡器插入时,系统只是认为有卡插入了虚拟读卡器。即系统与真实读卡器之间的通讯都要经由虚拟读卡器转发。我的目的时无论物理读卡器是否与系统连接,系统始终认为有一读卡器挂载在系统下。如果把虚拟读卡器作为物理读卡器的一个filter,那么是否当物理读卡器从系统remove时,虚拟读卡器的驱动也会随之卸载,而达不到我的目的。谢谢!
|
|
论坛版主
![]() |
5楼#
发布于:2004-01-07 20:06
我认为如果你把虚拟读卡器做为物理读卡器的FILTER的话,卸载了物理读卡器,那么它的PNP的REMOVE请求的处理例程中卸载其FILTER是你的责任,如果你不卸栽应该这个FILTER应该是能继续工作的,你的FILTER在物理卡驱动和上层中间,它可以告诉上层任何它想的事件和数据,卸在掉物理读卡器驱动后,你的FILTER就直接处理一切请求,不发下去就行了
|
|
6楼#
发布于:2004-01-08 08:53
谢谢你的回答,那么加载的时候呢,我需要虚拟读卡器从开机起一直挂载在系统下,而物理读卡器的驱动应该是在它插入时才加载的吧。而FILTER应该是和物理读卡器的驱动一块加载的吧。我能否单独先安装FILTER的驱动呢?
>>我认为如果你把虚拟读卡器做为物理读卡器的FILTER的话,卸载了>>物理读卡器,那么它的PNP的REMOVE请求的处理例程中卸载其>>FILTER是你的责任,如果你不卸栽应该这个FILTER应该是能继续工>>作的,你的FILTER在物理卡驱动和上层中间,它可以告诉上层任何>>它想的事件和数据,卸在掉物理读卡器驱动后,你的FILTER就直接>>处理一切请求,不发下去就行了. |
|
论坛版主
![]() |
7楼#
发布于:2004-01-09 11:25
可是可以先加载FILTER的驱动,不过如果单独加载你只能把它放到UNKNOW BUS下面,当你插上物理读卡器时物理读卡器所在总线(可能你的是USB吧)枚举到这个设备,它的驱动才被加载执行,那么这两个驱动的设备对象可能就没有放到一个设备栈中,你可能需要自己再做一次IOATTACHDEVICETODEVICESTACK把它们放到一起,但是注意不要内存泄漏,另外看能不能用IoGetDeviceObjectPointer自己来用IOCALLDRIVER来传递IRP.
这个问题你也可以再问问COOL_NET,他娃是专家:) |
|
8楼#
发布于:2004-01-09 17:14
我现就是这样做的,目前我的虚拟读卡器驱动中已经能检测的USB Token的插拔了。我想下一步用IoGetDeviceObjectPointer得到物理读卡器的DeviceObject,然后将虚拟读卡器加入他的IRP栈,不知可不可行?如果要自己传送IRP又该怎么做呢?我看的大部分书都只是提了一下tightly couple driver,但没有例子。哪位能给我个demo看看啊!
BTW,四川人吧? >>可是可以先加载FILTER的驱动,不过如果单独加载你只能把它放到UNKNOW BUS下面,当你插上物理读卡器时物理读卡器所在总线(可能你的是USB吧)枚举到这个设备,它的驱动才被加载执行,那么这两个驱动的设备对象可能就没有放到一个设备栈中,你可能需要自己再做一次IOATTACHDEVICETODEVICESTACK把它们放到一起,但是注意不要内存泄漏,另外看能不能用IoGetDeviceObjectPointer自己来用IOCALLDRIVER来传递IRP. 这个问题你也可以再问问COOL_NET,他娃是专家:) |
|
论坛版主
![]() |
9楼#
发布于:2004-01-09 21:06
9494:)
你自己在虚拟驱动里面构造IRP,传到物理读卡器,用IOCALLDRIVER就可以了 |
|
10楼#
发布于:2004-01-11 15:16
呵呵,老乡,再请教个问题。我用IoAttachDeviceToDeviceStack将虚拟设备加入物理设备的IRP栈后,系统就不再让我停止该物理设备了。我应该如何在物理设备remove时正常通知虚拟设备。我刚刚开始学写驱动,对这些还不很明白,请多指教。
|
|
论坛版主
![]() |
11楼#
发布于:2004-01-12 17:20
哈哈,我也刚弄了不久,2,3个月吧,大家共同探讨!
你的物理设备需要处理PNP事件,比如:IRP_MN_REMOVE_DEVICE等等,这些东西要先通过你的虚拟驱动(你注册相应的函数拦截它门)你在虚拟驱动里面就可以处理他们,包括发不发给下层,总之自由度是6,哈哈,随便你怎么样都可以,愉快三,祝新年快乐!GOOD LUCK |
|
12楼#
发布于:2004-03-01 19:47
我现在开发好了一个PC/SC的驱动程序,主要是用在USB KEY的方面,现在我的PC/SC的驱动程序已经开发好了,今我也是要实现这方面的东西,即:在USB KEY拔除后系统仍能检测到他的存在,在USB KEY插入后系统认为是SMARTCARD被插入,USB KEY拔除后系统认为是SMARTCARD拔除。
哪位朋友能给我一些提示吗? assertchp@163.com |
|
13楼#
发布于:2004-04-15 15:37
我的解决方案:
1)IoRegisterPlugPlayNotification跟踪USB设备的插拔; 2、用自定义IO请求的方式通讯; 同下。 >>> 我如何能够将发给虚拟读卡器的IRP转发给Token呢? >可以用IoGetDeviceObjectPointer打开读卡机的驱动,然后用>IoBuildDeviceIoControlRequest之类的构造IRP,然后>IoCallDriver进行调用,但是,原来的驱动也会对系统请求作出响 >应,你怎么处理 >两个驱动之间的关系呢? >> 我能不能用IoAttachDeviceToDeviceStack()将我的虚拟设备处理 >> 例层添加到Irp栈中, >> 如果可以,IoAttachDeviceToDeviceStack()的参数应该填什么? >看看DDK中关于Filter Driver的讨论。 |
|
|
14楼#
发布于:2004-04-15 17:52
你下层驱动也是pc/sc的吗?我的下层驱动不是,所以下层不会有反应,建议你把下层pc/sc的部分注释掉!
|
|