DRIVER_CONTROL回调函数 (wdm.h)
此例程启动 DMA 数据传输或数据传输作。
语法
DRIVER_CONTROL DriverControl;
IO_ALLOCATION_ACTION DriverControl(
[in] _DEVICE_OBJECT *DeviceObject,
[in, out] _IRP *Irp,
[in] PVOID MapRegisterBase,
[in] PVOID Context
)
{...}
参数
[in] DeviceObject
调用方提供的指向 DEVICE_OBJECT 结构的指针。 这是目标设备的设备对象,以前由驱动程序的 AddDevice 例程创建。
[in, out] Irp
调用方提供的指向 IRP 结构的指针。 Irp 等于注册回调例程时 DeviceObject 的 CurrentIrp 成员的值。
[in] MapRegisterBase
对于 AdapterControl,这是一个调用方提供的不透明值,表示系统为此传输作分配的映射寄存器。 驱动程序将此值传递给 FlushAdapterBuffers、FreeMapRegisters,以及 MapTransfer。
如果 ControllerControl,则不使用此方法。
[in] Context
调用方提供的指向驱动程序定义的上下文信息的指针,在上一次调用中指定用于 AllocateAdapterChannel。
返回值
例程必须返回由 IO_ALLOCATION_ACTION 枚举定义的值之一。 总线主设备的驱动程序返回 DeallocateObject 或 DeallocateObjectKeepRegisters;使用系统 DMA 的驱动程序返回 KeepObject。
言论
若要为特定设备对象注册 AdapterControl 例程,驱动程序必须调用 IoGetDmaAdapter 以获取适配器对象,然后调用 AllocateAdapterChannel 请求使用适配器并提供 AdapterControl 例程的地址。 当适配器可用时,系统将调用 AdapterControl 例程。
如果 AdapterControl 已由 StartIo 例程注册,则保证 Irp 参数指向 StartIo 例程当前正在处理的 IRP。 否则,驱动程序必须先设置设备对象结构的 CurrentIrp 成员,然后才能调用 AllocateAdapterChannel。
有关实现 AdapterControl 例程的详细信息,请参阅 编写 AdapterControl 例程。
驱动程序的 ControllerControl 例程在 IRQL = DISPATCH_LEVEL 的任意线程上下文中执行。
若要为特定设备对象注册 ControllerControl 例程,驱动程序必须调用 IoCreateController 以获取控制器对象,然后调用 IoAllocateController 请求使用控制器并提供 ControllerControl 例程的地址。 当控制器可用时,系统将调用 ControllerControl 例程。
有关实现 ControllerControl 例程的详细信息,请参阅 编写 ControllerControl 例程。 另请参阅 控制器对象。
DRIVER_CONTROL函数类型在 Wdm.h 头文件中定义。 若要在运行代码分析工具时更准确地识别错误,请务必将 _Use_decl_annotations_
注释添加到函数定义。
_Use_decl_annotations_
批注可确保使用应用于头文件中DRIVER_CONTROL函数类型的批注。 有关函数声明要求的详细信息,请参阅 使用 WDM 驱动程序的函数角色类型来声明函数。 有关 _Use_decl_annotations_
的信息,请参阅 批注函数行为。
例子
若要定义回调例程,必须先提供一个函数声明,用于标识要定义的回调例程的类型。 Windows 为驱动程序提供一组回调函数类型。 使用回调函数类型声明函数有助于 驱动程序代码分析、静态驱动程序验证程序(SDV)和其他验证工具查找错误,这是为 Windows作系统编写驱动程序的要求。
例如,若要定义名为 MyAdapterControl
的 AdapterControl 回调例程,请使用DRIVER_CONTROL类型,如以下代码示例所示:
DRIVER_CONTROL MyAdapterControl;
然后,按如下所示实现回调例程:
_Use_decl_annotations_
IO_ALLOCATION_ACTION
MyAdapterControl(
struct _DEVICE_OBJECT *DeviceObject,
struct _IRP *Irp,
PVOID MapRegisterBase,
PVOID Context
)
{
// Function body
}
要求
要求 | 价值 |
---|---|
目标平台 | 桌面 |
标头 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |
IRQL | 在DISPATCH_LEVEL调用。 |