EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL回调函数 (wdfio.h)

[适用于 KMDF 和 UMDF]

驱动程序的 EvtIoDeviceControl 事件回调函数处理指定的设备 I/O 控制请求。

语法

EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL EvtWdfIoQueueIoDeviceControl;

void EvtWdfIoQueueIoDeviceControl(
  [in] WDFQUEUE Queue,
  [in] WDFREQUEST Request,
  [in] size_t OutputBufferLength,
  [in] size_t InputBufferLength,
  [in] ULONG IoControlCode
)
{...}

参数

[in] Queue

与 I/O 请求关联的框架队列对象的句柄。

[in] Request

框架请求对象的句柄。

[in] OutputBufferLength

如果输出缓冲区可用,则请求的输出缓冲区的长度(以字节为单位)。

[in] InputBufferLength

如果输入缓冲区可用,则请求的输入缓冲区的长度(以字节为单位)。

[in] IoControlCode

与请求关联的驱动程序定义或系统定义的 I/O 控制代码(IOCTL)。

返回值

没有

注解

驱动程序在调用 WdfIoQueueCreate时注册 EvtIoDeviceControl 回调函数。 有关调用 WdfIoQueueCreate的详细信息,请参阅 创建 I/O 队列

如果驱动程序为设备的 I/O 队列注册了 EvtIoDeviceControl 回调函数,则回调函数将从队列接收每个 I/O 控制请求(IRP_MJ_DEVICE_CONTROL)。 有关详细信息,请参阅 请求处理程序

EvtIoDeviceControl 回调函数必须以某种方式处理每个收到的 I/O 请求。 有关详细信息,请参阅 处理 I/O 请求

当用户应用程序调用 DeviceIoControl(Microsoft Windows SDK 文档中所述)或另一个驱动程序通过调用 WdfIoTargetSendIoctlSynchronouslyWdfIoTargetFormatRequestForIoctl来创建请求时,驱动程序会收到 I/O 控制请求。

要执行的作类型取决于 IoControlCode 参数的值。 必须确定一组 IoControlCode 应用程序和其他驱动程序可以发送到驱动程序的值。 有关 IOCTL 的详细信息,请参阅 使用 I/O 控制代码

大多数设备 I/O 控制作都需要输入缓冲区、输出缓冲区或两者兼有。 有关驱动程序如何访问请求的缓冲区的信息,请参阅 访问 Framework-Based 驱动程序中的数据缓冲区。

驱动程序可用于访问请求的输入和输出缓冲区(如果存在)的技术取决于 IOCTL 的 TransferType 字段。 IOCTL 的 TransferType 字段的值可以是METHOD_BUFFERED、METHOD_DIRECT_IN、METHOD_DIRECT_OUT或METHOD_NEITHER。 有关 TransferType 字段的详细信息,请参阅 定义 I/O 控制代码

可以在 IRQL <= DISPATCH_LEVEL 调用 EvtIoDeviceControl 回调函数,除非设备或驱动程序 WDF_OBJECT_ATTRIBUTES 结构的 ExecutionLevel 成员设置为 WdfExecutionLevelPassive

如果 IRQL PASSIVE_LEVEL,则框架会在 关键区域调用回调函数

有关请求处理程序的 IRQL 级别的详细信息,请参阅 使用自动同步

驱动程序的 EvtIoDeviceControl 回调函数不应调用以下队列对象方法:

WdfIoQueueDrainSynchronously
WdfIoQueuePurgeSynchronously
WdfIoQueueStopSynchronously

要求

要求 价值
目标平台 普遍
最低 KMDF 版本 1.0
最低 UMDF 版本 2.0
标头 wdfio.h (包括 Wdf.h)
IRQL <= DISPATCH_LEVEL (请参阅“备注”部分)

另请参阅

EvtIoInternalDeviceControl

WDF_OBJECT_ATTRIBUTES

WdfIoQueueCreate

WdfIoTargetFormatRequestForIoctl

WdfIoTargetSendIoctlSynchronously