BUS_INTERFACE_STANDARD 结构 (wdm.h)
BUS_INTERFACE_STANDARD 接口结构使设备驱动程序能够直接调用父总线驱动程序例程。 此结构定义 GUID_BUS_INTERFACE_STANDARD 接口。
语法
typedef struct _BUS_INTERFACE_STANDARD {
USHORT Size;
USHORT Version;
PVOID Context;
PINTERFACE_REFERENCE InterfaceReference;
PINTERFACE_DEREFERENCE InterfaceDereference;
PTRANSLATE_BUS_ADDRESS TranslateBusAddress;
PGET_DMA_ADAPTER GetDmaAdapter;
PGET_SET_DEVICE_DATA SetBusData;
PGET_SET_DEVICE_DATA GetBusData;
} BUS_INTERFACE_STANDARD, *PBUS_INTERFACE_STANDARD;
成员
Size
此结构的大小(以字节为单位)。
Version
驱动程序定义的接口版本。
Context
指向特定于接口的上下文信息的指针。
InterfaceReference
指向 InterfaceReference 例程的指针,该例程递增接口的引用计数。
InterfaceDereference
指向接口引用计数递减的 InterfaceDereference 例程的指针。
TranslateBusAddress
指向 TranslateBusAddress 例程的指针,该例程将父总线上的地址转换为逻辑地址。
GetDmaAdapter
指向 GetDmaAdapter 例程的指针,该例程返回目标设备的 DMA 适配器结构 (DMA_ADAPTER) 。
SetBusData
指向 SetBusData 例程的指针,该例程将数据写入设备的配置空间。
GetBusData
指向从设备配置空间读取数据的 GetBusData 例程的指针。
注解
BUS_INTERFACE_STANDARD 结构是 INTERFACE 结构的扩展。
设备上的某些操作是为设备的父总线驱动程序保留的。 这些操作可能包括访问总线的设备特定配置空间或对 DMA 控制器进行编程。
若要从设备的配置空间读取或写入,设备驱动程序必须通过以下两种方式之一依赖于总线驱动程序的代理:
将 I/O 请求数据包 (IRP) IRP_MN_READ_CONFIG 并将 IRP_MN_WRITE_CONFIG 发送到总线驱动程序。
通过从总线驱动程序获取接口。 然后,设备驱动程序可以通过直接调用 BUS_INTERFACE_STANDARD 接口结构提供的总线驱动程序例程来访问其设备的配置空间。 其成员例程 GetBusData 和 SetBusData 可用于分别从设备配置空间读取和写入。
有关访问配置空间的方法的详细信息,请参阅 访问设备配置空间。
某些类型的设备(例如总线主控存储设备)具有板载 DMA 控制器。 但是,这些设备的设备驱动程序无法直接对这些 DMA 控制器进行编程。 相反,它们必须依赖于父总线驱动程序提供的例程。 若要使设备驱动程序为其设备对 DMA 控制器进行编程,必须先从父总线驱动程序请求适配器对象。 适配器对象包含总线驱动程序提供的例程,这些例程可用于对设备的 DMA 控制器进行编程。 设备驱动程序必须直接或间接依赖 BUS_INTERFACE_STANDARD来获取适配器对象。
如果驱动程序在 IRQL = PASSIVE_LEVEL 执行,则应通过调用 IoGetDmaAdapter 获取设备的 DMA 适配器对象。 IoGetDmaAdapter 检测总线驱动程序是否支持 BUS_INTERFACE_STANDARD 接口。 如果存在, IoGetDmaAdapter 会调用此接口的 GetDmaAdapter 成员指向的例程以获取适配器对象。 否则, IoGetDmaAdapter 调用等效的旧例程。
但是,如果驱动程序必须在 IRQL >= DISPATCH_LEVEL 运行时获取适配器对象,则它无法使用 IoGetDmaAdapter 执行此操作。 在这种情况下,驱动程序必须使用 IRP_MN_QUERY_INTERFACE 在 IRQL = PASSIVE_LEVEL 时查询 BUS_INTERFACE_STANDARD接口。
要求
要求 | 值 |
---|---|
标头 | wdm.h(包括 Wdm.h、Ntddk.h、Ntifs.h) |