【高手】过来拿分!!!!

terroy 2004-09-15 04:11:54
最近看到WALTER ONEY的一篇Filtering Serial Port Modem Status的文章,文章中讲了关于解决两个应用程序同时操作对串口的共享冲突问题。
其中提到了一个EDO(external device object)的概念,大概的方法是在serial.sys的UpFilter.sys中建立两个DO,一个是常规的FIDO,一个就是EDO,众所周知,FIDO是没有自己的设备名的,而在这里替EDO设一个符号连接名,这样应用程序就可以访问EDO了,也就达到了共享串口的目的了。文章没有讲EDO的具体实现方法,呵呵,想听一下大家的看法。
先说一下自己的想法:
我认为EDO和FIDO在UpFilter中是共享一个设备扩展区(device_extension)的,因为他们处理IRP的方向都是下层的SERIAL
,我想在扩展区中加入虚拟的EDO的各种数据结构,并先创建常规的FIDO:deviceobject :IoCreateDevice(DriverObject,sizeof
(DEVICE_EXTENSION),
NULL, // No Name for fido
deviceType,
FILE_DEVICE_SECURE_OPEN,
FALSE,
&deviceObject);
随后再创建EDO:ExdeviceObject :
IoCreateDevice (DriverObject,
0, //don't allocate memory for Edo's extension
NULL, // here name the external device object
deviceType,
FILE_DEVICE_SECURE_OPEN,
FALSE,
&ExdeviceObject);
然后再:ExdeviceObject->DeviceExtension = deviceObject->DeviceExtension;
这样EDO和FIDO就有了相同的扩展。
还有特殊的IRP的处理,比如REMOVE设备,要怎样区分是针对EDO的还是针对下层的FDO的?又比如REMOVE了下层的FDO了那么EDO就不存在了,要做特殊处理吗?

请大家讨论讨论
...全文
44 点赞 收藏 回复
写回复
回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
相关推荐
发帖
驱动开发/核心开发
创建于2007-09-28

2.1w+

社区成员

硬件/嵌入开发 驱动开发/核心开发
申请成为版主
帖子事件
创建了帖子
2004-09-15 04:11
社区公告
暂无公告