EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL回调函数 (wdfio.h)
[适用于 KMDF 和 UMDF]
驱动程序的 EvtIoInternalDeviceControl 事件回调函数处理包含内部设备 I/O 控制代码的 I/O 请求 (IOCTL) 。
语法
EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL EvtWdfIoQueueIoInternalDeviceControl;
void EvtWdfIoQueueIoInternalDeviceControl(
[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
与请求关联的驱动程序定义或系统定义的 IOCTL。
返回值
无
备注
驱动程序在调用 WdfIoQueueCreate 方法时注册 EvtIoInternalDeviceControl 回调函数。 有关调用 WdfIoQueueCreate 的详细信息,请参阅 创建 I/O 队列。
如果驱动程序为设备的 I/O 队列注册了 EvtIoInternalDeviceControl 回调函数,则回调函数将从队列接收每个内部 I/O 控制请求 (IRP_MJ_INTERNAL_DEVICE_CONTROL) 。 有关详细信息,请参阅 请求处理程序。
EvtIoInternalDeviceControl 回调函数必须以某种方式处理收到的每个 I/O 请求。 有关详细信息,请参阅 处理 I/O 请求。
当其他驱动程序通过调用 WdfIoTargetSendInternalIoctlSynchronously 或 WdfIoTargetFormatRequestForInternalIoctl 创建请求时,驱动程序会收到内部 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调用 EvtIoInternalDeviceControl 回调函数,除非设备或驱动程序WDF_OBJECT_ATTRIBUTES结构的 ExecutionLevel 成员设置为 WdfExecutionLevelPassive。 (如果驱动程序位于其驱动程序堆栈的顶部,则会在 IRQL = PASSIVE_LEVEL.) 调用回调函数
如果 IRQL 是PASSIVE_LEVEL,框架会在 关键区域内调用回调函数。
有关请求处理程序的 IRQL 级别的详细信息,请参阅 使用自动同步。
驱动程序的 EvtIoInternalDeviceControl 回调函数不应调用以下队列对象方法:
要求
要求 | 值 |
---|---|
目标平台 | 通用 |
最低 KMDF 版本 | 1.0 |
最低 UMDF 版本 | 2.0 |
标头 | wdfio.h (包括 Wdf.h) |
IRQL | <= DISPATCH_LEVEL (请参阅备注部分) |