- if(!WriteFile(device_handle, DATA(packet), packet->len, &outlen, &overlapped)) {
+ if(device_write_packet.len > 0) {
+ /* Make sure the previous write operation is finished before we start the next one;
+ otherwise we end up with multiple write ops referencing the same OVERLAPPED structure,
+ which according to MSDN is a no-no. */
+
+ if(!GetOverlappedResult(device_handle, &device_write_overlapped, &outlen, FALSE)) {
+ int log_level = (GetLastError() == ERROR_IO_INCOMPLETE) ? DEBUG_TRAFFIC : DEBUG_ALWAYS;
+ logger(log_level, LOG_ERR, "Error while checking previous write to %s %s: %s", device_info, device, winerror(GetLastError()));
+ return false;
+ }
+ }
+
+ /* Copy the packet, since the write operation might still be ongoing after we return. */
+
+ memcpy(&device_write_packet, packet, sizeof *packet);
+
+ if(WriteFile(device_handle, DATA(&device_write_packet), device_write_packet.len, &outlen, &device_write_overlapped))
+ device_write_packet.len = 0;
+ else if (GetLastError() != ERROR_IO_PENDING) {