关闭

Windows CE 5.0:驱动程序---总线驱动程序

818人阅读 评论(0) 收藏 举报

 

 

发布日期: 11/1/2004 | 更新日期: 11/1/2004

总线驱动程序是加载驱动程序的任何软件。总线驱动程序具有下列一个或多个职责:

管理物理总线,例如 PC 卡、USB 或 PCI。

在总线驱动程序没有直接管理的物理总线上加载驱动程序。

这方面的一个示例为 Bus Enumerator,它是一个加载内置驱动程序和 PCI 总线驱动程序的总线驱动程序。

直接调用 ActivateDeviceEx 以加载设备驱动程序。

所加载的设备驱动程序可能通过另一个设备驱动程序来间接管理硬件。

要允许用 CreateFile 访问设备驱动程序,总线驱动程序应当向 Device Manager 提供足够的信息,以便创建与总线相关的名称以及启用设备句柄。它们还应当提供足够的信息,以便向驱动程序和应用程序标识它们自己以进行总线控制操作。总线驱动程序可以为驱动程序指定与总线相关的名称,但是为了使驱动程序和应用程序能够访问总线驱动程序以进行总线控制操作,总线驱动程序必须公开流接口。$bus 命名空间提供了一种在设备上执行与典型设备操作不同的操作的方式。通过控制对 $bus 命名空间的访问,还可以为系统提供安全性。

启用对使用 $bus 命名空间的驱动程序的访问

1.

在驱动程序的 IClass 注册表项中公布 DMCLASS_PROTECTEDBUSNAMESPACE GUID。

如果驱动程序没有公布 DMCLASS_PROTECTEDBUSNAMESPACE,则设备管理器无法知道驱动程序能够区分对设备的正常访问和系统访问。必须将 DMCLASS_PROTECTEDBUSNAMESPACE 与驱动程序的 $bus 接口相关联。

如果驱动程序公布 DMCLASS_PROTECTEDBUSNAMESPACE 接口,则用 dwAccess 参数中的 DEVACCESS_BUSNAMESPACE 位组来调用驱动程序的 XXX_Open (Device Manager) 入口点。驱动程序必须跟踪用该位组打开了哪些句柄,以便它可以适当地接受或拒绝 IOCTL 和其他操作。

即使驱动程序没有公布 DMCLASS_PROTECTEDBUSNAMESPACE,它的 $bus 名称仍然可用来与驱动程序的父总线驱动程序进行通讯,以获得诸如加载、卸载和电源管理之类的服务。

2.

通过在 IClass 注册表项值之后添加 =%b 来公开 $bus 装入点。

驱动程序的 IClass 注册表项值必须在 IClass 注册表值之后具有 =%b。下面的注册表项示例说明了在何处放置 =%b。

"IClass"=multi_sz:"{B3CC6EBA-5507-4196-8E41-2BF42E4A47C9}=%b","{6F40791D-300E-44E4-BC38-E0E63CA8375C}=%b"

有关装入点和设备文件名称的详细信息,请参阅 Device File Names

总线驱动程序命名约定

总线驱动程序为从属驱动程序提供它们自己的总线名称,并且为最近加载的驱动程序提供总线名称。通常,总线名称应当派生于总线类型、总线编号和其他总线特有标识符(例如,设备号和功能号)。总线驱动程序命名约定假设特定类型的所有总线都具有唯一的编号。当该标识符组合唯一时,不会发生名称冲突。例如,Bus Enumerator 的不同调用应当视为不同的总线并分配不同的总线编号。

总线编号与 INTERFACE_TYPE 枚举兼容。可以为硬件添加新的标识符。

通常,总线名称与基础总线结构相关。如果应用程序枚举总线上的设备驱动程序,则这可以简化系统结构。总线名称与流接口名称不同,因为并非所有设备驱动程序都向应用程序公开流接口。但是,总线名称确实必须与基础总线相关。例如,应用程序可能通过调用 ActivateDeviceEx 直接加载设备驱动程序。这些应用程序本身可能没有公开总线接口,但是应用程序加载的设备驱动程序可能公开总线接口。

对于应用程序加载的驱动程序而言,驱动程序的流接口名称用来生成唯一的总线名称。例如,如果应用程序加载“COM1:”或“/$device/COM1”,则它的总线名称会是“/$bus/COM1”。这是一种安全的方法,因为流接口名称在整个系统中唯一。

有关设备文件名称的信息,请参阅 Device File Names

总线驱动程序注册表条目

设备管理器将总线信息与驱动程序的 fsdev_t 结构(该结构是设备管理器所固有的)相关联。下表显示了总线驱动程序在 Active 注册表项中放置的信息。

注册表子项 说明

BusDriver

总线驱动程序的总线名称。假设为 "/$bus"。示例值有 "PCI_0_1_0"

BusName

驱动程序正在加载的总线名称。示例值有 "PCMCIA_0_1_1"。不同的总线可能采用不同的方式组织名称。例如,USB HID 设备可能将该名称组织为 "HID_interface_collection"

有关设备管理器注册表项的信息,请参阅 Device Manager Registry Keys

总线驱动程序电源回调

总线驱动程序 IST 没有机会来卸载驱动程序以便防止电源回调调用。这是因为线程在电源回调期间不运行。对于可安装的 ISR 而言,电源回调可能试图在硬件继续执行时访问丢失的设备。要防止电源回调访问丢失的设备,父总线上的设备驱动程序可以调用 IOCTL_BUS_IS_CHILD_REMOVED 以确定它的设备是否丢失。电源回调可以调用该 IOCTL。有关该 IOCTL 和其他相关 IOCTL 的详细信息,请参阅 CEDDK Bus Access IOCTLs

有关挂起和恢复电源回调的信息,请参阅 Suspend and Resume Power Callbacks

另请参阅

Driver Architecture | CEDDK Bus Access Reference

 
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:39801次
    • 积分:575
    • 等级:
    • 排名:千里之外
    • 原创:4篇
    • 转载:15篇
    • 译文:10篇
    • 评论:2条