【高手】过来拿分!!!!
最近看到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就不存在了,要做特殊处理吗?
请大家讨论讨论