WDF 内部 IOCTL 不返回输出

Posted

技术标签:

【中文标题】WDF 内部 IOCTL 不返回输出【英文标题】:WDF Internal IOCTL Not Returning Output 【发布时间】:2016-07-27 20:25:33 【问题描述】:

我目前正在编写一个公开虚拟 COM 端口的驱动程序。在驱动程序中,我从端口 FDO 将内部 IOCTL 发送到堆栈下方,由 PDO IO 队列处理。由于某种原因,输出数据没有写入提供的输出内存。

我已通过 windbg 确认正在调用 IoCtl_Vcp_GetPortInfo(见下文),并且按预期工作。请求以 STATUS_SUCCESS 完成。在我调用 WdfRequestComplete 时,输出缓冲区具有有效数据。但是,当控制权返回到 GetPortInfo(见下文)时,提供的缓冲区尚未被覆盖。我通过访问接收缓冲区的硬件断点确认了这一点。在 WdfIoTargetSendInteralIoctlSynchronously 调用期间不会对其进行读取或写入。

负责发送IOCTL的代码如下:

NTSTATUS GetPortInfo(WDFDEVICE device, _Out_ PVCH_PORT_INFO port_info)

       NTSTATUS status;
       WDFIOTARGET io_target;
       WDF_MEMORY_DESCRIPTOR output_descriptor;
       PVOID buffer = ExAllocatePoolWithTag(NonPagedPool, sizeof(VCH_PORT_INFO), VCH_POOL_TAG);

       //WDF_MEMORY_DESCRIPTOR_INIT_BUFFER(&output_descriptor, port_info, sizeof(VCH_PORT_INFO));
       WDF_MEMORY_DESCRIPTOR_INIT_BUFFER(&output_descriptor, buffer, sizeof(VCH_PORT_INFO));

       io_target = WdfDeviceGetIoTarget(device);
       status = WdfIoTargetSendInternalIoctlSynchronously(io_target, NULL, IOCTL_VCP_INTERNAL_GET_PORT_INFO, NULL, &output_descriptor, NULL, NULL);
       DbgBreakPoint();
       if (!NT_SUCCESS(status))
              return status;

       memcpy(port_info, buffer, sizeof(VCH_PORT_INFO));
       ExFreePoolWithTag(buffer, VCH_POOL_TAG);

       return STATUS_SUCCESS;

处理 IOCTL 的代码:

NTSTATUS IoCtl_Vcp_GetPortInfo(WDFDEVICE device, WDFREQUEST request)

       NTSTATUS status;
       PVCH_PORT_INFO buffer;
       PPORT_PDO_DESCRIPTOR descriptor = PortPdoGetContext(device);

       status = WdfRequestRetrieveOutputBuffer(request, sizeof(VCH_PORT_INFO), (PVOID*)&buffer, NULL);
       if (!NT_SUCCESS(status))
              return status;

       buffer->Address = descriptor->Address;
       buffer->ForceComIndex = FALSE; // TODO: Implement
       buffer->Writeable = descriptor->Writeable;
       DbgBreakPoint();
       return STATUS_SUCCESS;

IOCTL 代码定义:

#define DEVICE_TYPE_VIRTUAL_COM_PORT 0xC51
#define IOCTL_VCP_INTERNAL_GET_PORT_INFO CTL_CODE(DEVICE_TYPE_VIRTUAL_COM_PORT, 0x30, METHOD_BUFFERED, FILE_READ_DATA)

【问题讨论】:

【参考方案1】:

使用输出字节数设置请求完成信息可以解决此问题。

【讨论】:

以上是关于WDF 内部 IOCTL 不返回输出的主要内容,如果未能解决你的问题,请参考以下文章

ioctl(sock, SIOCETHTOOL, &ifr) 为啥它总是返回-1

微软开源驱动程序模块框架WDF

解释 strace 输出

命令输出(stdout,stderr)未重定向到管道

shell 脚本 变量 获取程序输出结果异常分析

为啥 ioctl I_SENDFD 不返回任何权限(EPERM)? [复制]