why116600
驱动牛犊
驱动牛犊
  • 注册日期2011-11-24
  • 最后登录2012-02-15
  • 粉丝0
  • 关注0
  • 积分23分
  • 威望151点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2457回复:1

如何解决批量端口Buffer Overrun的问题?

楼主#
更多 发布于:2011-12-02 22:37
以下是我用WDF编写的一段读写USB批量端口的程序:

VOID
MTMUsb_EntWrite(
    IN WDFQUEUE Queue,
    IN WDFREQUEST Request,
    IN size_t Length
    )
{
 NTSTATUS status;
 WDF_MEMORY_DESCRIPTOR bufDesc;
 WDFDEVICE device;
 CHAR *buffer;
 size_t size;
    PDEVICE_CONTEXT pDeviceContext;
 device = WdfIoQueueGetDevice(Queue);
    pDeviceContext = GetDeviceContext(device);
 WdfRequestRetrieveInputBuffer(Request,Length,&buffer,&size);
 WDF_MEMORY_DESCRIPTOR_INIT_BUFFER(&bufDesc,buffer,size);
 status=WdfUsbTargetPipeWriteSynchronously(pDeviceContext->BulkWritePipe,NULL,NULL,&bufDesc,NULL);
 WdfRequestComplete(Request,status);
}
VOID
MTMUsb_EntRead(
    IN WDFQUEUE Queue,
    IN WDFREQUEST Request,
    IN size_t Length
    )
{
 ULONG readsize;
 NTSTATUS status;
 WDF_MEMORY_DESCRIPTOR bufDesc;
 WDFDEVICE device;
 CHAR *buffer;
 size_t size;
    PDEVICE_CONTEXT pDeviceContext;
 device = WdfIoQueueGetDevice(Queue);
    pDeviceContext = GetDeviceContext(device);
 WdfRequestRetrieveOutputBuffer(Request,Length,&buffer,&size);
 WDF_MEMORY_DESCRIPTOR_INIT_BUFFER(&bufDesc,buffer,size);
 status=WdfUsbTargetPipeReadSynchronously(pDeviceContext->BulkReadPipe,NULL,NULL,&bufDesc,&readsize);
 WdfRequestCompleteWithInformation(Request,status,readsize);
}
我的驱动对设备的第一次写和之后的第一次读都能成功,但是成功写完第二次后,第二次读的时候WdfUsbTargetPipeReadSynchronously就返回STATUS_UNSUCCESSFUL。我用BusHound监控的时候却发现第二次读的数据被捕获,然后下一列出现了这么一条记录:
  26.2  USTS   0c 00 00 c0               buffer overrun           4.2.0
应该是读写程序上的问题吧?我应该如何修改呢?
我的驱动安装,搞定你真不容易。。。
why116600
驱动牛犊
驱动牛犊
  • 注册日期2011-11-24
  • 最后登录2012-02-15
  • 粉丝0
  • 关注0
  • 积分23分
  • 威望151点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2011-12-03 17:44
补充
后来发现,并不是两次读完就出错,而是读的内容大于1字节就会buffer overrun。我第一次发的数据设备只会返回一个字节的内容,所以没有出错,第二次发的数据设备会返回32个字节,结果就出错。我发现这个情况是因为我后来直接发送原来第二次发送内容,在BusHound里面仍然能截获原来第二次读到的内容,但是紧接着又是那个buffer overrun的内容
我的驱动安装,搞定你真不容易。。。
游客

返回顶部