sinking
驱动牛犊
驱动牛犊
  • 注册日期2003-08-18
  • 最后登录2006-02-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2118回复:14

如何将一个在2k下虚拟设备与一个硬件设备联系起来!

楼主#
更多 发布于:2003-12-31 15:32
我在2k下写了一个虚拟读卡器的驱动,能模拟读卡器的行为。现在我想让其监测硬件USB Token的行为,把它的插拔当作卡的插拔。我在虚拟读卡器的DriverEntry中,用IoRegisterPlugPlayNotification()注册监听了Token的插拔。然后,我如何能够将发给虚拟读卡器的IRP转发给Token呢?我能不能用IoAttachDeviceToDeviceStack()将我的虚拟设备处理例层添加到Irp栈中,如果可以,IoAttachDeviceToDeviceStack()的参数应该填什么?
cool-net
驱动小牛
驱动小牛
  • 注册日期2003-03-18
  • 最后登录2010-01-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-12-31 19:31
>> 我如何能够将发给虚拟读卡器的IRP转发给Token呢?
可以用IoGetDeviceObjectPointer打开读卡机的驱动,然后用IoBuildDeviceIoControlRequest之类的构造IRP,然后IoCallDriver进行调用,但是,原来的驱动也会对系统请求作出响应,你怎么处理
两个驱动之间的关系呢?

>> 我能不能用IoAttachDeviceToDeviceStack()将我的虚拟设备处理
>> 例层添加到Irp栈中,
>> 如果可以,IoAttachDeviceToDeviceStack()的参数应该填什么?
看看DDK中关于Filter Driver的讨论。
有错误才会有进步,所以我的人生目标是: 错误不断,毁人不倦!
sinking
驱动牛犊
驱动牛犊
  • 注册日期2003-08-18
  • 最后登录2006-02-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-01-04 09:31
我的目的是将token的插拔模拟为读卡器中卡的插拔。即系统认为虚拟读卡器是一直连接在系统上的,token拔出后,系统只是认为读卡器中没有插入卡而已。如果将虚拟读卡器的驱动作为Token的过滤驱动,那么Token的插拔是否会直接读卡器的插拔呢?
cool-net
驱动小牛
驱动小牛
  • 注册日期2003-03-18
  • 最后登录2010-01-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-01-04 11:57
>> 我的目的是将token的插拔模拟为读卡器中卡的插拔。
你说的是Medium,不是Device,这种情况下你IoRegisterPlugPlayNotification应该是没用的吧?我觉得你要想监视这个应该象系统一样,用个定时器隔段时间发个CHECK_VERIFY请求到真正的读卡器驱动,或注意它返回的STATUS_VERIFY_REQUIRED。

>> 即系统认为虚拟读卡器是一直连接在系统上的,token拔出后,
>> 系统只是认为读卡器中没有插入卡而已。
是的,这种情况下不管是你的驱动还是真正的读卡器驱动都应该返回STATUS_NO_MEDIA_IN_DEVICE。

