- if(!WriteFile(device_handle, packet->data, packet->len, &lenout, &overlapped)) {
- logger(LOG_ERR, "Error while writing to %s %s: %s", device_info, device, winerror(GetLastError()));
- return false;
+ /* Check if there is something in progress */
+
+ if(queue.len) {
+ DWORD size;
+ BOOL success = GetOverlappedResult(device_handle, &w_overlapped, &size, FALSE);
+ if(success) {
+ ResetEvent(&w_overlapped);
+ queue.len = 0;
+ } else {
+ int err = GetLastError();
+ if(err != ERROR_IO_INCOMPLETE) {
+ ifdebug(TRAFFIC) logger(LOG_DEBUG, "Error completing previously queued write: %s", winerror(err));
+ ResetEvent(&w_overlapped);
+ queue.len = 0;
+ } else {
+ ifdebug(TRAFFIC) logger(LOG_DEBUG, "Previous overlapped write still in progress");
+ // drop this packet
+ return true;
+ }
+ }
+ }
+
+ /* Otherwise, try to write. */
+
+ memcpy(queue.data, packet->data, packet->len);
+
+ if(!WriteFile(device_handle, queue.data, packet->len, &lenout, &w_overlapped)) {
+ int err = GetLastError();
+ if(err != ERROR_IO_PENDING) {
+ logger(LOG_ERR, "Error while writing to %s %s: %s", device_info, device, winerror(err));
+ return false;
+ }
+ // Write is being done asynchronously.
+ queue.len = packet->len;
+ } else {
+ // Write was completed immediately.
+ ResetEvent(&w_overlapped);