desowin / usbpcap

USB packet capture for Windows
http://desowin.org/usbpcap
902 stars 170 forks source link

wrong datalength in isochronous packet #65

Closed zhixiongdu027 closed 5 years ago

zhixiongdu027 commented 5 years ago

Hi , I found a bug when urb function is URB_FUNCTION_ISOCH_TRANSFER

your code in USBPcapURB.c like the follow:

           else
            {
                packetHeader->header.dataLength = (UINT32)transfer->TransferBufferLength;

                transferBuffer =
                    USBPcapURBGetBufferPointer(transfer->TransferBufferLength,
                                               transfer->TransferBuffer,
                                               transfer->TransferBufferMDL);

            }

            packetHeader->startFrame      = transfer->StartFrame;
            packetHeader->numberOfPackets = transfer->NumberOfPackets;
            packetHeader->errorCount      = transfer->ErrorCount;

            for (i = 0; i < transfer->NumberOfPackets; i++)
            {
                packetHeader->packet[i].offset = transfer->IsoPacket[i].Offset;
                packetHeader->packet[i].length = transfer->IsoPacket[i].Length;
                packetHeader->packet[i].status = transfer->IsoPacket[i].Status;
            }

in your code , urb payload length from transfer->TransferBufferLength but , sometimes , the actual payload length is bigger then that value. I think get actual payload length should like the follow, or some other way.

         int i= transfer->NumberOfPackets-1;
         size_t actual_datalength = transfer->IsoPacket[i].Offset+ transfer->IsoPacket[i].Length;

you can find the data in my pcap file . new_zl.zip

desowin commented 5 years ago

THis was fixed in commit a1f99fe. Thanks to vector360 for the fix.

Next release will contain the fix.