[Com0com-cvs] com0com/sys adddev.c, 1.14, 1.15 bufutils.c, 1.6, 1.7 com0com.h, 1.25, 1.26 delay.c,
The virtual serial port driver for Windows.
Brought to you by:
vfrolov
From: Vyacheslav F. <vf...@us...> - 2006-06-21 16:24:10
|
Update of /cvsroot/com0com/com0com/sys In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv30702 Modified Files: adddev.c bufutils.c com0com.h delay.c delay.h fileinfo.c handflow.c handflow.h io.c ioctl.c openclos.c read.c startirp.c timeout.c timeout.h write.c Log Message: Fixed possible BSOD after one port of pair removal Index: fileinfo.c =================================================================== RCS file: /cvsroot/com0com/com0com/sys/fileinfo.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** fileinfo.c 28 Sep 2005 10:06:42 -0000 1.1 --- fileinfo.c 21 Jun 2006 16:23:57 -0000 1.2 *************** *** 2,6 **** * $Id$ * ! * Copyright (c) 2005 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify --- 2,6 ---- * $Id$ * ! * Copyright (c) 2005-2006 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.2 2006/06/21 16:23:57 vfrolov + * Fixed possible BSOD after one port of pair removal + * * Revision 1.1 2005/09/28 10:06:42 vfrolov * Implemented IRP_MJ_QUERY_INFORMATION and IRP_MJ_SET_INFORMATION *************** *** 33,41 **** #define FILE_ID 0xA ! NTSTATUS FdoPortQueryInformation(PC0C_FDOPORT_EXTENSION pDevExt, IN PIRP pIrp) { NTSTATUS status; ! if ((pDevExt->handFlow.ControlHandShake & SERIAL_ERROR_ABORT) && pDevExt->pIoPortLocal->errors) { pIrp->IoStatus.Information = 0; status = STATUS_CANCELLED; --- 36,44 ---- #define FILE_ID 0xA ! NTSTATUS FdoPortQueryInformation(PC0C_IO_PORT pIoPortLocal, IN PIRP pIrp) { NTSTATUS status; ! if ((pIoPortLocal->handFlow.ControlHandShake & SERIAL_ERROR_ABORT) && pIoPortLocal->errors) { pIrp->IoStatus.Information = 0; status = STATUS_CANCELLED; *************** *** 70,78 **** } ! NTSTATUS FdoPortSetInformation(PC0C_FDOPORT_EXTENSION pDevExt, IN PIRP pIrp) { NTSTATUS status; ! if ((pDevExt->handFlow.ControlHandShake & SERIAL_ERROR_ABORT) && pDevExt->pIoPortLocal->errors) { status = STATUS_CANCELLED; } else { --- 73,81 ---- } ! NTSTATUS FdoPortSetInformation(PC0C_IO_PORT pIoPortLocal, IN PIRP pIrp) { NTSTATUS status; ! if ((pIoPortLocal->handFlow.ControlHandShake & SERIAL_ERROR_ABORT) && pIoPortLocal->errors) { status = STATUS_CANCELLED; } else { *************** *** 109,115 **** case C0C_DOTYPE_FP: if (code == IRP_MJ_QUERY_INFORMATION) ! status = FdoPortQueryInformation((PC0C_FDOPORT_EXTENSION)pDevExt, pIrp); else ! status = FdoPortSetInformation((PC0C_FDOPORT_EXTENSION)pDevExt, pIrp); break; default: --- 112,118 ---- case C0C_DOTYPE_FP: if (code == IRP_MJ_QUERY_INFORMATION) ! status = FdoPortQueryInformation(((PC0C_FDOPORT_EXTENSION)pDevExt)->pIoPortLocal, pIrp); else ! status = FdoPortSetInformation(((PC0C_FDOPORT_EXTENSION)pDevExt)->pIoPortLocal, pIrp); break; default: Index: openclos.c =================================================================== RCS file: /cvsroot/com0com/com0com/sys/openclos.c,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** openclos.c 8 Jun 2006 11:33:35 -0000 1.13 --- openclos.c 21 Jun 2006 16:23:57 -0000 1.14 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.14 2006/06/21 16:23:57 vfrolov + * Fixed possible BSOD after one port of pair removal + * * Revision 1.13 2006/06/08 11:33:35 vfrolov * Fixed bugs with amountInWriteQueue *************** *** 81,89 **** } - if (!pDevExt->pIoPortRemote->pDevExt) { - InterlockedDecrement(&pDevExt->openCount); - return STATUS_INSUFFICIENT_RESOURCES; - } - switch (MmQuerySystemSize()) { case MmLargeSystem: --- 84,87 ---- *************** *** 136,143 **** pDevExt->pIoPortLocal->escapeChar = 0; RtlZeroMemory(&pDevExt->pIoPortLocal->perfStats, sizeof(pDevExt->pIoPortLocal->perfStats)); ! pDevExt->handFlow.XoffLimit = size >> 3; ! pDevExt->handFlow.XonLimit = size >> 1; ! SetHandFlow(pDevExt, NULL, &queueToComplete); KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); --- 134,141 ---- pDevExt->pIoPortLocal->escapeChar = 0; RtlZeroMemory(&pDevExt->pIoPortLocal->perfStats, sizeof(pDevExt->pIoPortLocal->perfStats)); ! pDevExt->pIoPortLocal->handFlow.XoffLimit = size >> 3; ! pDevExt->pIoPortLocal->handFlow.XonLimit = size >> 1; ! SetHandFlow(pDevExt->pIoPortLocal, NULL, &queueToComplete); KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); *************** *** 159,163 **** pDevExt->pIoPortLocal->writeHoldingRemote = 0; pDevExt->pIoPortLocal->sendXonXoff = 0; ! SetModemStatus(pDevExt->pIoPortRemote, 0, C0C_MSB_CTS | C0C_MSB_DSR, &queueToComplete); FreeBuffer(&pDevExt->pIoPortLocal->readBuf); SetBreakHolding(pDevExt->pIoPortLocal, FALSE); --- 157,161 ---- pDevExt->pIoPortLocal->writeHoldingRemote = 0; pDevExt->pIoPortLocal->sendXonXoff = 0; ! SetModemStatus(pDevExt->pIoPortLocal->pIoPortRemote, 0, C0C_MSB_CTS | C0C_MSB_DSR, &queueToComplete); FreeBuffer(&pDevExt->pIoPortLocal->readBuf); SetBreakHolding(pDevExt->pIoPortLocal, FALSE); Index: ioctl.c =================================================================== RCS file: /cvsroot/com0com/com0com/sys/ioctl.c,v retrieving revision 1.22 retrieving revision 1.23 diff -C2 -d -r1.22 -r1.23 *** ioctl.c 19 May 2006 15:02:03 -0000 1.22 --- ioctl.c 21 Jun 2006 16:23:57 -0000 1.23 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.23 2006/06/21 16:23:57 vfrolov + * Fixed possible BSOD after one port of pair removal + * * Revision 1.22 2006/05/19 15:02:03 vfrolov * Implemented IOCTL_SERIAL_GET_MODEM_CONTROL *************** *** 106,114 **** ULONG code = pIrpStack->Parameters.DeviceIoControl.IoControlCode; KIRQL oldIrql; pIrp->IoStatus.Information = 0; ! if ((pDevExt->handFlow.ControlHandShake & SERIAL_ERROR_ABORT) && ! pDevExt->pIoPortLocal->errors && code != IOCTL_SERIAL_GET_COMMSTATUS) { status = STATUS_CANCELLED; --- 109,119 ---- ULONG code = pIrpStack->Parameters.DeviceIoControl.IoControlCode; KIRQL oldIrql; + PC0C_IO_PORT pIoPortLocal; pIrp->IoStatus.Information = 0; + pIoPortLocal = pDevExt->pIoPortLocal; ! if ((pIoPortLocal->handFlow.ControlHandShake & SERIAL_ERROR_ABORT) && ! pIoPortLocal->errors && code != IOCTL_SERIAL_GET_COMMSTATUS) { status = STATUS_CANCELLED; *************** *** 120,124 **** case IOCTL_SERIAL_CLR_RTS: KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! switch (pDevExt->handFlow.FlowReplace & SERIAL_RTS_MASK) { case SERIAL_RTS_HANDSHAKE: case SERIAL_TRANSMIT_TOGGLE: --- 125,129 ---- case IOCTL_SERIAL_CLR_RTS: KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! switch (pIoPortLocal->handFlow.FlowReplace & SERIAL_RTS_MASK) { case SERIAL_RTS_HANDSHAKE: case SERIAL_TRANSMIT_TOGGLE: *************** *** 132,144 **** SetModemStatus( ! pDevExt->pIoPortRemote, code == IOCTL_SERIAL_SET_RTS ? C0C_MSB_CTS : 0, C0C_MSB_CTS, &queueToComplete); ! if (pDevExt->pIoPortRemote->tryWrite) { ReadWrite( ! pDevExt->pIoPortLocal, FALSE, ! pDevExt->pIoPortRemote, FALSE, &queueToComplete); } --- 137,149 ---- SetModemStatus( ! pIoPortLocal->pIoPortRemote, code == IOCTL_SERIAL_SET_RTS ? C0C_MSB_CTS : 0, C0C_MSB_CTS, &queueToComplete); ! if (pIoPortLocal->pIoPortRemote->tryWrite) { ReadWrite( ! pIoPortLocal, FALSE, ! pIoPortLocal->pIoPortRemote, FALSE, &queueToComplete); } *************** *** 152,156 **** case IOCTL_SERIAL_CLR_DTR: KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! switch (pDevExt->handFlow.ControlHandShake & SERIAL_DTR_MASK) { case SERIAL_DTR_HANDSHAKE: KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); --- 157,161 ---- case IOCTL_SERIAL_CLR_DTR: KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! switch (pIoPortLocal->handFlow.ControlHandShake & SERIAL_DTR_MASK) { case SERIAL_DTR_HANDSHAKE: KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); *************** *** 163,175 **** SetModemStatus( ! pDevExt->pIoPortRemote, code == IOCTL_SERIAL_SET_DTR ? C0C_MSB_DSR : 0, C0C_MSB_DSR, &queueToComplete); ! if (pDevExt->pIoPortRemote->tryWrite) { ReadWrite( ! pDevExt->pIoPortLocal, FALSE, ! pDevExt->pIoPortRemote, FALSE, &queueToComplete); } --- 168,180 ---- SetModemStatus( ! pIoPortLocal->pIoPortRemote, code == IOCTL_SERIAL_SET_DTR ? C0C_MSB_DSR : 0, C0C_MSB_DSR, &queueToComplete); ! if (pIoPortLocal->pIoPortRemote->tryWrite) { ReadWrite( ! pIoPortLocal, FALSE, ! pIoPortLocal->pIoPortRemote, FALSE, &queueToComplete); } *************** *** 190,194 **** KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! modemStatusRemote = pDevExt->pIoPortRemote->modemStatus; KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); --- 195,199 ---- KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! modemStatusRemote = pIoPortLocal->pIoPortRemote->modemStatus; KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); *************** *** 211,220 **** KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! SetXonXoffHolding(pDevExt->pIoPortLocal, C0C_XCHAR_ON); ! if (pDevExt->pIoPortLocal->tryWrite) { ReadWrite( ! pDevExt->pIoPortLocal, FALSE, ! pDevExt->pIoPortRemote, FALSE, &queueToComplete); } --- 216,225 ---- KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! SetXonXoffHolding(pIoPortLocal, C0C_XCHAR_ON); ! if (pIoPortLocal->tryWrite) { ReadWrite( ! pIoPortLocal, FALSE, ! pIoPortLocal->pIoPortRemote, FALSE, &queueToComplete); } *************** *** 225,229 **** case IOCTL_SERIAL_SET_XOFF: KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! SetXonXoffHolding(pDevExt->pIoPortLocal, C0C_XCHAR_OFF); KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); break; --- 230,234 ---- case IOCTL_SERIAL_SET_XOFF: KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! SetXonXoffHolding(pIoPortLocal, C0C_XCHAR_OFF); KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); break; *************** *** 235,244 **** KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! SetBreakHolding(pDevExt->pIoPortLocal, TRUE); ! UpdateTransmitToggle(pDevExt, &queueToComplete); ReadWrite( ! pDevExt->pIoPortLocal, FALSE, ! pDevExt->pIoPortRemote, FALSE, &queueToComplete); --- 240,249 ---- KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! SetBreakHolding(pIoPortLocal, TRUE); ! UpdateTransmitToggle(pIoPortLocal, &queueToComplete); ReadWrite( ! pIoPortLocal, FALSE, ! pIoPortLocal->pIoPortRemote, FALSE, &queueToComplete); *************** *** 254,264 **** KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! SetBreakHolding(pDevExt->pIoPortLocal, FALSE); ! UpdateTransmitToggle(pDevExt, &queueToComplete); ! if (pDevExt->pIoPortLocal->tryWrite || pDevExt->pIoPortRemote->tryWrite) { ReadWrite( ! pDevExt->pIoPortLocal, FALSE, ! pDevExt->pIoPortRemote, FALSE, &queueToComplete); } --- 259,269 ---- KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! SetBreakHolding(pIoPortLocal, FALSE); ! UpdateTransmitToggle(pIoPortLocal, &queueToComplete); ! if (pIoPortLocal->tryWrite || pIoPortLocal->pIoPortRemote->tryWrite) { ReadWrite( ! pIoPortLocal, FALSE, ! pIoPortLocal->pIoPortRemote, FALSE, &queueToComplete); } *************** *** 274,278 **** KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! *(PULONG)pIrp->AssociatedIrp.SystemBuffer = pDevExt->pIoPortLocal->modemStatus; KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); pIrp->IoStatus.Information = sizeof(ULONG); --- 279,283 ---- KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! *(PULONG)pIrp->AssociatedIrp.SystemBuffer = pIoPortLocal->modemStatus; KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); pIrp->IoStatus.Information = sizeof(ULONG); *************** *** 317,332 **** if (*pSysBuf & SERIAL_PURGE_RXABORT) ! CancelQueue(&pDevExt->pIoPortLocal->irpQueues[C0C_QUEUE_READ], &queueToComplete); if (*pSysBuf & SERIAL_PURGE_TXABORT) ! CancelQueue(&pDevExt->pIoPortLocal->irpQueues[C0C_QUEUE_WRITE], &queueToComplete); if (*pSysBuf & SERIAL_PURGE_RXCLEAR) { ! PurgeBuffer(&pDevExt->pIoPortLocal->readBuf); ! UpdateHandFlow(pDevExt, TRUE, &queueToComplete); ! if (pDevExt->pIoPortLocal->tryWrite || pDevExt->pIoPortRemote->tryWrite) { ReadWrite( ! pDevExt->pIoPortLocal, FALSE, ! pDevExt->pIoPortRemote, FALSE, &queueToComplete); } --- 322,337 ---- if (*pSysBuf & SERIAL_PURGE_RXABORT) ! CancelQueue(&pIoPortLocal->irpQueues[C0C_QUEUE_READ], &queueToComplete); if (*pSysBuf & SERIAL_PURGE_TXABORT) ! CancelQueue(&pIoPortLocal->irpQueues[C0C_QUEUE_WRITE], &queueToComplete); if (*pSysBuf & SERIAL_PURGE_RXCLEAR) { ! PurgeBuffer(&pIoPortLocal->readBuf); ! UpdateHandFlow(pIoPortLocal, TRUE, &queueToComplete); ! if (pIoPortLocal->tryWrite || pIoPortLocal->pIoPortRemote->tryWrite) { ReadWrite( ! pIoPortLocal, FALSE, ! pIoPortLocal->pIoPortRemote, FALSE, &queueToComplete); } *************** *** 341,345 **** case IOCTL_SERIAL_GET_COMMSTATUS: { PSERIAL_STATUS pSysBuf; - PC0C_IO_PORT pIoPort; PIRP pIrpWrite; --- 346,349 ---- *************** *** 351,361 **** pSysBuf = (PSERIAL_STATUS)pIrp->AssociatedIrp.SystemBuffer; RtlZeroMemory(pSysBuf, sizeof(*pSysBuf)); - pIoPort = pDevExt->pIoPortLocal; KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! pSysBuf->AmountInInQueue = (ULONG)C0C_BUFFER_BUSY(&pIoPort->readBuf); ! pIrpWrite = pIoPort->irpQueues[C0C_QUEUE_WRITE].pCurrent; if (pIrpWrite) { --- 355,364 ---- pSysBuf = (PSERIAL_STATUS)pIrp->AssociatedIrp.SystemBuffer; RtlZeroMemory(pSysBuf, sizeof(*pSysBuf)); KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! pSysBuf->AmountInInQueue = (ULONG)C0C_BUFFER_BUSY(&pIoPortLocal->readBuf); ! pIrpWrite = pIoPortLocal->irpQueues[C0C_QUEUE_WRITE].pCurrent; if (pIrpWrite) { *************** *** 369,386 **** } ! pSysBuf->AmountInOutQueue = pIoPort->amountInWriteQueue; ! pSysBuf->HoldReasons = pIoPort->writeHolding; ! if ((pIoPort->pDevExt->handFlow.ControlHandShake & SERIAL_DSR_SENSITIVITY) && ! (pIoPort->modemStatus & C0C_MSB_DSR) == 0) { pSysBuf->HoldReasons |= SERIAL_RX_WAITING_FOR_DSR; } ! if (pIoPort->writeHoldingRemote & SERIAL_TX_WAITING_FOR_XON) pSysBuf->HoldReasons |= SERIAL_TX_WAITING_XOFF_SENT; ! pSysBuf->Errors = pIoPort->errors; ! pIoPort->errors = 0; KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); --- 372,389 ---- } ! pSysBuf->AmountInOutQueue = pIoPortLocal->amountInWriteQueue; ! pSysBuf->HoldReasons = pIoPortLocal->writeHolding; ! if ((pIoPortLocal->handFlow.ControlHandShake & SERIAL_DSR_SENSITIVITY) && ! (pIoPortLocal->modemStatus & C0C_MSB_DSR) == 0) { pSysBuf->HoldReasons |= SERIAL_RX_WAITING_FOR_DSR; } ! if (pIoPortLocal->writeHoldingRemote & SERIAL_TX_WAITING_FOR_XON) pSysBuf->HoldReasons |= SERIAL_TX_WAITING_XOFF_SENT; ! pSysBuf->Errors = pIoPortLocal->errors; ! pIoPortLocal->errors = 0; KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); *************** *** 416,420 **** KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! status = SetHandFlow(pDevExt, pSysBuf, &queueToComplete); KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); --- 419,423 ---- KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! status = SetHandFlow(pIoPortLocal, pSysBuf, &queueToComplete); KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); *************** *** 429,433 **** KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! *(PSERIAL_HANDFLOW)pIrp->AssociatedIrp.SystemBuffer = pDevExt->handFlow; KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); pIrp->IoStatus.Information = sizeof(SERIAL_HANDFLOW); --- 432,436 ---- KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! *(PSERIAL_HANDFLOW)pIrp->AssociatedIrp.SystemBuffer = pIoPortLocal->handFlow; KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); pIrp->IoStatus.Information = sizeof(SERIAL_HANDFLOW); *************** *** 454,460 **** KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! if (pDevExt->pIoPortLocal->escapeChar && ! ((pDevExt->pIoPortLocal->escapeChar == pSysBuf->XoffChar) || ! (pDevExt->pIoPortLocal->escapeChar == pSysBuf->XonChar))) { status = STATUS_INVALID_PARAMETER; --- 457,463 ---- KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! if (pIoPortLocal->escapeChar && ! ((pIoPortLocal->escapeChar == pSysBuf->XoffChar) || ! (pIoPortLocal->escapeChar == pSysBuf->XonChar))) { status = STATUS_INVALID_PARAMETER; *************** *** 462,466 **** if (status == STATUS_SUCCESS) ! pDevExt->specialChars = *pSysBuf; KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); --- 465,469 ---- if (status == STATUS_SUCCESS) ! pIoPortLocal->specialChars = *pSysBuf; KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); *************** *** 474,478 **** KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! *(PSERIAL_CHARS)pIrp->AssociatedIrp.SystemBuffer = pDevExt->specialChars; KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); --- 477,481 ---- KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! *(PSERIAL_CHARS)pIrp->AssociatedIrp.SystemBuffer = pIoPortLocal->specialChars; KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); *************** *** 493,499 **** KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! if (escapeChar && ((escapeChar == pDevExt->specialChars.XoffChar) || ! (escapeChar == pDevExt->specialChars.XonChar) || ! (pDevExt->handFlow.FlowReplace & SERIAL_ERROR_CHAR))) { status = STATUS_INVALID_PARAMETER; --- 496,502 ---- KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! if (escapeChar && ((escapeChar == pIoPortLocal->specialChars.XoffChar) || ! (escapeChar == pIoPortLocal->specialChars.XonChar) || ! (pIoPortLocal->handFlow.FlowReplace & SERIAL_ERROR_CHAR))) { status = STATUS_INVALID_PARAMETER; *************** *** 501,505 **** if (status == STATUS_SUCCESS) { ! pDevExt->pIoPortLocal->escapeChar = escapeChar; pIrp->IoStatus.Information = sizeof(UCHAR); } --- 504,508 ---- if (status == STATUS_SUCCESS) { ! pIoPortLocal->escapeChar = escapeChar; pIrp->IoStatus.Information = sizeof(UCHAR); } *************** *** 637,641 **** pSysBuf->CurrentTxQueue = 0; ! pSysBuf->CurrentRxQueue = (ULONG)C0C_BUFFER_SIZE(&pDevExt->pIoPortLocal->readBuf); pIrp->IoStatus.Information = sizeof(SERIAL_COMMPROP); --- 640,644 ---- pSysBuf->CurrentTxQueue = 0; ! pSysBuf->CurrentRxQueue = (ULONG)C0C_BUFFER_SIZE(&pIoPortLocal->readBuf); pIrp->IoStatus.Information = sizeof(SERIAL_COMMPROP); *************** *** 661,665 **** } ! pReadBuf = &pDevExt->pIoPortLocal->readBuf; KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); --- 664,668 ---- } ! pReadBuf = &pIoPortLocal->readBuf; KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); *************** *** 684,695 **** if (SetNewBufferBase(pReadBuf, pBase, pSysBuf->InSize)) { ! pDevExt->handFlow.XoffLimit = pSysBuf->InSize >> 3; ! pDevExt->handFlow.XonLimit = pSysBuf->InSize >> 1; ! SetLimit(pDevExt); ! UpdateHandFlow(pDevExt, TRUE, &queueToComplete); ! if (pDevExt->pIoPortLocal->tryWrite || pDevExt->pIoPortRemote->tryWrite) { ReadWrite( ! pDevExt->pIoPortLocal, FALSE, ! pDevExt->pIoPortRemote, FALSE, &queueToComplete); } --- 687,698 ---- if (SetNewBufferBase(pReadBuf, pBase, pSysBuf->InSize)) { ! pIoPortLocal->handFlow.XoffLimit = pSysBuf->InSize >> 3; ! pIoPortLocal->handFlow.XonLimit = pSysBuf->InSize >> 1; ! SetLimit(pIoPortLocal); ! UpdateHandFlow(pIoPortLocal, TRUE, &queueToComplete); ! if (pIoPortLocal->tryWrite || pIoPortLocal->pIoPortRemote->tryWrite) { ReadWrite( ! pIoPortLocal, FALSE, ! pIoPortLocal->pIoPortRemote, FALSE, &queueToComplete); } *************** *** 707,711 **** KeAcquireSpinLock(&pDevExt->controlLock, &oldIrql); ! *(PSERIALPERF_STATS)pIrp->AssociatedIrp.SystemBuffer = pDevExt->pIoPortLocal->perfStats; KeReleaseSpinLock(&pDevExt->controlLock, oldIrql); pIrp->IoStatus.Information = sizeof(SERIALPERF_STATS); --- 710,714 ---- KeAcquireSpinLock(&pDevExt->controlLock, &oldIrql); ! *(PSERIALPERF_STATS)pIrp->AssociatedIrp.SystemBuffer = pIoPortLocal->perfStats; KeReleaseSpinLock(&pDevExt->controlLock, oldIrql); pIrp->IoStatus.Information = sizeof(SERIALPERF_STATS); *************** *** 715,719 **** case IOCTL_SERIAL_CLEAR_STATS: KeAcquireSpinLock(&pDevExt->controlLock, &oldIrql); ! RtlZeroMemory(&pDevExt->pIoPortLocal->perfStats, sizeof(pDevExt->pIoPortLocal->perfStats)); KeReleaseSpinLock(&pDevExt->controlLock, oldIrql); break; --- 718,722 ---- case IOCTL_SERIAL_CLEAR_STATS: KeAcquireSpinLock(&pDevExt->controlLock, &oldIrql); ! RtlZeroMemory(&pIoPortLocal->perfStats, sizeof(pIoPortLocal->perfStats)); KeReleaseSpinLock(&pDevExt->controlLock, oldIrql); break; Index: com0com.h =================================================================== RCS file: /cvsroot/com0com/com0com/sys/com0com.h,v retrieving revision 1.25 retrieving revision 1.26 diff -C2 -d -r1.25 -r1.26 *** com0com.h 5 Apr 2006 07:22:15 -0000 1.25 --- com0com.h 21 Jun 2006 16:23:57 -0000 1.26 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.26 2006/06/21 16:23:57 vfrolov + * Fixed possible BSOD after one port of pair removal + * * Revision 1.25 2006/04/05 07:22:15 vfrolov * Replaced flipXoffLimit flag by writeHoldingRemote to correct handFlow changing *************** *** 180,183 **** --- 183,189 ---- struct _C0C_FDOPORT_EXTENSION *pDevExt; + struct _C0C_IO_PORT *pIoPortRemote; + PKSPIN_LOCK pIoLock; + #define C0C_QUEUE_READ 0 #define C0C_QUEUE_WRITE 1 *************** *** 200,203 **** --- 206,212 ---- struct _C0C_ADAPTIVE_DELAY *pWriteDelay; + SERIAL_HANDFLOW handFlow; + SERIAL_CHARS specialChars; + ULONG errors; ULONG amountInWriteQueue; *************** *** 230,236 **** struct _C0C_FDOBUS_EXTENSION *pBusExt; - PKSPIN_LOCK pIoLock; PC0C_IO_PORT pIoPortLocal; - PC0C_IO_PORT pIoPortRemote; } C0C_PDOPORT_EXTENSION, *PC0C_PDOPORT_EXTENSION; --- 239,243 ---- *************** *** 240,244 **** PKSPIN_LOCK pIoLock; PC0C_IO_PORT pIoPortLocal; - PC0C_IO_PORT pIoPortRemote; UNICODE_STRING ntDeviceName; --- 247,250 ---- *************** *** 253,259 **** SERIAL_BAUD_RATE baudRate; SERIAL_LINE_CONTROL lineControl; - SERIAL_CHARS specialChars; SERIAL_TIMEOUTS timeouts; - SERIAL_HANDFLOW handFlow; } C0C_FDOPORT_EXTENSION, *PC0C_FDOPORT_EXTENSION; --- 259,263 ---- Index: startirp.c =================================================================== RCS file: /cvsroot/com0com/com0com/sys/startirp.c,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** startirp.c 8 Jun 2006 11:33:35 -0000 1.10 --- startirp.c 21 Jun 2006 16:23:57 -0000 1.11 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.11 2006/06/21 16:23:57 vfrolov + * Fixed possible BSOD after one port of pair removal + * * Revision 1.10 2006/06/08 11:33:35 vfrolov * Fixed bugs with amountInWriteQueue *************** *** 262,266 **** if (length) { pDevExt->pIoPortLocal->amountInWriteQueue += length; ! UpdateTransmitToggle(pDevExt, &queueToComplete); } } --- 265,269 ---- if (length) { pDevExt->pIoPortLocal->amountInWriteQueue += length; ! UpdateTransmitToggle(pDevExt->pIoPortLocal, &queueToComplete); } } Index: delay.c =================================================================== RCS file: /cvsroot/com0com/com0com/sys/delay.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** delay.c 10 Jan 2006 10:17:23 -0000 1.2 --- delay.c 21 Jun 2006 16:23:57 -0000 1.3 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.3 2006/06/21 16:23:57 vfrolov + * Fixed possible BSOD after one port of pair removal + * * Revision 1.2 2006/01/10 10:17:23 vfrolov * Implemented flow control and handshaking *************** *** 46,50 **** IN PVOID systemArgument2) { ! PC0C_FDOPORT_EXTENSION pDevExt; PC0C_ADAPTIVE_DELAY pWriteDelay; --- 49,53 ---- IN PVOID systemArgument2) { ! PC0C_IO_PORT pIoPort; PC0C_ADAPTIVE_DELAY pWriteDelay; *************** *** 53,58 **** UNREFERENCED_PARAMETER(systemArgument2); ! pDevExt = (PC0C_FDOPORT_EXTENSION)deferredContext; ! pWriteDelay = pDevExt->pIoPortLocal->pWriteDelay; if (pWriteDelay) { --- 56,61 ---- UNREFERENCED_PARAMETER(systemArgument2); ! pIoPort = (PC0C_IO_PORT)deferredContext; ! pWriteDelay = pIoPort->pWriteDelay; if (pWriteDelay) { *************** *** 62,66 **** InitializeListHead(&queueToComplete); ! KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); if (pWriteDelay->started) { --- 65,69 ---- InitializeListHead(&queueToComplete); ! KeAcquireSpinLock(pIoPort->pIoLock, &oldIrql); if (pWriteDelay->started) { *************** *** 68,73 **** status = ReadWrite( ! pDevExt->pIoPortRemote, FALSE, ! pDevExt->pIoPortLocal, FALSE, &queueToComplete); --- 71,76 ---- status = ReadWrite( ! pIoPort->pIoPortRemote, FALSE, ! pIoPort, FALSE, &queueToComplete); *************** *** 76,80 **** } ! KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); FdoPortCompleteQueue(&queueToComplete); --- 79,83 ---- } ! KeReleaseSpinLock(pIoPort->pIoLock, oldIrql); FdoPortCompleteQueue(&queueToComplete); *************** *** 102,106 **** } ! NTSTATUS AllocWriteDelay(IN PC0C_FDOPORT_EXTENSION pDevExt) { PC0C_ADAPTIVE_DELAY pWriteDelay; --- 105,109 ---- } ! NTSTATUS AllocWriteDelay(PC0C_IO_PORT pIoPort) { PC0C_ADAPTIVE_DELAY pWriteDelay; *************** *** 114,132 **** KeInitializeTimer(&pWriteDelay->timer); ! KeInitializeDpc(&pWriteDelay->timerDpc, WriteDelayRoutine, pDevExt); ! pDevExt->pIoPortLocal->pWriteDelay = pWriteDelay; return STATUS_SUCCESS; } ! VOID FreeWriteDelay(IN PC0C_FDOPORT_EXTENSION pDevExt) { PC0C_ADAPTIVE_DELAY pWriteDelay; ! pWriteDelay = pDevExt->pIoPortLocal->pWriteDelay; if (pWriteDelay) { ! pDevExt->pIoPortLocal->pWriteDelay = NULL; StopWriteDelayTimer(pWriteDelay); ExFreePool(pWriteDelay); --- 117,135 ---- KeInitializeTimer(&pWriteDelay->timer); ! KeInitializeDpc(&pWriteDelay->timerDpc, WriteDelayRoutine, pIoPort); ! pIoPort->pWriteDelay = pWriteDelay; return STATUS_SUCCESS; } ! VOID FreeWriteDelay(PC0C_IO_PORT pIoPort) { PC0C_ADAPTIVE_DELAY pWriteDelay; ! pWriteDelay = pIoPort->pWriteDelay; if (pWriteDelay) { ! pIoPort->pWriteDelay = NULL; StopWriteDelayTimer(pWriteDelay); ExFreePool(pWriteDelay); Index: bufutils.c =================================================================== RCS file: /cvsroot/com0com/com0com/sys/bufutils.c,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** bufutils.c 17 May 2006 15:28:03 -0000 1.6 --- bufutils.c 21 Jun 2006 16:23:57 -0000 1.7 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.7 2006/06/21 16:23:57 vfrolov + * Fixed possible BSOD after one port of pair removal + * * Revision 1.6 2006/05/17 15:28:03 vfrolov * Implemented SERIAL_DSR_SENSITIVITY *************** *** 103,107 **** RtlZeroMemory(pFlowFilter, sizeof(*pFlowFilter)); ! pHandFlow = &pIoPort->pDevExt->handFlow; if ((pHandFlow->ControlHandShake & SERIAL_DSR_SENSITIVITY) && --- 106,110 ---- RtlZeroMemory(pFlowFilter, sizeof(*pFlowFilter)); ! pHandFlow = &pIoPort->handFlow; if ((pHandFlow->ControlHandShake & SERIAL_DSR_SENSITIVITY) && *************** *** 114,119 **** if (pHandFlow->FlowReplace & SERIAL_AUTO_TRANSMIT) { pFlowFilter->flags |= C0C_FLOW_FILTER_AUTO_TRANSMIT; ! pFlowFilter->xonChar = pIoPort->pDevExt->specialChars.XonChar; ! pFlowFilter->xoffChar = pIoPort->pDevExt->specialChars.XoffChar; } --- 117,122 ---- if (pHandFlow->FlowReplace & SERIAL_AUTO_TRANSMIT) { pFlowFilter->flags |= C0C_FLOW_FILTER_AUTO_TRANSMIT; ! pFlowFilter->xonChar = pIoPort->specialChars.XonChar; ! pFlowFilter->xoffChar = pIoPort->specialChars.XoffChar; } *************** *** 126,130 **** if (pIoPort->waitMask & SERIAL_EV_RXFLAG) { pFlowFilter->flags |= C0C_FLOW_FILTER_EV_RXFLAG; ! pFlowFilter->eventChar = pIoPort->pDevExt->specialChars.EventChar; } --- 129,133 ---- if (pIoPort->waitMask & SERIAL_EV_RXFLAG) { pFlowFilter->flags |= C0C_FLOW_FILTER_EV_RXFLAG; ! pFlowFilter->eventChar = pIoPort->specialChars.EventChar; } Index: adddev.c =================================================================== RCS file: /cvsroot/com0com/com0com/sys/adddev.c,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** adddev.c 29 Mar 2006 09:39:28 -0000 1.14 --- adddev.c 21 Jun 2006 16:23:57 -0000 1.15 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.15 2006/06/21 16:23:57 vfrolov + * Fixed possible BSOD after one port of pair removal + * * Revision 1.14 2006/03/29 09:39:28 vfrolov * Fixed possible usage uninitialized portName *************** *** 90,100 **** VOID RemoveFdoPort(IN PC0C_FDOPORT_EXTENSION pDevExt) { ! if (pDevExt->pIoPortLocal && pDevExt->pIoPortLocal->pDevExt) { pDevExt->pIoPortLocal->pDevExt = NULL; - FreeTimeouts(pDevExt); } - FreeWriteDelay(pDevExt); - if (pDevExt->mappedSerialDevice) RtlDeleteRegistryValue(RTL_REGISTRY_DEVICEMAP, C0C_SERIAL_DEVICEMAP, --- 93,102 ---- VOID RemoveFdoPort(IN PC0C_FDOPORT_EXTENSION pDevExt) { ! if (pDevExt->pIoPortLocal) { ! FreeTimeouts(pDevExt->pIoPortLocal); ! FreeWriteDelay(pDevExt->pIoPortLocal); pDevExt->pIoPortLocal->pDevExt = NULL; } if (pDevExt->mappedSerialDevice) RtlDeleteRegistryValue(RTL_REGISTRY_DEVICEMAP, C0C_SERIAL_DEVICEMAP, *************** *** 256,265 **** } - pDevExt->pIoLock = ((PC0C_PDOPORT_EXTENSION)pPhDevObj->DeviceExtension)->pIoLock; pDevExt->pIoPortLocal = ((PC0C_PDOPORT_EXTENSION)pPhDevObj->DeviceExtension)->pIoPortLocal; ! pDevExt->pIoPortRemote = ((PC0C_PDOPORT_EXTENSION)pPhDevObj->DeviceExtension)->pIoPortRemote; if (emuBR) { ! if (NT_SUCCESS(AllocWriteDelay(pDevExt))) Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"Enabled baudrate emulation"); else --- 258,266 ---- } pDevExt->pIoPortLocal = ((PC0C_PDOPORT_EXTENSION)pPhDevObj->DeviceExtension)->pIoPortLocal; ! pDevExt->pIoLock = pDevExt->pIoPortLocal->pIoLock; if (emuBR) { ! if (NT_SUCCESS(AllocWriteDelay(pDevExt->pIoPortLocal))) Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"Enabled baudrate emulation"); else *************** *** 277,287 **** } ! AllocTimeouts(pDevExt); KeInitializeSpinLock(&pDevExt->controlLock); ! pDevExt->specialChars.XonChar = 0x11; ! pDevExt->specialChars.XoffChar = 0x13; ! pDevExt->handFlow.ControlHandShake = SERIAL_DTR_CONTROL; ! pDevExt->handFlow.FlowReplace = SERIAL_RTS_CONTROL; pDevExt->lineControl.WordLength = 7; pDevExt->lineControl.Parity = EVEN_PARITY; --- 278,293 ---- } ! AllocTimeouts(pDevExt->pIoPortLocal); KeInitializeSpinLock(&pDevExt->controlLock); ! ! RtlZeroMemory(&pDevExt->pIoPortLocal->specialChars, sizeof(pDevExt->pIoPortLocal->specialChars)); ! pDevExt->pIoPortLocal->specialChars.XonChar = 0x11; ! pDevExt->pIoPortLocal->specialChars.XoffChar = 0x13; ! ! RtlZeroMemory(&pDevExt->pIoPortLocal->handFlow, sizeof(pDevExt->pIoPortLocal->handFlow)); ! pDevExt->pIoPortLocal->handFlow.ControlHandShake = SERIAL_DTR_CONTROL; ! pDevExt->pIoPortLocal->handFlow.FlowReplace = SERIAL_RTS_CONTROL; ! pDevExt->lineControl.WordLength = 7; pDevExt->lineControl.Parity = EVEN_PARITY; *************** *** 351,355 **** IN PC0C_FDOBUS_EXTENSION pBusExt, IN PC0C_IO_PORT pIoPortLocal, - IN PC0C_IO_PORT pIoPortRemote, OUT PC0C_PDOPORT_EXTENSION *ppDevExt) { --- 357,360 ---- *************** *** 359,363 **** UNICODE_STRING ntDeviceName; PC0C_PDOPORT_EXTENSION pDevExt = NULL; - int i; status = STATUS_SUCCESS; --- 364,367 ---- *************** *** 400,414 **** pDevExt->pBusExt = pBusExt; - pDevExt->pIoLock = &pBusExt->ioLock; pDevExt->pIoPortLocal = pIoPortLocal; - pDevExt->pIoPortRemote = pIoPortRemote; - - for (i = 0 ; i < C0C_QUEUE_SIZE ; i++) { - InitializeListHead(&pIoPortLocal->irpQueues[i].queue); - pIoPortLocal->irpQueues[i].pCurrent = NULL; - #if DBG - pIoPortLocal->irpQueues[i].started = FALSE; - #endif /* DBG */ - } Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"AddPdoPort OK"); --- 404,408 ---- *************** *** 549,560 **** for (i = 0 ; i < 2 ; i++) { ! BOOLEAN isA = (BOOLEAN)(i ? FALSE : TRUE); status = AddPdoPort(pDrvObj, num, ! isA, pDevExt, ! &pDevExt->childs[i].ioPort, ! &pDevExt->childs[(i + 1) % 2].ioPort, &pDevExt->childs[i].pDevExt); --- 543,568 ---- for (i = 0 ; i < 2 ; i++) { ! PC0C_IO_PORT pIoPort; ! int j; ! ! pIoPort = &pDevExt->childs[i].ioPort; ! ! pIoPort->pIoLock = &pDevExt->ioLock; ! ! for (j = 0 ; j < C0C_QUEUE_SIZE ; j++) { ! InitializeListHead(&pIoPort->irpQueues[j].queue); ! pIoPort->irpQueues[j].pCurrent = NULL; ! #if DBG ! pIoPort->irpQueues[j].started = FALSE; ! #endif /* DBG */ ! } ! ! pIoPort->pIoPortRemote = &pDevExt->childs[(i + 1) % 2].ioPort; status = AddPdoPort(pDrvObj, num, ! (BOOLEAN)(i ? FALSE : TRUE), pDevExt, ! pIoPort, &pDevExt->childs[i].pDevExt); Index: io.c =================================================================== RCS file: /cvsroot/com0com/com0com/sys/io.c,v retrieving revision 1.27 retrieving revision 1.28 diff -C2 -d -r1.27 -r1.28 *** io.c 17 May 2006 15:31:14 -0000 1.27 --- io.c 21 Jun 2006 16:23:57 -0000 1.28 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.28 2006/06/21 16:23:57 vfrolov + * Fixed possible BSOD after one port of pair removal + * * Revision 1.27 2006/05/17 15:31:14 vfrolov * Implemented SERIAL_TRANSMIT_TOGGLE *************** *** 277,281 **** if (pDataWrite->type == RW_DATA_TYPE_IRP) { pDataWrite->data.irp.pIrp->IoStatus.Information = information; ! pReadIoPort->pDevExt->pIoPortRemote->amountInWriteQueue -= (ULONG)writeDone; } --- 280,284 ---- if (pDataWrite->type == RW_DATA_TYPE_IRP) { pDataWrite->data.irp.pIrp->IoStatus.Information = information; ! pReadIoPort->pIoPortRemote->amountInWriteQueue -= (ULONG)writeDone; } *************** *** 287,291 **** OnRxBreak(pReadIoPort, pQueueToComplete); else ! pReadIoPort->pDevExt->pIoPortRemote->perfStats.TransmittedCount += (ULONG)writeDone; } --- 290,294 ---- OnRxBreak(pReadIoPort, pQueueToComplete); else ! pReadIoPort->pIoPortRemote->perfStats.TransmittedCount += (ULONG)writeDone; } *************** *** 305,312 **** pReadIoPort->errors |= SERIAL_ERROR_QUEUEOVERRUN; ! if (pReadIoPort->pDevExt->handFlow.FlowReplace & SERIAL_ERROR_CHAR) ! WriteMandatoryToBuffer(&pReadIoPort->readBuf, pReadIoPort->pDevExt->specialChars.ErrorChar); ! if (pReadIoPort->pDevExt->handFlow.ControlHandShake & SERIAL_ERROR_ABORT) { CancelQueue(&pReadIoPort->irpQueues[C0C_QUEUE_READ], pQueueToComplete); CancelQueue(&pReadIoPort->irpQueues[C0C_QUEUE_WRITE], pQueueToComplete); --- 308,315 ---- pReadIoPort->errors |= SERIAL_ERROR_QUEUEOVERRUN; ! if (pReadIoPort->handFlow.FlowReplace & SERIAL_ERROR_CHAR) ! WriteMandatoryToBuffer(&pReadIoPort->readBuf, pReadIoPort->specialChars.ErrorChar); ! if (pReadIoPort->handFlow.ControlHandShake & SERIAL_ERROR_ABORT) { CancelQueue(&pReadIoPort->irpQueues[C0C_QUEUE_READ], pQueueToComplete); CancelQueue(&pReadIoPort->irpQueues[C0C_QUEUE_WRITE], pQueueToComplete); *************** *** 365,369 **** if (pDataWrite->type == RW_DATA_TYPE_IRP) { pDataWrite->data.irp.pIrp->IoStatus.Information = information; ! pReadIoPort->pDevExt->pIoPortRemote->amountInWriteQueue -= (ULONG)writeDone; } --- 368,372 ---- if (pDataWrite->type == RW_DATA_TYPE_IRP) { pDataWrite->data.irp.pIrp->IoStatus.Information = information; ! pReadIoPort->pIoPortRemote->amountInWriteQueue -= (ULONG)writeDone; } *************** *** 380,384 **** OnRxBreak(pReadIoPort, pQueueToComplete); else ! pReadIoPort->pDevExt->pIoPortRemote->perfStats.TransmittedCount += (ULONG)writeDone; } --- 383,387 ---- OnRxBreak(pReadIoPort, pQueueToComplete); else ! pReadIoPort->pIoPortRemote->perfStats.TransmittedCount += (ULONG)writeDone; } *************** *** 445,449 **** if (pDataWrite->type == RW_DATA_TYPE_IRP) { pDataWrite->data.irp.pIrp->IoStatus.Information += writeDone; ! pReadIoPort->pDevExt->pIoPortRemote->amountInWriteQueue -= (ULONG)writeDone; } --- 448,452 ---- if (pDataWrite->type == RW_DATA_TYPE_IRP) { pDataWrite->data.irp.pIrp->IoStatus.Information += writeDone; ! pReadIoPort->pIoPortRemote->amountInWriteQueue -= (ULONG)writeDone; } *************** *** 466,470 **** OnRxBreak(pReadIoPort, pQueueToComplete); else ! pReadIoPort->pDevExt->pIoPortRemote->perfStats.TransmittedCount += (ULONG)writeDone; } --- 469,473 ---- OnRxBreak(pReadIoPort, pQueueToComplete); else ! pReadIoPort->pIoPortRemote->perfStats.TransmittedCount += (ULONG)writeDone; } *************** *** 557,561 **** if (!first && status == STATUS_PENDING) ! status = FdoPortSetIrpTimeout(pIoPort->pDevExt, pIrp); HALT_UNLESS(pCancelRoutine); --- 560,564 ---- if (!first && status == STATUS_PENDING) ! status = SetIrpTimeout(pIoPort, pIrp); HALT_UNLESS(pCancelRoutine); *************** *** 645,649 **** if (status == STATUS_PENDING && !pIoPort->emuOverrun) status = MoveRawData(&pIoPort->readBuf.insertData, (PC0C_RAW_DATA)pParam); ! UpdateHandFlow(pIoPort->pDevExt, FALSE, pQueueToComplete); break; } --- 648,652 ---- if (status == STATUS_PENDING && !pIoPort->emuOverrun) status = MoveRawData(&pIoPort->readBuf.insertData, (PC0C_RAW_DATA)pParam); ! UpdateHandFlow(pIoPort, FALSE, pQueueToComplete); break; } *************** *** 796,800 **** if (readBufBusyBeg > readBufBusyEnd) { ! UpdateHandFlow(pIoPortRead->pDevExt, TRUE, pQueueToComplete); readBufBusyBeg = readBufBusyEnd; } --- 799,803 ---- if (readBufBusyBeg > readBufBusyEnd) { ! UpdateHandFlow(pIoPortRead, TRUE, pQueueToComplete); readBufBusyBeg = readBufBusyEnd; } *************** *** 814,823 **** case C0C_XCHAR_ON: dataChar.data.chr.type = RW_DATA_TYPE_CHR_XCHR; ! dataChar.data.chr.chr = pIoPortWrite->pDevExt->specialChars.XonChar; dataChar.data.chr.isChr = TRUE; break; case C0C_XCHAR_OFF: dataChar.data.chr.type = RW_DATA_TYPE_CHR_XCHR; ! dataChar.data.chr.chr = pIoPortWrite->pDevExt->specialChars.XoffChar; dataChar.data.chr.isChr = TRUE; break; --- 817,826 ---- case C0C_XCHAR_ON: dataChar.data.chr.type = RW_DATA_TYPE_CHR_XCHR; ! dataChar.data.chr.chr = pIoPortWrite->specialChars.XonChar; dataChar.data.chr.isChr = TRUE; break; case C0C_XCHAR_OFF: dataChar.data.chr.type = RW_DATA_TYPE_CHR_XCHR; ! dataChar.data.chr.chr = pIoPortWrite->specialChars.XoffChar; dataChar.data.chr.isChr = TRUE; break; *************** *** 934,938 **** if (dataIrpRead.data.irp.status == STATUS_PENDING) dataIrpRead.data.irp.status = ! FdoPortSetIrpTimeout(pIoPortRead->pDevExt, dataIrpRead.data.irp.pIrp); status = dataIrpRead.data.irp.status; --- 937,941 ---- if (dataIrpRead.data.irp.status == STATUS_PENDING) dataIrpRead.data.irp.status = ! SetIrpTimeout(pIoPortRead, dataIrpRead.data.irp.pIrp); status = dataIrpRead.data.irp.status; *************** *** 979,983 **** } ! UpdateHandFlow(pIoPortRead->pDevExt, FALSE, pQueueToComplete); readBufBusyBeg = readBufBusyEnd; } --- 982,986 ---- } ! UpdateHandFlow(pIoPortRead, FALSE, pQueueToComplete); readBufBusyBeg = readBufBusyEnd; } *************** *** 1021,1026 **** InsertLsrMst(pIoPortRead, FALSE, lsr, pQueueToComplete); } ! if (pIoPortRead->pDevExt->handFlow.FlowReplace & SERIAL_BREAK_CHAR) ! InsertChar(pIoPortRead, pIoPortRead->pDevExt->specialChars.BreakChar, pQueueToComplete); } break; --- 1024,1029 ---- InsertLsrMst(pIoPortRead, FALSE, lsr, pQueueToComplete); } ! if (pIoPortRead->handFlow.FlowReplace & SERIAL_BREAK_CHAR) ! InsertChar(pIoPortRead, pIoPortRead->specialChars.BreakChar, pQueueToComplete); } break; *************** *** 1054,1058 **** } ! UpdateHandFlow(pIoPortRead->pDevExt, FALSE, pQueueToComplete); readBufBusyBeg = readBufBusyEnd; } --- 1057,1061 ---- } ! UpdateHandFlow(pIoPortRead, FALSE, pQueueToComplete); readBufBusyBeg = readBufBusyEnd; } *************** *** 1086,1090 **** if (dataIrpWrite.data.irp.status == STATUS_PENDING) dataIrpWrite.data.irp.status = ! FdoPortSetIrpTimeout(pIoPortWrite->pDevExt, dataIrpWrite.data.irp.pIrp); status = dataIrpWrite.data.irp.status; --- 1089,1093 ---- if (dataIrpWrite.data.irp.status == STATUS_PENDING) dataIrpWrite.data.irp.status = ! SetIrpTimeout(pIoPortWrite, dataIrpWrite.data.irp.pIrp); status = dataIrpWrite.data.irp.status; *************** *** 1116,1120 **** } ! UpdateTransmitToggle(pIoPortWrite->pDevExt, pQueueToComplete); return status; --- 1119,1123 ---- } ! UpdateTransmitToggle(pIoPortWrite, pQueueToComplete); return status; Index: handflow.c =================================================================== RCS file: /cvsroot/com0com/com0com/sys/handflow.c,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** handflow.c 19 May 2006 12:16:19 -0000 1.6 --- handflow.c 21 Jun 2006 16:23:57 -0000 1.7 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.7 2006/06/21 16:23:57 vfrolov + * Fixed possible BSOD after one port of pair removal + * * Revision 1.6 2006/05/19 12:16:19 vfrolov * Implemented SERIAL_XOFF_CONTINUE *************** *** 52,60 **** NTSTATUS SetHandFlow( ! PC0C_FDOPORT_EXTENSION pDevExt, PSERIAL_HANDFLOW pHandFlow, PLIST_ENTRY pQueueToComplete) { - PC0C_IO_PORT pIoPortLocal; ULONG bits, mask; PC0C_BUFFER pReadBuf; --- 55,62 ---- NTSTATUS SetHandFlow( ! PC0C_IO_PORT pIoPort, PSERIAL_HANDFLOW pHandFlow, PLIST_ENTRY pQueueToComplete) { ULONG bits, mask; PC0C_BUFFER pReadBuf; *************** *** 62,70 **** BOOLEAN setModemStatusHolding; ! pIoPortLocal = pDevExt->pIoPortLocal; ! pReadBuf = &pIoPortLocal->readBuf; if (pHandFlow) { ! if ((pIoPortLocal->escapeChar && (pHandFlow->FlowReplace & SERIAL_ERROR_CHAR)) || ((SIZE_T)pHandFlow->XonLimit > C0C_BUFFER_SIZE(pReadBuf)) || ((SIZE_T)pHandFlow->XoffLimit > C0C_BUFFER_SIZE(pReadBuf))) --- 64,71 ---- BOOLEAN setModemStatusHolding; ! pReadBuf = &pIoPort->readBuf; if (pHandFlow) { ! if ((pIoPort->escapeChar && (pHandFlow->FlowReplace & SERIAL_ERROR_CHAR)) || ((SIZE_T)pHandFlow->XonLimit > C0C_BUFFER_SIZE(pReadBuf)) || ((SIZE_T)pHandFlow->XoffLimit > C0C_BUFFER_SIZE(pReadBuf))) *************** *** 75,91 **** pNewHandFlow = pHandFlow; } else { ! pNewHandFlow = &pDevExt->handFlow; } // Set local side if (pHandFlow && ! ((pDevExt->handFlow.FlowReplace & SERIAL_AUTO_TRANSMIT) != 0) && ((pHandFlow->FlowReplace & SERIAL_AUTO_TRANSMIT) == 0)) { ! SetXonXoffHolding(pIoPortLocal, C0C_XCHAR_ON); } if (!pHandFlow || ! (pDevExt->handFlow.ControlHandShake & SERIAL_OUT_HANDSHAKEMASK) != (pHandFlow->ControlHandShake & SERIAL_OUT_HANDSHAKEMASK)) { --- 76,92 ---- pNewHandFlow = pHandFlow; } else { ! pNewHandFlow = &pIoPort->handFlow; } // Set local side if (pHandFlow && ! ((pIoPort->handFlow.FlowReplace & SERIAL_AUTO_TRANSMIT) != 0) && ((pHandFlow->FlowReplace & SERIAL_AUTO_TRANSMIT) == 0)) { ! SetXonXoffHolding(pIoPort, C0C_XCHAR_ON); } if (!pHandFlow || ! (pIoPort->handFlow.ControlHandShake & SERIAL_OUT_HANDSHAKEMASK) != (pHandFlow->ControlHandShake & SERIAL_OUT_HANDSHAKEMASK)) { *************** *** 99,112 **** if (!pHandFlow || ! (pDevExt->handFlow.FlowReplace & SERIAL_RTS_MASK) != (pHandFlow->FlowReplace & SERIAL_RTS_MASK)) { switch (pNewHandFlow->FlowReplace & SERIAL_RTS_MASK) { case 0: ! pIoPortLocal->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_CTS; mask |= C0C_MSB_CTS; // Turn off CTS on remote side if RTS is disabled break; case SERIAL_RTS_CONTROL: ! pIoPortLocal->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_CTS; bits |= C0C_MSB_CTS; mask |= C0C_MSB_CTS; --- 100,113 ---- if (!pHandFlow || ! (pIoPort->handFlow.FlowReplace & SERIAL_RTS_MASK) != (pHandFlow->FlowReplace & SERIAL_RTS_MASK)) { switch (pNewHandFlow->FlowReplace & SERIAL_RTS_MASK) { case 0: ! pIoPort->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_CTS; mask |= C0C_MSB_CTS; // Turn off CTS on remote side if RTS is disabled break; case SERIAL_RTS_CONTROL: ! pIoPort->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_CTS; bits |= C0C_MSB_CTS; mask |= C0C_MSB_CTS; *************** *** 114,124 **** case SERIAL_RTS_HANDSHAKE: if (C0C_BUFFER_BUSY(pReadBuf) > (C0C_BUFFER_SIZE(pReadBuf) - pNewHandFlow->XoffLimit)) { ! pIoPortLocal->writeHoldingRemote |= SERIAL_TX_WAITING_FOR_CTS; mask |= C0C_MSB_CTS; } else ! if (pIoPortLocal->writeHoldingRemote & SERIAL_TX_WAITING_FOR_CTS) { if (C0C_BUFFER_BUSY(pReadBuf) <= (SIZE_T)pNewHandFlow->XonLimit) { ! pIoPortLocal->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_CTS; bits |= C0C_MSB_CTS; mask |= C0C_MSB_CTS; --- 115,125 ---- case SERIAL_RTS_HANDSHAKE: if (C0C_BUFFER_BUSY(pReadBuf) > (C0C_BUFFER_SIZE(pReadBuf) - pNewHandFlow->XoffLimit)) { ! pIoPort->writeHoldingRemote |= SERIAL_TX_WAITING_FOR_CTS; mask |= C0C_MSB_CTS; } else ! if (pIoPort->writeHoldingRemote & SERIAL_TX_WAITING_FOR_CTS) { if (C0C_BUFFER_BUSY(pReadBuf) <= (SIZE_T)pNewHandFlow->XonLimit) { ! pIoPort->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_CTS; bits |= C0C_MSB_CTS; mask |= C0C_MSB_CTS; *************** *** 133,146 **** if (!pHandFlow || ! (pDevExt->handFlow.ControlHandShake & SERIAL_DTR_MASK) != (pHandFlow->ControlHandShake & SERIAL_DTR_MASK)) { switch (pNewHandFlow->ControlHandShake & SERIAL_DTR_MASK) { case 0: ! pIoPortLocal->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_DSR; mask |= C0C_MSB_DSR; // Turn off DSR on remote side if DTR is disabled break; case SERIAL_DTR_CONTROL: ! pIoPortLocal->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_DSR; bits |= C0C_MSB_DSR; mask |= C0C_MSB_DSR; --- 134,147 ---- if (!pHandFlow || ! (pIoPort->handFlow.ControlHandShake & SERIAL_DTR_MASK) != (pHandFlow->ControlHandShake & SERIAL_DTR_MASK)) { switch (pNewHandFlow->ControlHandShake & SERIAL_DTR_MASK) { case 0: ! pIoPort->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_DSR; mask |= C0C_MSB_DSR; // Turn off DSR on remote side if DTR is disabled break; case SERIAL_DTR_CONTROL: ! pIoPort->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_DSR; bits |= C0C_MSB_DSR; mask |= C0C_MSB_DSR; *************** *** 148,158 **** case SERIAL_DTR_HANDSHAKE: if (C0C_BUFFER_BUSY(pReadBuf) > (C0C_BUFFER_SIZE(pReadBuf) - pNewHandFlow->XoffLimit)) { ! pIoPortLocal->writeHoldingRemote |= SERIAL_TX_WAITING_FOR_DSR; mask |= C0C_MSB_DSR; } else ! if (pIoPortLocal->writeHoldingRemote & SERIAL_TX_WAITING_FOR_DSR) { if (C0C_BUFFER_BUSY(pReadBuf) <= (SIZE_T)pNewHandFlow->XonLimit) { ! pIoPortLocal->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_DSR; bits |= C0C_MSB_DSR; mask |= C0C_MSB_DSR; --- 149,159 ---- case SERIAL_DTR_HANDSHAKE: if (C0C_BUFFER_BUSY(pReadBuf) > (C0C_BUFFER_SIZE(pReadBuf) - pNewHandFlow->XoffLimit)) { ! pIoPort->writeHoldingRemote |= SERIAL_TX_WAITING_FOR_DSR; mask |= C0C_MSB_DSR; } else ! if (pIoPort->writeHoldingRemote & SERIAL_TX_WAITING_FOR_DSR) { if (C0C_BUFFER_BUSY(pReadBuf) <= (SIZE_T)pNewHandFlow->XonLimit) { ! pIoPort->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_DSR; bits |= C0C_MSB_DSR; mask |= C0C_MSB_DSR; *************** *** 167,193 **** if (!pHandFlow || ! (pDevExt->handFlow.FlowReplace & SERIAL_AUTO_RECEIVE) != (pHandFlow->FlowReplace & SERIAL_AUTO_RECEIVE)) { if (pNewHandFlow->FlowReplace & SERIAL_AUTO_RECEIVE) { if (C0C_BUFFER_BUSY(pReadBuf) > (C0C_BUFFER_SIZE(pReadBuf) - pNewHandFlow->XoffLimit)) { ! pIoPortLocal->writeHoldingRemote |= SERIAL_TX_WAITING_FOR_XON; if ((pNewHandFlow->FlowReplace & SERIAL_XOFF_CONTINUE) == 0) ! pIoPortLocal->writeHolding |= SERIAL_TX_WAITING_FOR_XON; ! pIoPortLocal->sendXonXoff = C0C_XCHAR_OFF; ! pIoPortLocal->tryWrite = TRUE; } } else ! if (pIoPortLocal->writeHoldingRemote & SERIAL_TX_WAITING_FOR_XON) { ! pIoPortLocal->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_XON; ! pIoPortLocal->writeHolding &= ~SERIAL_TX_WAITING_FOR_XON; ! if (pIoPortLocal->sendXonXoff != C0C_XCHAR_OFF) { // XOFF was sent so send XON ! pIoPortLocal->sendXonXoff = C0C_XCHAR_ON; ! pIoPortLocal->tryWrite = TRUE; } else { // XOFF still was not sent so cancel it ! pIoPortLocal->sendXonXoff = 0; } } --- 168,194 ---- if (!pHandFlow || ! (pIoPort->handFlow.FlowReplace & SERIAL_AUTO_RECEIVE) != (pHandFlow->FlowReplace & SERIAL_AUTO_RECEIVE)) { if (pNewHandFlow->FlowReplace & SERIAL_AUTO_RECEIVE) { if (C0C_BUFFER_BUSY(pReadBuf) > (C0C_BUFFER_SIZE(pReadBuf) - pNewHandFlow->XoffLimit)) { ! pIoPort->writeHoldingRemote |= SERIAL_TX_WAITING_FOR_XON; if ((pNewHandFlow->FlowReplace & SERIAL_XOFF_CONTINUE) == 0) ! pIoPort->writeHolding |= SERIAL_TX_WAITING_FOR_XON; ! pIoPort->sendXonXoff = C0C_XCHAR_OFF; ! pIoPort->tryWrite = TRUE; } } else ! if (pIoPort->writeHoldingRemote & SERIAL_TX_WAITING_FOR_XON) { ! pIoPort->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_XON; ! pIoPort->writeHolding &= ~SERIAL_TX_WAITING_FOR_XON; ! if (pIoPort->sendXonXoff != C0C_XCHAR_OFF) { // XOFF was sent so send XON ! pIoPort->sendXonXoff = C0C_XCHAR_ON; ! pIoPort->tryWrite = TRUE; } else { // XOFF still was not sent so cancel it ! pIoPort->sendXonXoff = 0; } } *************** *** 195,222 **** if (pHandFlow) ! pDevExt->handFlow = *pHandFlow; if (setModemStatusHolding) ! SetModemStatusHolding(pIoPortLocal); if (mask) ! SetModemStatus(pDevExt->pIoPortRemote, bits, mask, pQueueToComplete); ! UpdateTransmitToggle(pDevExt, pQueueToComplete); ! SetLimit(pDevExt->pIoPortRemote->pDevExt); ! SetLimit(pDevExt); ! if (pDevExt->pIoPortRemote->tryWrite) { ReadWrite( ! pIoPortLocal, FALSE, ! pDevExt->pIoPortRemote, FALSE, pQueueToComplete); } ! if (pIoPortLocal->tryWrite) { ReadWrite( ! pDevExt->pIoPortRemote, FALSE, ! pIoPortLocal, FALSE, pQueueToComplete); } --- 196,223 ---- if (pHandFlow) ! pIoPort->handFlow = *pHandFlow; if (setModemStatusHolding) ! SetModemStatusHolding(pIoPort); if (mask) ! SetModemStatus(pIoPort->pIoPortRemote, bits, mask, pQueueToComplete); ! UpdateTransmitToggle(pIoPort, pQueueToComplete); ! SetLimit(pIoPort->pIoPortRemote); ! SetLimit(pIoPort); ! if (pIoPort->pIoPortRemote->tryWrite) { ReadWrite( ! pIoPort, FALSE, ! pIoPort->pIoPortRemote, FALSE, pQueueToComplete); } ! if (pIoPort->tryWrite) { ReadWrite( ! pIoPort->pIoPortRemote, FALSE, ! pIoPort, FALSE, pQueueToComplete); } *************** *** 226,230 **** VOID UpdateHandFlow( ! PC0C_FDOPORT_EXTENSION pDevExt, BOOLEAN freed, PLIST_ENTRY pQueueToComplete) --- 227,231 ---- VOID UpdateHandFlow( ! PC0C_IO_PORT pIoPort, BOOLEAN freed, PLIST_ENTRY pQueueToComplete) *************** *** 233,263 **** PC0C_BUFFER pReadBuf; PSERIAL_HANDFLOW pHandFlowLocal, pHandFlowRemote; - PC0C_IO_PORT pIoPortLocal; ! pIoPortLocal = pDevExt->pIoPortLocal; ! pHandFlowLocal = &pDevExt->handFlow; ! pHandFlowRemote = &pDevExt->pIoPortRemote->pDevExt->handFlow; ! pReadBuf = &pIoPortLocal->readBuf; bits = mask = 0; ! if (!pIoPortLocal->writeHoldingRemote) { if (!freed && C0C_BUFFER_BUSY(pReadBuf) > (C0C_BUFFER_SIZE(pReadBuf) - pHandFlowLocal->XoffLimit)) { if ((pHandFlowLocal->FlowReplace & SERIAL_RTS_MASK) == SERIAL_RTS_HANDSHAKE) { ! pIoPortLocal->writeHoldingRemote |= SERIAL_TX_WAITING_FOR_CTS; mask |= C0C_MSB_CTS; } if ((pHandFlowLocal->ControlHandShake & SERIAL_DTR_MASK) == SERIAL_DTR_HANDSHAKE) { ! pIoPortLocal->writeHoldingRemote |= SERIAL_TX_WAITING_FOR_DSR; mask |= C0C_MSB_DSR; } if (pHandFlowLocal->FlowReplace & SERIAL_AUTO_RECEIVE) { ! pIoPortLocal->writeHoldingRemote |= SERIAL_TX_WAITING_FOR_XON; if ((pHandFlowLocal->FlowReplace & SERIAL_XOFF_CONTINUE) == 0) ! pIoPortLocal->writeHolding |= SERIAL_TX_WAITING_FOR_XON; ! pIoPortLocal->sendXonXoff = C0C_XCHAR_OFF; ! pIoPortLocal->tryWrite = TRUE; } } --- 234,262 ---- PC0C_BUFFER pReadBuf; PSERIAL_HANDFLOW pHandFlowLocal, pHandFlowRemote; ! pHandFlowLocal = &pIoPort->handFlow; ! pHandFlowRemote = &pIoPort->pIoPortRemote->handFlow; ! pReadBuf = &pIoPort->readBuf; bits = mask = 0; ! if (!pIoPort->writeHoldingRemote) { if (!freed && C0C_BUFFER_BUSY(pReadBuf) > (C0C_BUFFER_SIZE(pReadBuf) - pHandFlowLocal->XoffLimit)) { if ((pHandFlowLocal->FlowReplace & SERIAL_RTS_MASK) == SERIAL_RTS_HANDSHAKE) { ! pIoPort->writeHoldingRemote |= SERIAL_TX_WAITING_FOR_CTS; mask |= C0C_MSB_CTS; } if ((pHandFlowLocal->ControlHandShake & SERIAL_DTR_MASK) == SERIAL_DTR_HANDSHAKE) { ! pIoPort->writeHoldingRemote |= SERIAL_TX_WAITING_FOR_DSR; mask |= C0C_MSB_DSR; } if (pHandFlowLocal->FlowReplace & SERIAL_AUTO_RECEIVE) { ! pIoPort->writeHoldingRemote |= SERIAL_TX_WAITING_FOR_XON; if ((pHandFlowLocal->FlowReplace & SERIAL_XOFF_CONTINUE) == 0) ! pIoPort->writeHolding |= SERIAL_TX_WAITING_FOR_XON; ! pIoPort->sendXonXoff = C0C_XCHAR_OFF; ! pIoPort->tryWrite = TRUE; } } *************** *** 265,269 **** if (freed && C0C_BUFFER_BUSY(pReadBuf) <= (SIZE_T)pHandFlowLocal->XonLimit) { if ((pHandFlowLocal->FlowReplace & SERIAL_RTS_MASK) == SERIAL_RTS_HANDSHAKE) { ! pIoPortLocal->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_CTS; bits |= C0C_MSB_CTS; mask |= C0C_MSB_CTS; --- 264,268 ---- if (freed && C0C_BUFFER_BUSY(pReadBuf) <= (SIZE_T)pHandFlowLocal->XonLimit) { if ((pHandFlowLocal->FlowReplace & SERIAL_RTS_MASK) == SERIAL_RTS_HANDSHAKE) { ! pIoPort->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_CTS; bits |= C0C_MSB_CTS; mask |= C0C_MSB_CTS; *************** *** 271,275 **** if ((pHandFlowLocal->ControlHandShake & SERIAL_DTR_MASK) == SERIAL_DTR_HANDSHAKE) { ! pIoPortLocal->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_DSR; bits |= C0C_MSB_DSR; mask |= C0C_MSB_DSR; --- 270,274 ---- if ((pHandFlowLocal->ControlHandShake & SERIAL_DTR_MASK) == SERIAL_DTR_HANDSHAKE) { ! pIoPort->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_DSR; bits |= C0C_MSB_DSR; mask |= C0C_MSB_DSR; **************... [truncated message content] |