阅读:1991回复:6
我特别想请教这个问题:一个驱动程序如何驱动多个设备,驱动一样,应用程序呢?
一个驱动程序如何驱动多个设备,驱动一样,应用程序呢?
我特别想请教这个问题? |
|
沙发#
发布于:2005-03-18 17:16
在驱动中创建多个设备对象代表不同设备,在设备扩展中设置相应的属性,然后在处理例程里进行分别判断处理即可.
|
|
|
板凳#
发布于:2005-03-19 11:55
在驱动中创建多个设备对象代表不同设备,在设备扩展中设置相应的属性,然后在处理例程里进行分别判断处理即可. 老大说的完全正确,补充一下,顺便用IoCreateSymbolicLink为不同设备创建不同的符号连接(可以按设备号排) |
|
|
地板#
发布于:2005-03-21 09:43
一个驱动程序如何驱动多个设备,驱动一样,应用程序呢? 为了把问题讲的清楚,请严格区分两个概念,驱动对象(driver)和设备(device)对象,二者都有自己的Extension。 对于这个问题,我想借用类和实例的概念类比一下,虽然并不完全准确,但这样便很清楚了 驱动相当于类,其中在DriverEntry中定义的分发例程,相当于类中的成员函数,驱动对象的Extension,相当于是类中的静态成员变量,所有设备对象处理请求时都共享它们 设备对象相当于实例,每次PnP发现新设备,就会调用一次AddDevice产生一个设备,AddDevice相当于类的建构函数。设备对象的Extension相当于成员变量,即每个实例不同,存储设备特定的信息 为了区分设备,肯定要在驱动对象(driver)Extension中存一个设备顺序号,这样每次找到一个设备,就将这个序号加1,这样可以为每个设备创建LPT1,LPT2...这样按顺序的设备名及创建对应的符号连接。也因此应用程序可以通过这样的不同的设备名和符号连接利用驱动和设备通讯 上面类比是本人自己的体会,可能有错误之处,万望各位大侠不吝赐教,切切!!! |
|
|
地下室#
发布于:2005-03-21 11:36
[quote]一个驱动程序如何驱动多个设备,驱动一样,应用程序呢? 为了把问题讲的清楚,请严格区分两个概念,驱动对象(driver)和设备(device)对象,二者都有自己的Extension。 对于这个问题,我想借用类和实例的概念类比一下,虽然并不完全准确,但这样便很清楚了 驱动相当于类,其中在DriverEntry中定义的分发例程,相当于类中的成员函数,驱动对象的Extension,相当于是类中的静态成员变量,所有设备对象处理请求时都共享它们 设备对象相当于实例,每次PnP发现新设备,就会调用一次AddDevice产生一个设备,AddDevice相当于类的建构函数。设备对象的Extension相当于成员变量,即每个实例不同,存储设备特定的信息 为了区分设备,肯定要在驱动对象(driver)Extension中存一个设备顺序号,这样每次找到一个设备,就将这个序号加1,这样可以为每个设备创建LPT1,LPT2...这样按顺序的设备名及创建对应的符号连接。也因此应用程序可以通过这样的不同的设备名和符号连接利用驱动和设备通讯 上面类比是本人自己的体会,可能有错误之处,万望各位大侠不吝赐教,切切!!! [/quote] 说的挺好的,很形象 |
|
|
5楼#
发布于:2005-04-01 09:50
非常感谢。
我是这样做的:因为我的设备是non pnp的isr卡,我就在adddevice函数中生成两个kpnpdevice,他们的symblic link name 分别是XIOCard0和XIOCard1,在应用程序中,我通过调用CreateFile打开两个设备,第一个设备能正常工作,但第二个设备能成功打开,但当调用DeviceIoControl给我的驱动传递参数时,机器就死 了,这是怎么回事呢,考虑了一个星期了,郁闷死了。请帮助我,再一次感谢 |
|
6楼#
发布于:2005-04-02 16:43
非常感谢!!:)
这个问题解决了,第二个卡的驱动得用driverstuido重新生成一遍,给不同的卡安上,靠guid区分就可以了,原来我只是把同一个驱动复制了两份,再改了guid重新编译后给两个卡安上,这样不好用。 是不是driverstuido已经自动完成了在驱动中创建多个设备对象代表不同设备的工作,并在驱动对象(driver)Extension中存一个设备顺序号阿,因为我没有改动DriverEntry的例程。 |
|