WDF驱动DeviceIoControl的NEITHER读写示例
2026-06-18
0
0
NTSTATUS
RequestGetHidXferPacket_ToReadFromDevice(
_In_ WDFREQUEST Request,
_Out_ HID_XFER_PACKET *Packet
)
{
NTSTATUS status;
WDF_REQUEST_PARAMETERS params;
WDF_REQUEST_PARAMETERS_INIT(¶ms);
WdfRequestGetParameters(Request, ¶ms);
if (params.Parameters.DeviceIoControl.OutputBufferLength < sizeof(HID_XFER_PACKET)) {
status = STATUS_BUFFER_TOO_SMALL;
KdPrint(("RequestGetHidXferPacket: invalid HID_XFER_PACKET\n"));
return status;
}
RtlCopyMemory(Packet, WdfRequestWdmGetIrp(Request)->UserBuffer, sizeof(HID_XFER_PACKET));
return STATUS_SUCCESS;
}
NTSTATUS
RequestGetHidXferPacket_ToWriteToDevice(
_In_ WDFREQUEST Request,
_Out_ HID_XFER_PACKET *Packet
)
{
NTSTATUS status;
WDF_REQUEST_PARAMETERS params;
WDF_REQUEST_PARAMETERS_INIT(¶ms);
WdfRequestGetParameters(Request, ¶ms);
if (params.Parameters.DeviceIoControl.InputBufferLength < sizeof(HID_XFER_PACKET)) {
status = STATUS_BUFFER_TOO_SMALL;
KdPrint(("RequestGetHidXferPacket: invalid HID_XFER_PACKET\n"));
return status;
}
RtlCopyMemory(Packet, WdfRequestWdmGetIrp(Request)->UserBuffer, sizeof(HID_XFER_PACKET));
return STATUS_SUCCESS;
}
ToReadFromDevice(读):应用层发起的是一个 METHOD_NEITHER 方式的 IOCTL 读请求。驱动从 UserBuffer 中获取应用传入的缓冲区描述信息(比如期望读取的数据长度),然后填充数据并返回给应用。
ToWriteToDevice(写):应用层发起的是写请求(METHOD_NEITHER)。驱动从 UserBuffer 中获取应用要写入设备的数据。
在 Windows 驱动模型中,DeviceIoControl 是应用层与驱动层通信的主要方式之一。这两个函数处理的,正是这类请求在驱动侧的关键步骤:
- WdfRequestGetParameters:获取请求的参数,包括输入/输出缓冲区的大小。
- WdfRequestWdmGetIrp:获取底层的 WDM IRP 结构。
- IRP->UserBuffer:在 METHOD_NEITHER 方式下,直接指向应用层的用户模式缓冲区。
如果应用层使用 METHOD_BUFFERED 方式发送 IOCTL,数据会在系统缓冲区中,这时应该使用 WdfRequestRetrieveOutputBuffer 等 WDF 专用 API,而不是直接访问 UserBuffer。
WDF





