阅读:2567回复:1
如何解决批量端口Buffer Overrun的问题?
以下是我用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 应该是读写程序上的问题吧?我应该如何修改呢? |
|
|
沙发#
发布于:2011-12-03 17:44
补充
后来发现,并不是两次读完就出错,而是读的内容大于1字节就会buffer overrun。我第一次发的数据设备只会返回一个字节的内容,所以没有出错,第二次发的数据设备会返回32个字节,结果就出错。我发现这个情况是因为我后来直接发送原来第二次发送内容,在BusHound里面仍然能截获原来第二次读到的内容,但是紧接着又是那个buffer overrun的内容 |
|
|