danxuezx
驱动牛犊
驱动牛犊
  • 注册日期2009-03-01
  • 最后登录2011-09-18
  • 粉丝0
  • 关注0
  • 积分75分
  • 威望601点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2546回复:6

各位驱动达人恳请给指点迷津

楼主#
更多 发布于:2010-04-20 08:22
我的理解:一个驱动创建一个设备(通过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文件。
nudtsong
驱动牛犊
驱动牛犊
  • 注册日期2004-11-16
  • 最后登录2011-03-02
  • 粉丝0
  • 关注0
  • 积分27分
  • 威望268点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2010-04-20 09:25
驱动程序与普通的应用程序不同,它的体系结构、外部接口和调用方式都是操作系统决定的,不能随意改变。如果驱动不首先创建一个设备,那么用户态的程序就没法发送IOCtrol请求。正如不先创建一个文件,就没办法读写它一样。
danxuezx
驱动牛犊
驱动牛犊
  • 注册日期2009-03-01
  • 最后登录2011-09-18
  • 粉丝0
  • 关注0
  • 积分75分
  • 威望601点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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;
//其它代码
}
nudtsong
驱动牛犊
驱动牛犊
  • 注册日期2004-11-16
  • 最后登录2011-03-02
  • 粉丝0
  • 关注0
  • 积分27分
  • 威望268点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地板#
发布于:2010-04-20 11:25
楼主是不是想用一个驱动创建出两个不同类型的设备?
danxuezx
驱动牛犊
驱动牛犊
  • 注册日期2009-03-01
  • 最后登录2011-09-18
  • 粉丝0
  • 关注0
  • 积分75分
  • 威望601点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2010-04-20 13:31
是这样的,一个是在AddDevice中创建的,另外一个是在提供的IoCtrol中创建的。
nudtsong
驱动牛犊
驱动牛犊
  • 注册日期2004-11-16
  • 最后登录2011-03-02
  • 粉丝0
  • 关注0
  • 积分27分
  • 威望268点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2010-04-21 11:55
我觉得这个要求好像难以实现,一般都是一个驱动(包括inf文件)对应一种设备(可以是多个)。
请大牛们给一个明确的结论吧。
danxuezx
驱动牛犊
驱动牛犊
  • 注册日期2009-03-01
  • 最后登录2011-09-18
  • 粉丝0
  • 关注0
  • 积分75分
  • 威望601点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2010-04-21 17:30
这个是可以实现的,VScsiDisk就是这么做的。它只有一个驱动,创建了两个不同类型的设备:
FILE_DEVICE_BUS_EXTENDER和FILE_DEVICE_DISK,并且并没有给FILE_DEVICE_DISK类型的设备提供驱动程序。发往FILE_DEVICE_DISK设备的pnp等都是在一个驱动里完成的。
游客

返回顶部