>> 如果将虚拟读卡器的驱动作为Token的过滤驱动,那么Token的
>> 插拔是否会直接读卡器的插拔呢?
没看懂。 :(

上面说的这些都认为真正的读卡器驱动是一个MASS STORAGE驱动,如果不是,那你应该根据读卡器的驱动形式来决定应该如何去做。
有错误才会有进步,所以我的人生目标是: 错误不断,毁人不倦!
sinking
驱动牛犊
驱动牛犊
  • 注册日期2003-08-18
  • 最后登录2006-02-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-01-06 13:48
Sorry, 我表述的不太清楚。我的目的是做一个虚拟读卡器的驱动,让系统始终认为系统上有一个读卡器存在。而当真实的物理读卡器插入时,系统只是认为有卡插入了虚拟读卡器。即系统与真实读卡器之间的通讯都要经由虚拟读卡器转发。我的目的时无论物理读卡器是否与系统连接,系统始终认为有一读卡器挂载在系统下。如果把虚拟读卡器作为物理读卡器的一个filter,那么是否当物理读卡器从系统remove时,虚拟读卡器的驱动也会随之卸载,而达不到我的目的。谢谢!
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-01-07 20:06
我认为如果你把虚拟读卡器做为物理读卡器的FILTER的话,卸载了物理读卡器,那么它的PNP的REMOVE请求的处理例程中卸载其FILTER是你的责任,如果你不卸栽应该这个FILTER应该是能继续工作的,你的FILTER在物理卡驱动和上层中间,它可以告诉上层任何它想的事件和数据,卸在掉物理读卡器驱动后,你的FILTER就直接处理一切请求,不发下去就行了
根据地的兄弟们,团结就是力量
sinking
驱动牛犊
驱动牛犊
  • 注册日期2003-08-18
  • 最后登录2006-02-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-01-08 08:53
谢谢你的回答,那么加载的时候呢,我需要虚拟读卡器从开机起一直挂载在系统下,而物理读卡器的驱动应该是在它插入时才加载的吧。而FILTER应该是和物理读卡器的驱动一块加载的吧。我能否单独先安装FILTER的驱动呢?

>>我认为如果你把虚拟读卡器做为物理读卡器的FILTER的话,卸载了>>物理读卡器,那么它的PNP的REMOVE请求的处理例程中卸载其>>FILTER是你的责任,如果你不卸栽应该这个FILTER应该是能继续工>>作的,你的FILTER在物理卡驱动和上层中间,它可以告诉上层任何>>它想的事件和数据,卸在掉物理读卡器驱动后,你的FILTER就直接>>处理一切请求,不发下去就行了.
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-01-09 11:25
可是可以先加载FILTER的驱动,不过如果单独加载你只能把它放到UNKNOW BUS下面,当你插上物理读卡器时物理读卡器所在总线(可能你的是USB吧)枚举到这个设备,它的驱动才被加载执行,那么这两个驱动的设备对象可能就没有放到一个设备栈中,你可能需要自己再做一次IOATTACHDEVICETODEVICESTACK把它们放到一起,但是注意不要内存泄漏,另外看能不能用IoGetDeviceObjectPointer自己来用IOCALLDRIVER来传递IRP.
这个问题你也可以再问问COOL_NET,他娃是专家:)
根据地的兄弟们,团结就是力量
sinking
驱动牛犊
驱动牛犊
  • 注册日期2003-08-18
  • 最后登录2006-02-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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,他娃是专家:)
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-01-09 21:06
9494:)
你自己在虚拟驱动里面构造IRP,传到物理读卡器,用IOCALLDRIVER就可以了
根据地的兄弟们,团结就是力量
sinking
驱动牛犊
驱动牛犊
  • 注册日期2003-08-18
  • 最后登录2006-02-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-01-11 15:16
呵呵,老乡,再请教个问题。我用IoAttachDeviceToDeviceStack将虚拟设备加入物理设备的IRP栈后,系统就不再让我停止该物理设备了。我应该如何在物理设备remove时正常通知虚拟设备。我刚刚开始学写驱动,对这些还不很明白,请多指教。
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-01-12 17:20
哈哈,我也刚弄了不久,2,3个月吧,大家共同探讨!
你的物理设备需要处理PNP事件,比如:IRP_MN_REMOVE_DEVICE等等,这些东西要先通过你的虚拟驱动(你注册相应的函数拦截它门)你在虚拟驱动里面就可以处理他们,包括发不发给下层,总之自由度是6,哈哈,随便你怎么样都可以,愉快三,祝新年快乐!GOOD LUCK
根据地的兄弟们,团结就是力量
assert&chuip
驱动牛犊
驱动牛犊
  • 注册日期2003-02-19
  • 最后登录2008-06-02
  • 粉丝0
  • 关注0
  • 积分48分
  • 威望9点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-03-01 19:47
我现在开发好了一个PC/SC的驱动程序,主要是用在USB KEY的方面,现在我的PC/SC的驱动程序已经开发好了,今我也是要实现这方面的东西,即:在USB KEY拔除后系统仍能检测到他的存在,在USB KEY插入后系统认为是SMARTCARD被插入,USB KEY拔除后系统认为是SMARTCARD拔除。
  哪位朋友能给我一些提示吗?
  
    
  assertchp@163.com
ou_star
驱动牛犊
驱动牛犊
  • 注册日期2003-06-06
  • 最后登录2005-06-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-04-15 15:37
我的解决方案:

1)IoRegisterPlugPlayNotification跟踪USB设备的插拔;
2、用自定义IO请求的方式通讯;
同下。
>>> 我如何能够将发给虚拟读卡器的IRP转发给Token呢?
>可以用IoGetDeviceObjectPointer打开读卡机的驱动,然后用>IoBuildDeviceIoControlRequest之类的构造IRP,然后>IoCallDriver进行调用,但是,原来的驱动也会对系统请求作出响
>应,你怎么处理
>两个驱动之间的关系呢?

>> 我能不能用IoAttachDeviceToDeviceStack()将我的虚拟设备处理
>> 例层添加到Irp栈中,
>> 如果可以,IoAttachDeviceToDeviceStack()的参数应该填什么?
>看看DDK中关于Filter Driver的讨论。

如果错过了太阳时你流了泪, 那末你也要错过群星了。
sinking
驱动牛犊
驱动牛犊
  • 注册日期2003-08-18
  • 最后登录2006-02-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-04-15 17:52
你下层驱动也是pc/sc的吗?我的下层驱动不是,所以下层不会有反应,建议你把下层pc/sc的部分注释掉!
游客

返回顶部