WDF
+ -

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(&params);
    WdfRequestGetParameters(Request, &params);

    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(&params);
    WdfRequestGetParameters(Request, &params);

    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。

0 篇笔记 写笔记

作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!