阅读:2546回复:6
各位驱动达人恳请给指点迷津
我的理解:一个驱动创建一个设备(通过AddDevice例程创建的,通过其它方式创建的另说),它被系统认定为什么类型的设备应该是受class和classGUID决定的。
比如:inf中有如下信息: [Version] Signature="$WINDOWS NT$" Class=System ClassGuid={4D36E97D-E325-11CE-BFC1-08002BE10318} 那么安装完这个驱动后,在设备管理器的“系统设备”下可以看到这个驱动创建的设备(通过AddDevice例程创建的),因为这个设备的ClassGuid是系统设备类。 如果将上面的信息改成下面的样子: [Version] Signature="$WINDOWS NT$" Class=SCSIAdapter ClassGuid={4D36E97B-E325-11CE-BFC1-08002BE10318} 那么在安装完这个驱动后,在设备管理器的“SCSI和RAID控制器”下可以看到这个驱动创建的设备(通过AddDevice例程创建的)因为这个设备的ClassGuid是SCSIAdapter类。 上面是一个驱动通过AddDevice例程创建一个设备的情况。当然这是我的理解,不对的地方,恳请您给指点一下,非常感谢。 那么如果这个驱动通过另外的方式创建了设备,比如这个驱动提供了一个IOCtrol,当此IOCtrol被调用后,在此IOCtrol的处理函数中创建一个设备,或者是在这个驱动的IRP_MN_START_DEVICE处理结束之后创建一个设备,如果我想让这个设备被系统认作是SCSIAdapter设备,即在设备管理器的“SCSI和RAID控制器”下看到此设备,我都应该做些什么事情呢? 补充一下:另外创建的这个设备的处理函数比如pnp,power,IoCtrol我也会在这个驱动中完成,即这个设备不会有另一个驱动程序也不会有相应的inf文件。 |
|
沙发#
发布于:2010-04-20 09:25
驱动程序与普通的应用程序不同,它的体系结构、外部接口和调用方式都是操作系统决定的,不能随意改变。如果驱动不首先创建一个设备,那么用户态的程序就没法发送IOCtrol请求。正如不先创建一个文件,就没办法读写它一样。
|
|
板凳#
发布于:2010-04-20 09:44
是这样的,我的驱动程序在装载后会创建一个设备A,它的类型是FILE_DEVICE_BUS_EXTENDER。并且它提供了一个IOCtrl。
然后由另外一个应用程序,它会调用此驱动程序,向其发送自定义的IOCtrl,当驱动程序接收到此IOCtrl后,会创建另外一个设备B,它的类型是FILE_DEVICE_DISK。在创建完此设备之后会调用IoInvalidateDeviceRelations(DeviceAEx->UnderlyingPDO, BusRelations),这样pnp管理器会发IRP_MN_QUERY_DEVICE_RELATIONS给驱动程序创建的设备A,A在这里把B报给pnp管理器。接下来我要再做些什么让系统认为B就是一个磁盘设备呢? DeviceAEx->UnderlyingPDO是这么来的: 在驱动的AddDevice例程中: 下面的是示意代码,只是说明DeviceAEx->UnderlyingPDO保存的是什么。 typedef struct _FDO_DEVICE_DATA { PDEVICE_OBJECT UnderlyingPDO; }FDO_DEVICE_DATA, *PFDO_DEVICE_DATA; NTSTATUS Bus_AddDevice( __in PDRIVER_OBJECT DriverObject, __in PDEVICE_OBJECT PhysicalDeviceObject ) { //其它代码 PFDO_DEVICE_DATA DeviceAEx= NULL; IoCreateDevice ( DriverObject, // our driver object sizeof (FDO_DEVICE_DATA), // device object extension size &busFdoName, // FDOs do not have names FILE_DEVICE_BUS_EXTENDER, // We are a bus FILE_DEVICE_SECURE_OPEN, // TRUE, // our FDO is exclusive &deviceObject); DeviceAEx= (PFDO_DEVICE_DATA) deviceObject->DeviceExtension; //其它初始化代码 DeviceAEx->UnderlyingPDO = PhysicalDeviceObject; //其它代码 } |
|
地板#
发布于:2010-04-20 11:25
楼主是不是想用一个驱动创建出两个不同类型的设备?
|
|
地下室#
发布于:2010-04-20 13:31
是这样的,一个是在AddDevice中创建的,另外一个是在提供的IoCtrol中创建的。
|
|
5楼#
发布于:2010-04-21 11:55
我觉得这个要求好像难以实现,一般都是一个驱动(包括inf文件)对应一种设备(可以是多个)。
请大牛们给一个明确的结论吧。 |
|
6楼#
发布于:2010-04-21 17:30
这个是可以实现的,VScsiDisk就是这么做的。它只有一个驱动,创建了两个不同类型的设备:
FILE_DEVICE_BUS_EXTENDER和FILE_DEVICE_DISK,并且并没有给FILE_DEVICE_DISK类型的设备提供驱动程序。发往FILE_DEVICE_DISK设备的pnp等都是在一个驱动里完成的。 |
|