com0com-cvs Mailing List for Null-modem emulator (Page 33)
The virtual serial port driver for Windows.
Brought to you by:
vfrolov
You can subscribe to this list here.
2005 |
Jan
|
Feb
(7) |
Mar
|
Apr
|
May
(13) |
Jun
(18) |
Jul
(9) |
Aug
(10) |
Sep
(15) |
Oct
(6) |
Nov
(9) |
Dec
(6) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2006 |
Jan
(6) |
Feb
(4) |
Mar
(4) |
Apr
(2) |
May
(7) |
Jun
(11) |
Jul
(6) |
Aug
(9) |
Sep
(1) |
Oct
(27) |
Nov
(22) |
Dec
(3) |
2007 |
Jan
(13) |
Feb
(16) |
Mar
(2) |
Apr
(3) |
May
(7) |
Jun
(17) |
Jul
(9) |
Aug
(1) |
Sep
(13) |
Oct
(20) |
Nov
(18) |
Dec
(1) |
2008 |
Jan
|
Feb
(3) |
Mar
(46) |
Apr
(40) |
May
(4) |
Jun
(9) |
Jul
(7) |
Aug
(62) |
Sep
(25) |
Oct
(51) |
Nov
(67) |
Dec
(81) |
2009 |
Jan
(13) |
Feb
(31) |
Mar
(12) |
Apr
|
May
(10) |
Jun
|
Jul
(5) |
Aug
(2) |
Sep
(10) |
Oct
|
Nov
(3) |
Dec
(1) |
2010 |
Jan
|
Feb
(1) |
Mar
(4) |
Apr
|
May
(12) |
Jun
(9) |
Jul
(12) |
Aug
(7) |
Sep
(6) |
Oct
|
Nov
|
Dec
(1) |
2011 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(11) |
Jun
|
Jul
(26) |
Aug
|
Sep
|
Oct
|
Nov
(2) |
Dec
(23) |
2012 |
Jan
(7) |
Feb
(3) |
Mar
|
Apr
|
May
(2) |
Jun
(9) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Vyacheslav F. <vf...@us...> - 2006-07-28 20:31:14
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv19836 Modified Files: dirs Log Message: Added setup Index: dirs =================================================================== RCS file: /cvsroot/com0com/com0com/dirs,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** dirs 13 Jun 2006 14:40:47 -0000 1.1 --- dirs 28 Jul 2006 12:18:11 -0000 1.2 *************** *** 1,2 **** --- 1,3 ---- DIRS= \ sys \ + setup \ |
From: Vyacheslav F. <vf...@us...> - 2006-07-28 12:09:02
|
Update of /cvsroot/com0com/com0com/setup In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv16176/setup Log Message: Directory /cvsroot/com0com/com0com/setup added to the repository |
From: Vyacheslav F. <vf...@us...> - 2006-07-17 10:03:59
|
Update of /cvsroot/com0com/com0com/sys In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv18551 Modified Files: power.c Log Message: Moved pIrpStack Index: power.c =================================================================== RCS file: /cvsroot/com0com/com0com/sys/power.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** power.c 26 Jan 2005 12:18:54 -0000 1.1 --- power.c 17 Jul 2006 10:03:54 -0000 1.2 *************** *** 2,6 **** * $Id$ * ! * Copyright (c) 2004-2005 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify --- 2,6 ---- * $Id$ * ! * Copyright (c) 2004-2006 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.2 2006/07/17 10:03:54 vfrolov + * Moved pIrpStack + * * Revision 1.1 2005/01/26 12:18:54 vfrolov * Initial revision *************** *** 30,37 **** NTSTATUS PdoPortPower( IN PC0C_PDOPORT_EXTENSION pDevExt, ! IN PIRP pIrp, ! IN PIO_STACK_LOCATION pIrpStack) { NTSTATUS status; POWER_STATE_TYPE powerType = pIrpStack->Parameters.Power.Type; POWER_STATE powerState = pIrpStack->Parameters.Power.State; --- 33,40 ---- NTSTATUS PdoPortPower( IN PC0C_PDOPORT_EXTENSION pDevExt, ! IN PIRP pIrp) { NTSTATUS status; + PIO_STACK_LOCATION pIrpStack = IoGetCurrentIrpStackLocation(pIrp); POWER_STATE_TYPE powerType = pIrpStack->Parameters.Power.Type; POWER_STATE powerState = pIrpStack->Parameters.Power.State; *************** *** 76,80 **** NTSTATUS status; PC0C_COMMON_EXTENSION pDevExt = pDevObj->DeviceExtension; - PIO_STACK_LOCATION pIrpStack = IoGetCurrentIrpStackLocation(pIrp); TraceIrp("c0cPowerDispatch", pIrp, NULL, TRACE_FLAG_PARAMS); --- 79,82 ---- *************** *** 90,94 **** break; case C0C_DOTYPE_PP: ! status = PdoPortPower((PC0C_PDOPORT_EXTENSION)pDevExt, pIrp, pIrpStack); break; default: --- 92,96 ---- break; case C0C_DOTYPE_PP: ! status = PdoPortPower((PC0C_PDOPORT_EXTENSION)pDevExt, pIrp); break; default: |
From: Vyacheslav F. <vf...@us...> - 2006-07-17 09:58:26
|
Update of /cvsroot/com0com/com0com/sys In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv16681 Modified Files: ioctl.c Log Message: Added #if DBG Index: ioctl.c =================================================================== RCS file: /cvsroot/com0com/com0com/sys/ioctl.c,v retrieving revision 1.24 retrieving revision 1.25 diff -C2 -d -r1.24 -r1.25 *** ioctl.c 23 Jun 2006 11:44:52 -0000 1.24 --- ioctl.c 17 Jul 2006 09:58:21 -0000 1.25 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.25 2006/07/17 09:58:21 vfrolov + * Added #if DBG + * * Revision 1.24 2006/06/23 11:44:52 vfrolov * Mass replacement pDevExt by pIoPort *************** *** 759,764 **** --- 762,769 ---- } + #if DBG if (status != STATUS_SUCCESS) TraceCode(pDevExt, "IOCTL_", codeNameTableIoctl, code, &status); + #endif /* DBG */ return status; |
From: Vyacheslav F. <vf...@us...> - 2006-07-17 09:55:08
|
Update of /cvsroot/com0com/com0com/sys In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv15285 Modified Files: version.h Log Message: Post-tagging version change Index: version.h =================================================================== RCS file: /cvsroot/com0com/com0com/sys/version.h,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** version.h 28 Jun 2006 14:09:12 -0000 1.6 --- version.h 17 Jul 2006 09:54:59 -0000 1.7 *************** *** 28,32 **** #define C0C_V2 6 #define C0C_V3 0 ! #define C0C_V4 0 #define MK_VERSION_STR1(V1, V2, V3, V4) #V1 "." #V2 "." #V3 "." #V4 --- 28,32 ---- #define C0C_V2 6 #define C0C_V3 0 ! #define C0C_V4 1 #define MK_VERSION_STR1(V1, V2, V3, V4) #V1 "." #V2 "." #V3 "." #V4 |
From: Vyacheslav F. <vf...@us...> - 2006-06-28 14:09:18
|
Update of /cvsroot/com0com/com0com/sys In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv16508 Modified Files: version.h Log Message: Pre-tagging version change Index: version.h =================================================================== RCS file: /cvsroot/com0com/com0com/sys/version.h,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** version.h 10 Jan 2006 09:19:47 -0000 1.5 --- version.h 28 Jun 2006 14:09:12 -0000 1.6 *************** *** 26,32 **** #define C0C_V1 1 ! #define C0C_V2 5 #define C0C_V3 0 ! #define C0C_V4 1 #define MK_VERSION_STR1(V1, V2, V3, V4) #V1 "." #V2 "." #V3 "." #V4 --- 26,32 ---- #define C0C_V1 1 ! #define C0C_V2 6 #define C0C_V3 0 ! #define C0C_V4 0 #define MK_VERSION_STR1(V1, V2, V3, V4) #V1 "." #V2 "." #V3 "." #V4 |
From: Vyacheslav F. <vf...@us...> - 2006-06-28 13:59:06
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv11876 Modified Files: ReadMe.txt Log Message: Added FAQ about receive buffer overrun Index: ReadMe.txt =================================================================== RCS file: /cvsroot/com0com/com0com/ReadMe.txt,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** ReadMe.txt 5 Dec 2005 10:43:19 -0000 1.8 --- ReadMe.txt 28 Jun 2006 13:59:03 -0000 1.9 *************** *** 9,13 **** Windows. You can create an unlimited number of virtual COM port pairs and use any pair to connect one application to another. ! Each COM port pair provides two COM ports with names starting at CNCA0 and CNCB0. The output to one port is the input from other port and vice versa. --- 9,13 ---- Windows. You can create an unlimited number of virtual COM port pairs and use any pair to connect one application to another. ! Each COM port pair provides two COM ports with default names starting at CNCA0 and CNCB0. The output to one port is the input from other port and vice versa. *************** *** 111,112 **** --- 111,127 ---- A. You must prefix name with the special characters "\\.\". Try to open the port with CreateFile("\\\\.\\CNCA0", ...). + + Q. My application hangs during its startup when it sends anything to one paired + COM port. The only way to unhang it is to start HyperTerminal, which is connected + to the other paired COM port. I didn't have this problem with physical serial + ports. + A. Your application can hang because receive buffer overrun is disabled by + default. You can fix the problem by enabling receive buffer overrun for the + receiving port. Also, to prevent some flow control issues you need to enable + baud rate emulation for the sending port. So, if your application use port CNCA0 + and other paired port is CNCB0, then add the following to the registry: + + [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\com0com\Parameters\CNCB0] + "EmuOverrun"=dword:FFFFFFFF + [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\com0com\Parameters\CNCA0] + "EmuBR"=dword:FFFFFFFF |
From: Vyacheslav F. <vf...@us...> - 2006-06-28 13:52:19
|
Update of /cvsroot/com0com/com0com/sys In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv9330 Modified Files: startirp.c Log Message: Fixed double-release of spin lock Index: startirp.c =================================================================== RCS file: /cvsroot/com0com/com0com/sys/startirp.c,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** startirp.c 23 Jun 2006 11:44:52 -0000 1.12 --- startirp.c 28 Jun 2006 13:52:09 -0000 1.13 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.13 2006/06/28 13:52:09 vfrolov + * Fixed double-release of spin lock + * * Revision 1.12 2006/06/23 11:44:52 vfrolov * Mass replacement pDevExt by pIoPort *************** *** 324,331 **** if (pIrp->Cancel) { status = NoPending(pIrp, STATUS_CANCELLED); - KeReleaseSpinLock(pIoPort->pIoLock, oldIrql); } else { if (!pQueue->pCurrent) { ! status = StartIrp(pIoPort, pIrp, pState, pQueue, oldIrql, pStartRoutine); } else { PIO_STACK_LOCATION pIrpStack; --- 327,333 ---- if (pIrp->Cancel) { status = NoPending(pIrp, STATUS_CANCELLED); } else { if (!pQueue->pCurrent) { ! return StartIrp(pIoPort, pIrp, pState, pQueue, oldIrql, pStartRoutine); } else { PIO_STACK_LOCATION pIrpStack; *************** *** 361,365 **** pCurrentState->flags |= C0C_IRP_FLAG_IN_QUEUE; ! status = StartIrp(pIoPort, pIrp, pState, pQueue, oldIrql, pStartRoutine); } } --- 363,367 ---- pCurrentState->flags |= C0C_IRP_FLAG_IN_QUEUE; ! return StartIrp(pIoPort, pIrp, pState, pQueue, oldIrql, pStartRoutine); } } *************** *** 375,383 **** status = STATUS_PENDING; } - - KeReleaseSpinLock(pIoPort->pIoLock, oldIrql); } } return status; } --- 377,385 ---- status = STATUS_PENDING; } } } + KeReleaseSpinLock(pIoPort->pIoLock, oldIrql); + return status; } |
From: Vyacheslav F. <vf...@us...> - 2006-06-23 11:45:00
|
Update of /cvsroot/com0com/com0com/sys In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv19463 Modified Files: adddev.c com0com.h delay.c delay.h ioctl.c openclos.c read.c startirp.c wait.c write.c Log Message: Mass replacement pDevExt by pIoPort Index: openclos.c =================================================================== RCS file: /cvsroot/com0com/com0com/sys/openclos.c,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** openclos.c 21 Jun 2006 16:23:57 -0000 1.14 --- openclos.c 23 Jun 2006 11:44:52 -0000 1.15 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.15 2006/06/23 11:44:52 vfrolov + * Mass replacement pDevExt by pIoPort + * * Revision 1.14 2006/06/21 16:23:57 vfrolov * Fixed possible BSOD after one port of pair removal *************** *** 78,81 **** --- 81,85 ---- ULONG size; KIRQL oldIrql; + PC0C_IO_PORT pIoPort; if (InterlockedIncrement(&pDevExt->openCount) != 1) { *************** *** 84,87 **** --- 88,93 ---- } + pIoPort = pDevExt->pIoPortLocal; + switch (MmQuerySystemSize()) { case MmLargeSystem: *************** *** 108,112 **** #if DBG ! if (pDevExt->pIoPortLocal->amountInWriteQueue) { NTSTATUS status; UNICODE_STRING msg; --- 114,118 ---- #if DBG ! if (pIoPort->amountInWriteQueue) { NTSTATUS status; UNICODE_STRING msg; *************** *** 115,119 **** RtlInitUnicodeString(&msg, NULL); StrAppendStr0(&status, &msg, L"!!!WARNING!!! amountInWriteQueue = "); ! StrAppendNum(&status, &msg, pDevExt->pIoPortLocal->amountInWriteQueue, 10); Trace0((PC0C_COMMON_EXTENSION)pDevExt, msg.Buffer); --- 121,125 ---- RtlInitUnicodeString(&msg, NULL); StrAppendStr0(&status, &msg, L"!!!WARNING!!! amountInWriteQueue = "); ! StrAppendNum(&status, &msg, pIoPort->amountInWriteQueue, 10); Trace0((PC0C_COMMON_EXTENSION)pDevExt, msg.Buffer); *************** *** 123,143 **** #endif /* DBG */ ! KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! InitBuffer(&pDevExt->pIoPortLocal->readBuf, pBase, size); ! pDevExt->pIoPortLocal->amountInWriteQueue = 0; ! pDevExt->pIoPortLocal->tryWrite = FALSE; ! pDevExt->pIoPortLocal->errors = 0; ! pDevExt->pIoPortLocal->waitMask = 0; ! pDevExt->pIoPortLocal->eventMask = 0; ! 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); FdoPortCompleteQueue(&queueToComplete); --- 129,149 ---- #endif /* DBG */ ! KeAcquireSpinLock(pIoPort->pIoLock, &oldIrql); ! InitBuffer(&pIoPort->readBuf, pBase, size); ! pIoPort->amountInWriteQueue = 0; ! pIoPort->tryWrite = FALSE; ! pIoPort->errors = 0; ! pIoPort->waitMask = 0; ! pIoPort->eventMask = 0; ! pIoPort->escapeChar = 0; ! RtlZeroMemory(&pIoPort->perfStats, sizeof(pIoPort->perfStats)); ! pIoPort->handFlow.XoffLimit = size >> 3; ! pIoPort->handFlow.XonLimit = size >> 1; ! SetHandFlow(pIoPort, NULL, &queueToComplete); ! KeReleaseSpinLock(pIoPort->pIoLock, oldIrql); FdoPortCompleteQueue(&queueToComplete); *************** *** 150,165 **** LIST_ENTRY queueToComplete; KIRQL oldIrql; InitializeListHead(&queueToComplete); ! KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! 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); ! KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); FdoPortCompleteQueue(&queueToComplete); --- 156,174 ---- LIST_ENTRY queueToComplete; KIRQL oldIrql; + PC0C_IO_PORT pIoPort; + + pIoPort = pDevExt->pIoPortLocal; InitializeListHead(&queueToComplete); ! KeAcquireSpinLock(pIoPort->pIoLock, &oldIrql); ! pIoPort->writeHoldingRemote = 0; ! pIoPort->sendXonXoff = 0; ! SetModemStatus(pIoPort->pIoPortRemote, 0, C0C_MSB_CTS | C0C_MSB_DSR, &queueToComplete); ! FreeBuffer(&pIoPort->readBuf); ! SetBreakHolding(pIoPort, FALSE); ! KeReleaseSpinLock(pIoPort->pIoLock, oldIrql); FdoPortCompleteQueue(&queueToComplete); *************** *** 231,235 **** switch (pDevExt->doType) { case C0C_DOTYPE_FP: ! FdoPortCancelQueues((PC0C_FDOPORT_EXTENSION)pDevExt); status = STATUS_SUCCESS; --- 240,244 ---- switch (pDevExt->doType) { case C0C_DOTYPE_FP: ! FdoPortCancelQueues(((PC0C_FDOPORT_EXTENSION)pDevExt)->pIoPortLocal); status = STATUS_SUCCESS; Index: ioctl.c =================================================================== RCS file: /cvsroot/com0com/com0com/sys/ioctl.c,v retrieving revision 1.23 retrieving revision 1.24 diff -C2 -d -r1.23 -r1.24 *** ioctl.c 21 Jun 2006 16:23:57 -0000 1.23 --- ioctl.c 23 Jun 2006 11:44:52 -0000 1.24 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.24 2006/06/23 11:44:52 vfrolov + * Mass replacement pDevExt by pIoPort + * * Revision 1.23 2006/06/21 16:23:57 vfrolov * Fixed possible BSOD after one port of pair removal *************** *** 124,132 **** case IOCTL_SERIAL_SET_RTS: case IOCTL_SERIAL_CLR_RTS: ! KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); switch (pIoPortLocal->handFlow.FlowReplace & SERIAL_RTS_MASK) { case SERIAL_RTS_HANDSHAKE: case SERIAL_TRANSMIT_TOGGLE: ! KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); status = STATUS_INVALID_PARAMETER; break; --- 127,135 ---- case IOCTL_SERIAL_SET_RTS: case IOCTL_SERIAL_CLR_RTS: ! KeAcquireSpinLock(pIoPortLocal->pIoLock, &oldIrql); switch (pIoPortLocal->handFlow.FlowReplace & SERIAL_RTS_MASK) { case SERIAL_RTS_HANDSHAKE: case SERIAL_TRANSMIT_TOGGLE: ! KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql); status = STATUS_INVALID_PARAMETER; break; *************** *** 149,153 **** } ! KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); FdoPortCompleteQueue(&queueToComplete); } --- 152,156 ---- } ! KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql); FdoPortCompleteQueue(&queueToComplete); } *************** *** 156,163 **** case IOCTL_SERIAL_SET_DTR: case IOCTL_SERIAL_CLR_DTR: ! KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); switch (pIoPortLocal->handFlow.ControlHandShake & SERIAL_DTR_MASK) { case SERIAL_DTR_HANDSHAKE: ! KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); status = STATUS_INVALID_PARAMETER; break; --- 159,166 ---- case IOCTL_SERIAL_SET_DTR: case IOCTL_SERIAL_CLR_DTR: ! KeAcquireSpinLock(pIoPortLocal->pIoLock, &oldIrql); switch (pIoPortLocal->handFlow.ControlHandShake & SERIAL_DTR_MASK) { case SERIAL_DTR_HANDSHAKE: ! KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql); status = STATUS_INVALID_PARAMETER; break; *************** *** 180,184 **** } ! KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); FdoPortCompleteQueue(&queueToComplete); } --- 183,187 ---- } ! KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql); FdoPortCompleteQueue(&queueToComplete); } *************** *** 194,200 **** } ! KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); modemStatusRemote = pIoPortLocal->pIoPortRemote->modemStatus; ! KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); *(PULONG)pIrp->AssociatedIrp.SystemBuffer = --- 197,203 ---- } ! KeAcquireSpinLock(pIoPortLocal->pIoLock, &oldIrql); modemStatusRemote = pIoPortLocal->pIoPortRemote->modemStatus; ! KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql); *(PULONG)pIrp->AssociatedIrp.SystemBuffer = *************** *** 215,219 **** InitializeListHead(&queueToComplete); ! KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); SetXonXoffHolding(pIoPortLocal, C0C_XCHAR_ON); --- 218,222 ---- InitializeListHead(&queueToComplete); ! KeAcquireSpinLock(pIoPortLocal->pIoLock, &oldIrql); SetXonXoffHolding(pIoPortLocal, C0C_XCHAR_ON); *************** *** 224,235 **** &queueToComplete); } ! KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); FdoPortCompleteQueue(&queueToComplete); break; } case IOCTL_SERIAL_SET_XOFF: ! KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); SetXonXoffHolding(pIoPortLocal, C0C_XCHAR_OFF); ! KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); break; case IOCTL_SERIAL_SET_BREAK_ON: { --- 227,238 ---- &queueToComplete); } ! KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql); FdoPortCompleteQueue(&queueToComplete); break; } case IOCTL_SERIAL_SET_XOFF: ! KeAcquireSpinLock(pIoPortLocal->pIoLock, &oldIrql); SetXonXoffHolding(pIoPortLocal, C0C_XCHAR_OFF); ! KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql); break; case IOCTL_SERIAL_SET_BREAK_ON: { *************** *** 238,242 **** InitializeListHead(&queueToComplete); ! KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); SetBreakHolding(pIoPortLocal, TRUE); --- 241,245 ---- InitializeListHead(&queueToComplete); ! KeAcquireSpinLock(pIoPortLocal->pIoLock, &oldIrql); SetBreakHolding(pIoPortLocal, TRUE); *************** *** 248,252 **** &queueToComplete); ! KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); FdoPortCompleteQueue(&queueToComplete); break; --- 251,255 ---- &queueToComplete); ! KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql); FdoPortCompleteQueue(&queueToComplete); break; *************** *** 257,261 **** InitializeListHead(&queueToComplete); ! KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); SetBreakHolding(pIoPortLocal, FALSE); --- 260,264 ---- InitializeListHead(&queueToComplete); ! KeAcquireSpinLock(pIoPortLocal->pIoLock, &oldIrql); SetBreakHolding(pIoPortLocal, FALSE); *************** *** 268,272 **** &queueToComplete); } ! KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); FdoPortCompleteQueue(&queueToComplete); break; --- 271,275 ---- &queueToComplete); } ! KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql); FdoPortCompleteQueue(&queueToComplete); break; *************** *** 278,284 **** } ! KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); *(PULONG)pIrp->AssociatedIrp.SystemBuffer = pIoPortLocal->modemStatus; ! KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); pIrp->IoStatus.Information = sizeof(ULONG); --- 281,287 ---- } ! KeAcquireSpinLock(pIoPortLocal->pIoLock, &oldIrql); *(PULONG)pIrp->AssociatedIrp.SystemBuffer = pIoPortLocal->modemStatus; ! KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql); pIrp->IoStatus.Information = sizeof(ULONG); *************** *** 286,299 **** break; case IOCTL_SERIAL_SET_WAIT_MASK: ! status = FdoPortSetWaitMask(pDevExt, pIrp, pIrpStack); break; case IOCTL_SERIAL_GET_WAIT_MASK: ! status = FdoPortGetWaitMask(pDevExt, pIrp, pIrpStack); break; case IOCTL_SERIAL_WAIT_ON_MASK: ! status = FdoPortWaitOnMask(pDevExt, pIrp, pIrpStack); break; case IOCTL_SERIAL_IMMEDIATE_CHAR: ! status = FdoPortImmediateChar(pDevExt, pIrp, pIrpStack); break; case IOCTL_SERIAL_PURGE: { --- 289,302 ---- break; case IOCTL_SERIAL_SET_WAIT_MASK: ! status = FdoPortSetWaitMask(pIoPortLocal, pIrp, pIrpStack); break; case IOCTL_SERIAL_GET_WAIT_MASK: ! status = FdoPortGetWaitMask(pIoPortLocal, pIrp, pIrpStack); break; case IOCTL_SERIAL_WAIT_ON_MASK: ! status = FdoPortWaitOnMask(pIoPortLocal, pIrp, pIrpStack); break; case IOCTL_SERIAL_IMMEDIATE_CHAR: ! status = FdoPortImmediateChar(pIoPortLocal, pIrp, pIrpStack); break; case IOCTL_SERIAL_PURGE: { *************** *** 319,323 **** InitializeListHead(&queueToComplete); ! KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); if (*pSysBuf & SERIAL_PURGE_RXABORT) --- 322,326 ---- InitializeListHead(&queueToComplete); ! KeAcquireSpinLock(pIoPortLocal->pIoLock, &oldIrql); if (*pSysBuf & SERIAL_PURGE_RXABORT) *************** *** 338,342 **** } ! KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); FdoPortCompleteQueue(&queueToComplete); --- 341,345 ---- } ! KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql); FdoPortCompleteQueue(&queueToComplete); *************** *** 356,360 **** RtlZeroMemory(pSysBuf, sizeof(*pSysBuf)); ! KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); pSysBuf->AmountInInQueue = (ULONG)C0C_BUFFER_BUSY(&pIoPortLocal->readBuf); --- 359,363 ---- RtlZeroMemory(pSysBuf, sizeof(*pSysBuf)); ! KeAcquireSpinLock(pIoPortLocal->pIoLock, &oldIrql); pSysBuf->AmountInInQueue = (ULONG)C0C_BUFFER_BUSY(&pIoPortLocal->readBuf); *************** *** 387,391 **** pIoPortLocal->errors = 0; ! KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); pIrp->IoStatus.Information = sizeof(SERIAL_STATUS); --- 390,394 ---- pIoPortLocal->errors = 0; ! KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql); pIrp->IoStatus.Information = sizeof(SERIAL_STATUS); *************** *** 417,425 **** InitializeListHead(&queueToComplete); ! KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); status = SetHandFlow(pIoPortLocal, pSysBuf, &queueToComplete); ! KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); FdoPortCompleteQueue(&queueToComplete); break; --- 420,428 ---- InitializeListHead(&queueToComplete); ! KeAcquireSpinLock(pIoPortLocal->pIoLock, &oldIrql); status = SetHandFlow(pIoPortLocal, pSysBuf, &queueToComplete); ! KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql); FdoPortCompleteQueue(&queueToComplete); break; *************** *** 431,437 **** } ! KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); *(PSERIAL_HANDFLOW)pIrp->AssociatedIrp.SystemBuffer = pIoPortLocal->handFlow; ! KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); pIrp->IoStatus.Information = sizeof(SERIAL_HANDFLOW); --- 434,440 ---- } ! KeAcquireSpinLock(pIoPortLocal->pIoLock, &oldIrql); *(PSERIAL_HANDFLOW)pIrp->AssociatedIrp.SystemBuffer = pIoPortLocal->handFlow; ! KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql); pIrp->IoStatus.Information = sizeof(SERIAL_HANDFLOW); *************** *** 455,459 **** pSysBuf = (PSERIAL_CHARS)pIrp->AssociatedIrp.SystemBuffer; ! KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); if (pIoPortLocal->escapeChar && --- 458,462 ---- pSysBuf = (PSERIAL_CHARS)pIrp->AssociatedIrp.SystemBuffer; ! KeAcquireSpinLock(pIoPortLocal->pIoLock, &oldIrql); if (pIoPortLocal->escapeChar && *************** *** 467,471 **** pIoPortLocal->specialChars = *pSysBuf; ! KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); break; } --- 470,474 ---- pIoPortLocal->specialChars = *pSysBuf; ! KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql); break; } *************** *** 476,482 **** } ! KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); *(PSERIAL_CHARS)pIrp->AssociatedIrp.SystemBuffer = pIoPortLocal->specialChars; ! KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); pIrp->IoStatus.Information = sizeof(SERIAL_CHARS); --- 479,485 ---- } ! KeAcquireSpinLock(pIoPortLocal->pIoLock, &oldIrql); *(PSERIAL_CHARS)pIrp->AssociatedIrp.SystemBuffer = pIoPortLocal->specialChars; ! KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql); pIrp->IoStatus.Information = sizeof(SERIAL_CHARS); *************** *** 494,498 **** escapeChar = *(PUCHAR)pIrp->AssociatedIrp.SystemBuffer; ! KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); if (escapeChar && ((escapeChar == pIoPortLocal->specialChars.XoffChar) || --- 497,501 ---- escapeChar = *(PUCHAR)pIrp->AssociatedIrp.SystemBuffer; ! KeAcquireSpinLock(pIoPortLocal->pIoLock, &oldIrql); if (escapeChar && ((escapeChar == pIoPortLocal->specialChars.XoffChar) || *************** *** 508,512 **** } ! KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); break; } --- 511,515 ---- } ! KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql); break; } *************** *** 521,525 **** KeReleaseSpinLock(&pDevExt->controlLock, oldIrql); ! SetWriteDelay(pDevExt); break; case IOCTL_SERIAL_GET_LINE_CONTROL: --- 524,528 ---- KeReleaseSpinLock(&pDevExt->controlLock, oldIrql); ! SetWriteDelay(pIoPortLocal); break; case IOCTL_SERIAL_GET_LINE_CONTROL: *************** *** 546,550 **** KeReleaseSpinLock(&pDevExt->controlLock, oldIrql); ! SetWriteDelay(pDevExt); break; case IOCTL_SERIAL_GET_BAUD_RATE: --- 549,553 ---- KeReleaseSpinLock(&pDevExt->controlLock, oldIrql); ! SetWriteDelay(pIoPortLocal); break; case IOCTL_SERIAL_GET_BAUD_RATE: *************** *** 666,675 **** pReadBuf = &pIoPortLocal->readBuf; ! KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); if (pSysBuf->InSize <= C0C_BUFFER_SIZE(pReadBuf)) { ! KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); break; } ! KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); try { --- 669,678 ---- pReadBuf = &pIoPortLocal->readBuf; ! KeAcquireSpinLock(pIoPortLocal->pIoLock, &oldIrql); if (pSysBuf->InSize <= C0C_BUFFER_SIZE(pReadBuf)) { ! KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql); break; } ! KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql); try { *************** *** 684,688 **** InitializeListHead(&queueToComplete); ! KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); if (SetNewBufferBase(pReadBuf, pBase, pSysBuf->InSize)) { --- 687,691 ---- InitializeListHead(&queueToComplete); ! KeAcquireSpinLock(pIoPortLocal->pIoLock, &oldIrql); if (SetNewBufferBase(pReadBuf, pBase, pSysBuf->InSize)) { *************** *** 699,703 **** } ! KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); FdoPortCompleteQueue(&queueToComplete); break; --- 702,706 ---- } ! KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql); FdoPortCompleteQueue(&queueToComplete); break; Index: com0com.h =================================================================== RCS file: /cvsroot/com0com/com0com/sys/com0com.h,v retrieving revision 1.26 retrieving revision 1.27 diff -C2 -d -r1.26 -r1.27 *** com0com.h 21 Jun 2006 16:23:57 -0000 1.26 --- com0com.h 23 Jun 2006 11:44:52 -0000 1.27 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.27 2006/06/23 11:44:52 vfrolov + * Mass replacement pDevExt by pIoPort + * * Revision 1.26 2006/06/21 16:23:57 vfrolov * Fixed possible BSOD after one port of pair removal *************** *** 234,237 **** --- 237,243 ---- } C0C_IO_PORT, *PC0C_IO_PORT; + #define FDO_PORT_TO_IO_PORT(pDevObj) \ + (((PC0C_FDOPORT_EXTENSION)((pDevObj)->DeviceExtension))->pIoPortLocal) + typedef struct _C0C_PDOPORT_EXTENSION { COMMON_EXTENSION *************** *** 245,249 **** FDO_EXTENSION - PKSPIN_LOCK pIoLock; PC0C_IO_PORT pIoPortLocal; --- 251,254 ---- *************** *** 308,312 **** typedef NTSTATUS (*PC0C_FDOPORT_START_ROUTINE)( ! IN PC0C_FDOPORT_EXTENSION pDevExt, IN PLIST_ENTRY pQueueToComplete); --- 313,317 ---- typedef NTSTATUS (*PC0C_FDOPORT_START_ROUTINE)( ! IN PC0C_IO_PORT pIoPort, IN PLIST_ENTRY pQueueToComplete); *************** *** 314,318 **** NTSTATUS FdoPortStartIrp( ! IN PC0C_FDOPORT_EXTENSION pDevExt, IN PIRP pIrp, IN UCHAR iQueue, --- 319,323 ---- NTSTATUS FdoPortStartIrp( ! IN PC0C_IO_PORT pIoPort, IN PIRP pIrp, IN UCHAR iQueue, *************** *** 320,343 **** VOID CancelQueue(PC0C_IRP_QUEUE pQueue, PLIST_ENTRY pQueueToComplete); ! VOID FdoPortCancelQueues(IN PC0C_FDOPORT_EXTENSION pDevExt); VOID FdoPortCompleteQueue(IN PLIST_ENTRY pQueueToComplete); NTSTATUS FdoPortImmediateChar( ! IN PC0C_FDOPORT_EXTENSION pDevExt, IN PIRP pIrp, IN PIO_STACK_LOCATION pIrpStack); NTSTATUS FdoPortWaitOnMask( ! IN PC0C_FDOPORT_EXTENSION pDevExt, IN PIRP pIrp, IN PIO_STACK_LOCATION pIrpStack); NTSTATUS FdoPortSetWaitMask( ! IN PC0C_FDOPORT_EXTENSION pDevExt, IN PIRP pIrp, IN PIO_STACK_LOCATION pIrpStack); NTSTATUS FdoPortGetWaitMask( ! IN PC0C_FDOPORT_EXTENSION pDevExt, IN PIRP pIrp, IN PIO_STACK_LOCATION pIrpStack); --- 325,348 ---- VOID CancelQueue(PC0C_IRP_QUEUE pQueue, PLIST_ENTRY pQueueToComplete); ! VOID FdoPortCancelQueues(IN PC0C_IO_PORT pIoPort); VOID FdoPortCompleteQueue(IN PLIST_ENTRY pQueueToComplete); NTSTATUS FdoPortImmediateChar( ! IN PC0C_IO_PORT pIoPort, IN PIRP pIrp, IN PIO_STACK_LOCATION pIrpStack); NTSTATUS FdoPortWaitOnMask( ! IN PC0C_IO_PORT pIoPort, IN PIRP pIrp, IN PIO_STACK_LOCATION pIrpStack); NTSTATUS FdoPortSetWaitMask( ! IN PC0C_IO_PORT pIoPort, IN PIRP pIrp, IN PIO_STACK_LOCATION pIrpStack); NTSTATUS FdoPortGetWaitMask( ! IN PC0C_IO_PORT pIoPort, IN PIRP pIrp, IN PIO_STACK_LOCATION pIrpStack); Index: startirp.c =================================================================== RCS file: /cvsroot/com0com/com0com/sys/startirp.c,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** startirp.c 21 Jun 2006 16:23:57 -0000 1.11 --- startirp.c 23 Jun 2006 11:44:52 -0000 1.12 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.12 2006/06/23 11:44:52 vfrolov + * Mass replacement pDevExt by pIoPort + * * Revision 1.11 2006/06/21 16:23:57 vfrolov * Fixed possible BSOD after one port of pair removal *************** *** 122,126 **** VOID CancelRoutine(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp) { ! PC0C_FDOPORT_EXTENSION pDevExt; PC0C_IRP_STATE pState; KIRQL oldIrql; --- 125,129 ---- VOID CancelRoutine(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp) { ! PC0C_IO_PORT pIoPort; PC0C_IRP_STATE pState; KIRQL oldIrql; *************** *** 129,142 **** IoReleaseCancelSpinLock(pIrp->CancelIrql); ! pDevExt = pDevObj->DeviceExtension; pState = GetIrpState(pIrp); HALT_UNLESS(pState); ! pQueue = &pDevExt->pIoPortLocal->irpQueues[pState->iQueue]; ! KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); if (pState->iQueue == C0C_QUEUE_WRITE) { ! pDevExt->pIoPortLocal->amountInWriteQueue -= GetWriteLength(pIrp) - (ULONG)pIrp->IoStatus.Information; } --- 132,145 ---- IoReleaseCancelSpinLock(pIrp->CancelIrql); ! pIoPort = FDO_PORT_TO_IO_PORT(pDevObj); pState = GetIrpState(pIrp); HALT_UNLESS(pState); ! pQueue = &pIoPort->irpQueues[pState->iQueue]; ! KeAcquireSpinLock(pIoPort->pIoLock, &oldIrql); if (pState->iQueue == C0C_QUEUE_WRITE) { ! pIoPort->amountInWriteQueue -= GetWriteLength(pIrp) - (ULONG)pIrp->IoStatus.Information; } *************** *** 150,154 **** ShiftQueue(pQueue); ! KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); TraceIrp("cancel", pIrp, NULL, TRACE_FLAG_RESULTS); --- 153,157 ---- ShiftQueue(pQueue); ! KeReleaseSpinLock(pIoPort->pIoLock, oldIrql); TraceIrp("cancel", pIrp, NULL, TRACE_FLAG_RESULTS); *************** *** 180,184 **** } ! VOID FdoPortCancelQueues(IN PC0C_FDOPORT_EXTENSION pDevExt) { LIST_ENTRY queueToComplete; --- 183,187 ---- } ! VOID FdoPortCancelQueues(IN PC0C_IO_PORT pIoPort) { LIST_ENTRY queueToComplete; *************** *** 187,196 **** InitializeListHead(&queueToComplete); ! KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); for (i = 0 ; i < C0C_QUEUE_SIZE ; i++) ! CancelQueue(&pDevExt->pIoPortLocal->irpQueues[i], &queueToComplete); ! KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); FdoPortCompleteQueue(&queueToComplete); } --- 190,199 ---- InitializeListHead(&queueToComplete); ! KeAcquireSpinLock(pIoPort->pIoLock, &oldIrql); for (i = 0 ; i < C0C_QUEUE_SIZE ; i++) ! CancelQueue(&pIoPort->irpQueues[i], &queueToComplete); ! KeReleaseSpinLock(pIoPort->pIoLock, oldIrql); FdoPortCompleteQueue(&queueToComplete); } *************** *** 213,224 **** if (pState->iQueue == C0C_QUEUE_WRITE) { KIRQL oldIrql; ! PC0C_FDOPORT_EXTENSION pDevExt; ! pDevExt = IoGetCurrentIrpStackLocation(pIrp)->DeviceObject->DeviceExtension; ! KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! pDevExt->pIoPortLocal->amountInWriteQueue -= GetWriteLength(pIrp) - (ULONG)pIrp->IoStatus.Information; ! KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); } --- 216,227 ---- if (pState->iQueue == C0C_QUEUE_WRITE) { KIRQL oldIrql; ! PC0C_IO_PORT pIoPort; ! pIoPort = FDO_PORT_TO_IO_PORT(IoGetCurrentIrpStackLocation(pIrp)->DeviceObject); ! KeAcquireSpinLock(pIoPort->pIoLock, &oldIrql); ! pIoPort->amountInWriteQueue -= GetWriteLength(pIrp) - (ULONG)pIrp->IoStatus.Information; ! KeReleaseSpinLock(pIoPort->pIoLock, oldIrql); } *************** *** 245,249 **** NTSTATUS StartIrp( ! IN PC0C_FDOPORT_EXTENSION pDevExt, IN PIRP pIrp, IN PC0C_IRP_STATE pState, --- 248,252 ---- NTSTATUS StartIrp( ! IN PC0C_IO_PORT pIoPort, IN PIRP pIrp, IN PC0C_IRP_STATE pState, *************** *** 264,273 **** if (length) { ! pDevExt->pIoPortLocal->amountInWriteQueue += length; ! UpdateTransmitToggle(pDevExt->pIoPortLocal, &queueToComplete); } } ! status = pStartRoutine(pDevExt, &queueToComplete); if (status == STATUS_PENDING) { --- 267,276 ---- if (length) { ! pIoPort->amountInWriteQueue += length; ! UpdateTransmitToggle(pIoPort, &queueToComplete); } } ! status = pStartRoutine(pIoPort, &queueToComplete); if (status == STATUS_PENDING) { *************** *** 278,282 **** if (pState->iQueue == C0C_QUEUE_WRITE && status != STATUS_PENDING) { ! pDevExt->pIoPortLocal->amountInWriteQueue -= GetWriteLength(pIrp) - (ULONG)pIrp->IoStatus.Information; } --- 281,285 ---- if (pState->iQueue == C0C_QUEUE_WRITE && status != STATUS_PENDING) { ! pIoPort->amountInWriteQueue -= GetWriteLength(pIrp) - (ULONG)pIrp->IoStatus.Information; } *************** *** 286,290 **** } ! KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); FdoPortCompleteQueue(&queueToComplete); --- 289,293 ---- } ! KeReleaseSpinLock(pIoPort->pIoLock, oldIrql); FdoPortCompleteQueue(&queueToComplete); *************** *** 294,298 **** NTSTATUS FdoPortStartIrp( ! IN PC0C_FDOPORT_EXTENSION pDevExt, IN PIRP pIrp, IN UCHAR iQueue, --- 297,301 ---- NTSTATUS FdoPortStartIrp( ! IN PC0C_IO_PORT pIoPort, IN PIRP pIrp, IN UCHAR iQueue, *************** *** 311,317 **** pState->iQueue = iQueue; ! pQueue = &pDevExt->pIoPortLocal->irpQueues[iQueue]; ! KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); #pragma warning(push, 3) --- 314,320 ---- pState->iQueue = iQueue; ! pQueue = &pIoPort->irpQueues[iQueue]; ! KeAcquireSpinLock(pIoPort->pIoLock, &oldIrql); #pragma warning(push, 3) *************** *** 321,328 **** if (pIrp->Cancel) { status = NoPending(pIrp, STATUS_CANCELLED); ! KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); } else { if (!pQueue->pCurrent) { ! status = StartIrp(pDevExt, pIrp, pState, pQueue, oldIrql, pStartRoutine); } else { PIO_STACK_LOCATION pIrpStack; --- 324,331 ---- if (pIrp->Cancel) { status = NoPending(pIrp, STATUS_CANCELLED); ! KeReleaseSpinLock(pIoPort->pIoLock, oldIrql); } else { if (!pQueue->pCurrent) { ! status = StartIrp(pIoPort, pIrp, pState, pQueue, oldIrql, pStartRoutine); } else { PIO_STACK_LOCATION pIrpStack; *************** *** 358,362 **** pCurrentState->flags |= C0C_IRP_FLAG_IN_QUEUE; ! status = StartIrp(pDevExt, pIrp, pState, pQueue, oldIrql, pStartRoutine); } } --- 361,365 ---- pCurrentState->flags |= C0C_IRP_FLAG_IN_QUEUE; ! status = StartIrp(pIoPort, pIrp, pState, pQueue, oldIrql, pStartRoutine); } } *************** *** 368,377 **** if (pState->iQueue == C0C_QUEUE_WRITE) ! pDevExt->pIoPortLocal->amountInWriteQueue += GetWriteLength(pIrp); status = STATUS_PENDING; } ! KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); } } --- 371,380 ---- if (pState->iQueue == C0C_QUEUE_WRITE) ! pIoPort->amountInWriteQueue += GetWriteLength(pIrp); status = STATUS_PENDING; } ! KeReleaseSpinLock(pIoPort->pIoLock, oldIrql); } } Index: delay.c =================================================================== RCS file: /cvsroot/com0com/com0com/sys/delay.c,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** delay.c 21 Jun 2006 16:23:57 -0000 1.3 --- delay.c 23 Jun 2006 11:44:52 -0000 1.4 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.4 2006/06/23 11:44:52 vfrolov + * Mass replacement pDevExt by pIoPort + * * Revision 1.3 2006/06/21 16:23:57 vfrolov * Fixed possible BSOD after one port of pair removal *************** *** 137,141 **** } ! VOID SetWriteDelay(IN PC0C_FDOPORT_EXTENSION pDevExt) { PC0C_ADAPTIVE_DELAY pWriteDelay; --- 140,144 ---- } ! VOID SetWriteDelay(PC0C_IO_PORT pIoPort) { PC0C_ADAPTIVE_DELAY pWriteDelay; *************** *** 143,153 **** C0C_DELAY_PARAMS params; SERIAL_LINE_CONTROL lineControl; ! pWriteDelay = pDevExt->pIoPortLocal->pWriteDelay; if (!pWriteDelay) return; ! KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); KeAcquireSpinLockAtDpcLevel(&pDevExt->controlLock); --- 146,160 ---- C0C_DELAY_PARAMS params; SERIAL_LINE_CONTROL lineControl; + PC0C_FDOPORT_EXTENSION pDevExt; ! pWriteDelay = pIoPort->pWriteDelay; if (!pWriteDelay) return; ! KeAcquireSpinLock(pIoPort->pIoLock, &oldIrql); ! ! pDevExt = pIoPort->pDevExt; ! HALT_UNLESS(pDevExt); KeAcquireSpinLockAtDpcLevel(&pDevExt->controlLock); *************** *** 194,198 **** } ! KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); } --- 201,205 ---- } ! KeReleaseSpinLock(pIoPort->pIoLock, oldIrql); } Index: adddev.c =================================================================== RCS file: /cvsroot/com0com/com0com/sys/adddev.c,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** adddev.c 21 Jun 2006 16:23:57 -0000 1.15 --- adddev.c 23 Jun 2006 11:44:52 -0000 1.16 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.16 2006/06/23 11:44:52 vfrolov + * Mass replacement pDevExt by pIoPort + * * Revision 1.15 2006/06/21 16:23:57 vfrolov * Fixed possible BSOD after one port of pair removal *************** *** 259,263 **** pDevExt->pIoPortLocal = ((PC0C_PDOPORT_EXTENSION)pPhDevObj->DeviceExtension)->pIoPortLocal; ! pDevExt->pIoLock = pDevExt->pIoPortLocal->pIoLock; if (emuBR) { --- 262,266 ---- pDevExt->pIoPortLocal = ((PC0C_PDOPORT_EXTENSION)pPhDevObj->DeviceExtension)->pIoPortLocal; ! pDevExt->pIoPortLocal->pDevExt = pDevExt; if (emuBR) { *************** *** 295,299 **** pDevExt->baudRate.BaudRate = 1200; ! SetWriteDelay(pDevExt); status = IoCreateSymbolicLink(&pDevExt->win32DeviceName, &pDevExt->ntDeviceName); --- 298,302 ---- pDevExt->baudRate.BaudRate = 1200; ! SetWriteDelay(pDevExt->pIoPortLocal); status = IoCreateSymbolicLink(&pDevExt->win32DeviceName, &pDevExt->ntDeviceName); *************** *** 329,334 **** pNewDevObj->Flags |= DO_BUFFERED_IO; - pDevExt->pIoPortLocal->pDevExt = pDevExt; - Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"AddFdoPort OK"); --- 332,335 ---- Index: write.c =================================================================== RCS file: /cvsroot/com0com/com0com/sys/write.c,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** write.c 21 Jun 2006 16:23:57 -0000 1.7 --- write.c 23 Jun 2006 11:44:52 -0000 1.8 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.8 2006/06/23 11:44:52 vfrolov + * Mass replacement pDevExt by pIoPort + * * Revision 1.7 2006/06/21 16:23:57 vfrolov * Fixed possible BSOD after one port of pair removal *************** *** 49,63 **** NTSTATUS StartIrpWrite( ! IN PC0C_FDOPORT_EXTENSION pDevExt, IN PLIST_ENTRY pQueueToComplete) { return ReadWrite( ! pDevExt->pIoPortLocal->pIoPortRemote, FALSE, ! pDevExt->pIoPortLocal, TRUE, pQueueToComplete); } NTSTATUS FdoPortImmediateChar( ! IN PC0C_FDOPORT_EXTENSION pDevExt, IN PIRP pIrp, IN PIO_STACK_LOCATION pIrpStack) --- 52,66 ---- NTSTATUS StartIrpWrite( ! IN PC0C_IO_PORT pIoPort, IN PLIST_ENTRY pQueueToComplete) { return ReadWrite( ! pIoPort->pIoPortRemote, FALSE, ! pIoPort, TRUE, pQueueToComplete); } NTSTATUS FdoPortImmediateChar( ! IN PC0C_IO_PORT pIoPort, IN PIRP pIrp, IN PIO_STACK_LOCATION pIrpStack) *************** *** 66,73 **** return STATUS_BUFFER_TOO_SMALL; ! return FdoPortStartIrp(pDevExt, pIrp, C0C_QUEUE_WRITE, StartIrpWrite); } ! NTSTATUS FdoPortWrite(IN PC0C_FDOPORT_EXTENSION pDevExt, IN PIRP pIrp) { NTSTATUS status; --- 69,76 ---- return STATUS_BUFFER_TOO_SMALL; ! return FdoPortStartIrp(pIoPort, pIrp, C0C_QUEUE_WRITE, StartIrpWrite); } ! NTSTATUS FdoPortWrite(IN PC0C_IO_PORT pIoPort, IN PIRP pIrp) { NTSTATUS status; *************** *** 75,84 **** pIrp->IoStatus.Information = 0; ! if ((pDevExt->pIoPortLocal->handFlow.ControlHandShake & SERIAL_ERROR_ABORT) && pDevExt->pIoPortLocal->errors) { status = STATUS_CANCELLED; } else { if (IoGetCurrentIrpStackLocation(pIrp)->MajorFunction == IRP_MJ_FLUSH_BUFFERS || IoGetCurrentIrpStackLocation(pIrp)->Parameters.Write.Length) ! status = FdoPortStartIrp(pDevExt, pIrp, C0C_QUEUE_WRITE, StartIrpWrite); else status = STATUS_SUCCESS; --- 78,87 ---- pIrp->IoStatus.Information = 0; ! if ((pIoPort->handFlow.ControlHandShake & SERIAL_ERROR_ABORT) && pIoPort->errors) { status = STATUS_CANCELLED; } else { if (IoGetCurrentIrpStackLocation(pIrp)->MajorFunction == IRP_MJ_FLUSH_BUFFERS || IoGetCurrentIrpStackLocation(pIrp)->Parameters.Write.Length) ! status = FdoPortStartIrp(pIoPort, pIrp, C0C_QUEUE_WRITE, StartIrpWrite); else status = STATUS_SUCCESS; *************** *** 107,111 **** switch (pDevExt->doType) { case C0C_DOTYPE_FP: ! status = FdoPortWrite((PC0C_FDOPORT_EXTENSION)pDevExt, pIrp); break; default: --- 110,114 ---- switch (pDevExt->doType) { case C0C_DOTYPE_FP: ! status = FdoPortWrite(((PC0C_FDOPORT_EXTENSION)pDevExt)->pIoPortLocal, pIrp); break; default: Index: wait.c =================================================================== RCS file: /cvsroot/com0com/com0com/sys/wait.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** wait.c 26 Jan 2005 12:18:54 -0000 1.1 --- wait.c 23 Jun 2006 11:44:52 -0000 1.2 *************** *** 2,6 **** * $Id$ * ! * Copyright (c) 2004-2005 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify --- 2,6 ---- * $Id$ * ! * Copyright (c) 2004-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/23 11:44:52 vfrolov + * Mass replacement pDevExt by pIoPort + * * Revision 1.1 2005/01/26 12:18:54 vfrolov * Initial revision *************** *** 29,47 **** NTSTATUS StartIrpWaitOnMask( ! IN PC0C_FDOPORT_EXTENSION pDevExt, IN PLIST_ENTRY pQueueToComplete) { UNREFERENCED_PARAMETER(pQueueToComplete); ! if (!pDevExt->pIoPortLocal->waitMask) return STATUS_INVALID_PARAMETER; ! if (pDevExt->pIoPortLocal->eventMask) { PIRP pIrp; ! pIrp = pDevExt->pIoPortLocal->irpQueues[C0C_QUEUE_WAIT].pCurrent; ! *((PULONG)pIrp->AssociatedIrp.SystemBuffer) = pDevExt->pIoPortLocal->eventMask; ! pDevExt->pIoPortLocal->eventMask = 0; pIrp->IoStatus.Information = sizeof(ULONG); return STATUS_SUCCESS; --- 32,50 ---- NTSTATUS StartIrpWaitOnMask( ! IN PC0C_IO_PORT pIoPort, IN PLIST_ENTRY pQueueToComplete) { UNREFERENCED_PARAMETER(pQueueToComplete); ! if (!pIoPort->waitMask) return STATUS_INVALID_PARAMETER; ! if (pIoPort->eventMask) { PIRP pIrp; ! pIrp = pIoPort->irpQueues[C0C_QUEUE_WAIT].pCurrent; ! *((PULONG)pIrp->AssociatedIrp.SystemBuffer) = pIoPort->eventMask; ! pIoPort->eventMask = 0; pIrp->IoStatus.Information = sizeof(ULONG); return STATUS_SUCCESS; *************** *** 52,56 **** NTSTATUS FdoPortWaitOnMask( ! IN PC0C_FDOPORT_EXTENSION pDevExt, IN PIRP pIrp, IN PIO_STACK_LOCATION pIrpStack) --- 55,59 ---- NTSTATUS FdoPortWaitOnMask( ! IN PC0C_IO_PORT pIoPort, IN PIRP pIrp, IN PIO_STACK_LOCATION pIrpStack) *************** *** 59,67 **** return STATUS_BUFFER_TOO_SMALL; ! return FdoPortStartIrp(pDevExt, pIrp, C0C_QUEUE_WAIT, StartIrpWaitOnMask); } NTSTATUS FdoPortSetWaitMask( ! IN PC0C_FDOPORT_EXTENSION pDevExt, IN PIRP pIrp, IN PIO_STACK_LOCATION pIrpStack) --- 62,70 ---- return STATUS_BUFFER_TOO_SMALL; ! return FdoPortStartIrp(pIoPort, pIrp, C0C_QUEUE_WAIT, StartIrpWaitOnMask); } NTSTATUS FdoPortSetWaitMask( ! IN PC0C_IO_PORT pIoPort, IN PIRP pIrp, IN PIO_STACK_LOCATION pIrpStack) *************** *** 95,110 **** InitializeListHead(&queueToComplete); ! KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); FdoPortIo( C0C_IO_TYPE_WAIT_COMPLETE, ! &pDevExt->pIoPortLocal->eventMask, ! pDevExt->pIoPortLocal, ! &pDevExt->pIoPortLocal->irpQueues[C0C_QUEUE_WAIT], &queueToComplete); ! pDevExt->pIoPortLocal->waitMask = *pSysBuf; ! pDevExt->pIoPortLocal->eventMask = 0; ! KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); FdoPortCompleteQueue(&queueToComplete); --- 98,113 ---- InitializeListHead(&queueToComplete); ! KeAcquireSpinLock(pIoPort->pIoLock, &oldIrql); FdoPortIo( C0C_IO_TYPE_WAIT_COMPLETE, ! &pIoPort->eventMask, ! pIoPort, ! &pIoPort->irpQueues[C0C_QUEUE_WAIT], &queueToComplete); ! pIoPort->waitMask = *pSysBuf; ! pIoPort->eventMask = 0; ! KeReleaseSpinLock(pIoPort->pIoLock, oldIrql); FdoPortCompleteQueue(&queueToComplete); *************** *** 113,117 **** NTSTATUS FdoPortGetWaitMask( ! IN PC0C_FDOPORT_EXTENSION pDevExt, IN PIRP pIrp, IN PIO_STACK_LOCATION pIrpStack) --- 116,120 ---- NTSTATUS FdoPortGetWaitMask( ! IN PC0C_IO_PORT pIoPort, IN PIRP pIrp, IN PIO_STACK_LOCATION pIrpStack) *************** *** 125,131 **** pSysBuf = (PULONG)pIrp->AssociatedIrp.SystemBuffer; ! KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! *pSysBuf = pDevExt->pIoPortLocal->waitMask; ! KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); pIrp->IoStatus.Information = sizeof(ULONG); --- 128,134 ---- pSysBuf = (PULONG)pIrp->AssociatedIrp.SystemBuffer; ! KeAcquireSpinLock(pIoPort->pIoLock, &oldIrql); ! *pSysBuf = pIoPort->waitMask; ! KeReleaseSpinLock(pIoPort->pIoLock, oldIrql); pIrp->IoStatus.Information = sizeof(ULONG); Index: read.c =================================================================== RCS file: /cvsroot/com0com/com0com/sys/read.c,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** read.c 21 Jun 2006 16:23:57 -0000 1.5 --- read.c 23 Jun 2006 11:44:52 -0000 1.6 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.6 2006/06/23 11:44:52 vfrolov + * Mass replacement pDevExt by pIoPort + * * Revision 1.5 2006/06/21 16:23:57 vfrolov * Fixed possible BSOD after one port of pair removal *************** *** 43,56 **** NTSTATUS StartIrpRead( ! IN PC0C_FDOPORT_EXTENSION pDevExt, IN PLIST_ENTRY pQueueToComplete) { return ReadWrite( ! pDevExt->pIoPortLocal, TRUE, ! pDevExt->pIoPortLocal->pIoPortRemote, FALSE, pQueueToComplete); } ! NTSTATUS FdoPortRead(IN PC0C_FDOPORT_EXTENSION pDevExt, IN PIRP pIrp) { NTSTATUS status; --- 46,59 ---- NTSTATUS StartIrpRead( ! IN PC0C_IO_PORT pIoPort, IN PLIST_ENTRY pQueueToComplete) { return ReadWrite( ! pIoPort, TRUE, ! pIoPort->pIoPortRemote, FALSE, pQueueToComplete); } ! NTSTATUS FdoPortRead(IN PC0C_IO_PORT pIoPort, IN PIRP pIrp) { NTSTATUS status; *************** *** 58,66 **** pIrp->IoStatus.Information = 0; ! if ((pDevExt->pIoPortLocal->handFlow.ControlHandShake & SERIAL_ERROR_ABORT) && pDevExt->pIoPortLocal->errors) { status = STATUS_CANCELLED; } else { if (IoGetCurrentIrpStackLocation(pIrp)->Parameters.Read.Length) ! status = FdoPortStartIrp(pDevExt, pIrp, C0C_QUEUE_READ, StartIrpRead); else status = STATUS_SUCCESS; --- 61,69 ---- pIrp->IoStatus.Information = 0; ! if ((pIoPort->handFlow.ControlHandShake & SERIAL_ERROR_ABORT) && pIoPort->errors) { status = STATUS_CANCELLED; } else { if (IoGetCurrentIrpStackLocation(pIrp)->Parameters.Read.Length) ! status = FdoPortStartIrp(pIoPort, pIrp, C0C_QUEUE_READ, StartIrpRead); else status = STATUS_SUCCESS; *************** *** 89,93 **** switch (pDevExt->doType) { case C0C_DOTYPE_FP: ! status = FdoPortRead((PC0C_FDOPORT_EXTENSION)pDevExt, pIrp); break; default: --- 92,96 ---- switch (pDevExt->doType) { case C0C_DOTYPE_FP: ! status = FdoPortRead(((PC0C_FDOPORT_EXTENSION)pDevExt)->pIoPortLocal, pIrp); break; default: Index: delay.h =================================================================== RCS file: /cvsroot/com0com/com0com/sys/delay.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** delay.h 21 Jun 2006 16:23:57 -0000 1.2 --- delay.h 23 Jun 2006 11:44:52 -0000 1.3 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.3 2006/06/23 11:44:52 vfrolov + * Mass replacement pDevExt by pIoPort + * * Revision 1.2 2006/06/21 16:23:57 vfrolov * Fixed possible BSOD after one port of pair removal *************** *** 51,55 **** VOID FreeWriteDelay(PC0C_IO_PORT pIoPort); SIZE_T GetWriteLimit(PC0C_ADAPTIVE_DELAY pWriteDelay); ! VOID SetWriteDelay(IN PC0C_FDOPORT_EXTENSION pDevExt); VOID StartWriteDelayTimer(PC0C_ADAPTIVE_DELAY pWriteDelay); VOID StopWriteDelayTimer(PC0C_ADAPTIVE_DELAY pWriteDelay); --- 54,58 ---- VOID FreeWriteDelay(PC0C_IO_PORT pIoPort); SIZE_T GetWriteLimit(PC0C_ADAPTIVE_DELAY pWriteDelay); ! VOID SetWriteDelay(PC0C_IO_PORT pIoPort); VOID StartWriteDelayTimer(PC0C_ADAPTIVE_DELAY pWriteDelay); VOID StopWriteDelayTimer(PC0C_ADAPTIVE_DELAY pWriteDelay); |
From: Vyacheslav F. <vf...@us...> - 2006-06-23 07:38:41
|
Update of /cvsroot/com0com/com0com/sys In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv31821 Modified Files: tracetbl.c Log Message: Added STATUS_DEVICE_BUSY Index: tracetbl.c =================================================================== RCS file: /cvsroot/com0com/com0com/sys/tracetbl.c,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** tracetbl.c 19 May 2006 15:02:03 -0000 1.7 --- tracetbl.c 23 Jun 2006 07:38:39 -0000 1.8 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.8 2006/06/23 07:38:39 vfrolov + * Added STATUS_DEVICE_BUSY + * * Revision 1.7 2006/05/19 15:02:03 vfrolov * Implemented IOCTL_SERIAL_GET_MODEM_CONTROL *************** *** 231,234 **** --- 234,238 ---- TOCODE2NAME(STATUS_, UNSUCCESSFUL), TOCODE2NAME(STATUS_, OBJECT_NAME_NOT_FOUND), + TOCODE2NAME(STATUS_, DEVICE_BUSY), {0, NULL} }; |
From: Vyacheslav F. <vf...@us...> - 2006-06-23 07:37:29
|
Update of /cvsroot/com0com/com0com/sys In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv31366 Modified Files: pnp.c Log Message: Disabled usage pDevExt after deleting device Added check of openCount to IRP_MN_QUERY_REMOVE_DEVICE Index: pnp.c =================================================================== RCS file: /cvsroot/com0com/com0com/sys/pnp.c,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** pnp.c 14 Jul 2005 13:51:07 -0000 1.4 --- pnp.c 23 Jun 2006 07:37:24 -0000 1.5 *************** *** 2,6 **** * $Id$ * ! * Copyright (c) 2004-2005 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify --- 2,6 ---- * $Id$ * ! * Copyright (c) 2004-2006 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify *************** *** 20,23 **** --- 20,27 ---- * * $Log$ + * Revision 1.5 2006/06/23 07:37:24 vfrolov + * Disabled usage pDevExt after deleting device + * Added check of openCount to IRP_MN_QUERY_REMOVE_DEVICE + * * Revision 1.4 2005/07/14 13:51:07 vfrolov * Replaced ASSERT by HALT_UNLESS *************** *** 109,112 **** --- 113,117 ---- case IRP_MN_REMOVE_DEVICE: RemoveFdoBus(pDevExt); + pDevExt = NULL; break; } *************** *** 300,313 **** PDEVICE_OBJECT pLowDevObj = pDevExt->pLowDevObj; // IRP_MN_REMOVE_DEVICE deletes *pDevExt! switch (minorFunction) { case IRP_MN_REMOVE_DEVICE: RemoveFdoPort(pDevExt); break; } ! IoSkipCurrentIrpStackLocation(pIrp); ! status = IoCallDriver(pLowDevObj, pIrp); ! TraceCode((PC0C_COMMON_EXTENSION)pDevExt, "PNP ", codeNameTablePnp, minorFunction, &status); return status; --- 305,332 ---- PDEVICE_OBJECT pLowDevObj = pDevExt->pLowDevObj; // IRP_MN_REMOVE_DEVICE deletes *pDevExt! + status = STATUS_SUCCESS; + switch (minorFunction) { + case IRP_MN_QUERY_REMOVE_DEVICE: + if (pDevExt->openCount) + status = STATUS_DEVICE_BUSY; + break; case IRP_MN_REMOVE_DEVICE: RemoveFdoPort(pDevExt); + pDevExt = NULL; break; } ! if (status == STATUS_SUCCESS) { ! IoSkipCurrentIrpStackLocation(pIrp); ! status = IoCallDriver(pLowDevObj, pIrp); ! TraceCode((PC0C_COMMON_EXTENSION)pDevExt, "PNP ", codeNameTablePnp, minorFunction, &status); ! } else { ! TraceIrp("PNP", pIrp, &status, TRACE_FLAG_RESULTS); ! ! pIrp->IoStatus.Status = status; ! IoCompleteRequest(pIrp, IO_NO_INCREMENT); ! } return status; |
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] |
From: Vyacheslav F. <vf...@us...> - 2006-06-13 16:06:05
|
Update of /cvsroot/com0com/homepage In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv9664 Modified Files: index.html Log Message: Fixed links to ReadMe.txt Index: index.html =================================================================== RCS file: /cvsroot/com0com/homepage/index.html,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** index.html 2 Sep 2005 09:54:59 -0000 1.3 --- index.html 13 Jun 2006 16:05:58 -0000 1.4 *************** *** 39,45 **** </p> <p>You can find more information in ! <a href="http://cvs.sourceforge.net/viewcvs.py/*checkout*/com0com/com0com/ReadMe.txt?rev=RELEASED"> ReadMe.txt for com0com</a>, ! <a href="http://cvs.sourceforge.net/viewcvs.py/*checkout*/com0com/com2tcp/ReadMe.txt?rev=RELEASED"> ReadMe.txt for com2tcp</a> and on --- 39,45 ---- </p> <p>You can find more information in ! <a href="http://com0com.cvs.sourceforge.net/*checkout*/com0com/com0com/ReadMe.txt?revision=RELEASED"> ReadMe.txt for com0com</a>, ! <a href="http://com0com.cvs.sourceforge.net/*checkout*/com0com/com2tcp/ReadMe.txt?revision=RELEASED"> ReadMe.txt for com2tcp</a> and on |
From: Vyacheslav F. <vf...@us...> - 2006-06-13 14:40:54
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv5310 Added Files: dirs Log Message: Initial revision --- NEW FILE: dirs --- DIRS= \ sys \ |
From: Vyacheslav F. <vf...@us...> - 2006-06-08 11:33:42
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv29214 Modified Files: openclos.c startirp.c timeout.c Log Message: Fixed bugs with amountInWriteQueue Index: startirp.c =================================================================== RCS file: /cvsroot/com0com/com0com/startirp.c,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** startirp.c 17 May 2006 15:31:14 -0000 1.9 --- startirp.c 8 Jun 2006 11:33:35 -0000 1.10 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.10 2006/06/08 11:33:35 vfrolov + * Fixed bugs with amountInWriteQueue + * * Revision 1.9 2006/05/17 15:31:14 vfrolov * Implemented SERIAL_TRANSMIT_TOGGLE *************** *** 206,215 **** --- 209,221 ---- if (pState->iQueue == C0C_QUEUE_WRITE) { + KIRQL oldIrql; PC0C_FDOPORT_EXTENSION pDevExt; pDevExt = IoGetCurrentIrpStackLocation(pIrp)->DeviceObject->DeviceExtension; + KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); pDevExt->pIoPortLocal->amountInWriteQueue -= GetWriteLength(pIrp) - (ULONG)pIrp->IoStatus.Information; + KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); } Index: openclos.c =================================================================== RCS file: /cvsroot/com0com/com0com/openclos.c,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** openclos.c 5 Apr 2006 07:22:15 -0000 1.12 --- openclos.c 8 Jun 2006 11:33:35 -0000 1.13 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.13 2006/06/08 11:33:35 vfrolov + * Fixed bugs with amountInWriteQueue + * * Revision 1.12 2006/04/05 07:22:15 vfrolov * Replaced flipXoffLimit flag by writeHoldingRemote to correct handFlow changing *************** *** 64,67 **** --- 67,71 ---- #include "handflow.h" #include "bufutils.h" + #include "strutils.h" NTSTATUS FdoPortOpen(IN PC0C_FDOPORT_EXTENSION pDevExt) *************** *** 107,111 **** #if DBG if (pDevExt->pIoPortLocal->amountInWriteQueue) { ! Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"!!!WARNING!!! amountInWriteQueue != 0"); } #endif /* DBG */ --- 111,125 ---- #if DBG if (pDevExt->pIoPortLocal->amountInWriteQueue) { ! NTSTATUS status; ! UNICODE_STRING msg; ! ! status = STATUS_SUCCESS; ! RtlInitUnicodeString(&msg, NULL); ! StrAppendStr0(&status, &msg, L"!!!WARNING!!! amountInWriteQueue = "); ! StrAppendNum(&status, &msg, pDevExt->pIoPortLocal->amountInWriteQueue, 10); ! ! Trace0((PC0C_COMMON_EXTENSION)pDevExt, msg.Buffer); ! ! StrFree(&msg); } #endif /* DBG */ *************** *** 115,118 **** --- 129,133 ---- InitBuffer(&pDevExt->pIoPortLocal->readBuf, pBase, size); + pDevExt->pIoPortLocal->amountInWriteQueue = 0; pDevExt->pIoPortLocal->tryWrite = FALSE; pDevExt->pIoPortLocal->errors = 0; Index: timeout.c =================================================================== RCS file: /cvsroot/com0com/com0com/timeout.c,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** timeout.c 5 Dec 2005 10:54:55 -0000 1.5 --- timeout.c 8 Jun 2006 11:33:35 -0000 1.6 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.6 2006/06/08 11:33:35 vfrolov + * Fixed bugs with amountInWriteQueue + * * Revision 1.5 2005/12/05 10:54:55 vfrolov * Implemented IOCTL_SERIAL_IMMEDIATE_CHAR *************** *** 65,68 **** --- 68,85 ---- if (pCancelRoutine) { + PC0C_IRP_STATE pState; + + pState = GetIrpState(pIrp); + HALT_UNLESS(pState); + + if (pState->iQueue == C0C_QUEUE_WRITE) { + PC0C_FDOPORT_EXTENSION pDevExt; + + pDevExt = IoGetCurrentIrpStackLocation(pIrp)->DeviceObject->DeviceExtension; + + pDevExt->pIoPortLocal->amountInWriteQueue -= + GetWriteLength(pIrp) - (ULONG)pIrp->IoStatus.Information; + } + ShiftQueue(pQueue); if (pQueue->pCurrent) |
From: Vyacheslav F. <vf...@us...> - 2006-06-08 11:31:00
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv27936 Modified Files: trace.c Log Message: Added params check to Trace0() and Trace00() Index: trace.c =================================================================== RCS file: /cvsroot/com0com/com0com/trace.c,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** trace.c 19 May 2006 15:02:03 -0000 1.19 --- trace.c 8 Jun 2006 11:30:52 -0000 1.20 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.20 2006/06/08 11:30:52 vfrolov + * Added params check to Trace0() and Trace00() + * * Revision 1.19 2006/05/19 15:02:03 vfrolov * Implemented IOCTL_SERIAL_GET_MODEM_CONTROL *************** *** 1096,1100 **** IN PWCHAR pStr) { ! if (!TRACE_FILE_OK) return; --- 1099,1103 ---- IN PWCHAR pStr) { ! if (!TRACE_FILE_OK || !pStr) return; *************** *** 1107,1111 **** IN PWCHAR pStr2) { ! if (!TRACE_FILE_OK) return; --- 1110,1114 ---- IN PWCHAR pStr2) { ! if (!TRACE_FILE_OK || !pStr1 || !pStr2) return; |
From: Vyacheslav F. <vf...@us...> - 2006-05-19 15:02:34
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv24665 Modified Files: ioctl.c trace.c trace.h tracetbl.c Log Message: Implemented IOCTL_SERIAL_GET_MODEM_CONTROL Index: trace.c =================================================================== RCS file: /cvsroot/com0com/com0com/trace.c,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** trace.c 10 Jan 2006 09:44:04 -0000 1.18 --- trace.c 19 May 2006 15:02:03 -0000 1.19 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.19 2006/05/19 15:02:03 vfrolov + * Implemented IOCTL_SERIAL_GET_MODEM_CONTROL + * * Revision 1.18 2006/01/10 09:44:04 vfrolov * Added ability to enable/disable dump *************** *** 1295,1303 **** } break; case IOCTL_SERIAL_GET_DTRRTS: if ((flags & TRACE_FLAG_RESULTS) && inform >= sizeof(ULONG)) { pDestStr = AnsiStrCopyStr(pDestStr, &size, " "); pDestStr = AnsiStrCopyMask(pDestStr, &size, ! codeNameTableDTRRTS, *((PULONG)pSysBuf)); } break; --- 1298,1307 ---- } break; + case IOCTL_SERIAL_GET_MODEM_CONTROL: case IOCTL_SERIAL_GET_DTRRTS: if ((flags & TRACE_FLAG_RESULTS) && inform >= sizeof(ULONG)) { pDestStr = AnsiStrCopyStr(pDestStr, &size, " "); pDestStr = AnsiStrCopyMask(pDestStr, &size, ! codeNameTableModemControl, *((PULONG)pSysBuf)); } break; Index: trace.h =================================================================== RCS file: /cvsroot/com0com/com0com/trace.h,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** trace.h 10 Jan 2006 09:32:20 -0000 1.8 --- trace.h 19 May 2006 15:02:03 -0000 1.9 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.9 2006/05/19 15:02:03 vfrolov + * Implemented IOCTL_SERIAL_GET_MODEM_CONTROL + * * Revision 1.8 2006/01/10 09:32:20 vfrolov * Added codeNameTableHoldReasons[] *************** *** 118,122 **** CODE2NAME codeNameTableDoType[]; CODE2NAME codeNameTableModemStatus[]; ! CODE2NAME codeNameTableDTRRTS[]; CODE2NAME codeNameTableStatus[]; CODE2NAME codeNameTableIrpMj[]; --- 121,125 ---- CODE2NAME codeNameTableDoType[]; CODE2NAME codeNameTableModemStatus[]; ! CODE2NAME codeNameTableModemControl[]; CODE2NAME codeNameTableStatus[]; CODE2NAME codeNameTableIrpMj[]; Index: tracetbl.c =================================================================== RCS file: /cvsroot/com0com/com0com/tracetbl.c,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** tracetbl.c 10 Jan 2006 09:32:20 -0000 1.6 --- tracetbl.c 19 May 2006 15:02:03 -0000 1.7 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.7 2006/05/19 15:02:03 vfrolov + * Implemented IOCTL_SERIAL_GET_MODEM_CONTROL + * * Revision 1.6 2006/01/10 09:32:20 vfrolov * Added codeNameTableHoldReasons[] *************** *** 180,186 **** }; ! CODE2NAME codeNameTableDTRRTS[] = { {SERIAL_DTR_STATE, "DTR"}, {SERIAL_RTS_STATE, "RTS"}, {0, NULL} }; --- 183,192 ---- }; ! CODE2NAME codeNameTableModemControl[] = { {SERIAL_DTR_STATE, "DTR"}, {SERIAL_RTS_STATE, "RTS"}, + {0x04, "OUT1"}, + {0x08, "OUT2"}, + {0x10, "LOOP"}, {0, NULL} }; Index: ioctl.c =================================================================== RCS file: /cvsroot/com0com/com0com/ioctl.c,v retrieving revision 1.21 retrieving revision 1.22 diff -C2 -d -r1.21 -r1.22 *** ioctl.c 18 May 2006 09:38:10 -0000 1.21 --- ioctl.c 19 May 2006 15:02:03 -0000 1.22 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.22 2006/05/19 15:02:03 vfrolov + * Implemented IOCTL_SERIAL_GET_MODEM_CONTROL + * * Revision 1.21 2006/05/18 09:38:10 vfrolov * Implemented SERIAL_TX_WAITING_XOFF_SENT *************** *** 177,180 **** --- 180,184 ---- } break; + case IOCTL_SERIAL_GET_MODEM_CONTROL: case IOCTL_SERIAL_GET_DTRRTS: { ULONG modemStatusRemote; *************** *** 193,196 **** --- 197,203 ---- ((modemStatusRemote & C0C_MSB_CTS) ? SERIAL_RTS_STATE : 0); + if (code == IOCTL_SERIAL_GET_MODEM_CONTROL) + *(PULONG)pIrp->AssociatedIrp.SystemBuffer |= 0x8; + pIrp->IoStatus.Information = sizeof(ULONG); |
From: Vyacheslav F. <vf...@us...> - 2006-05-19 12:16:30
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv13144 Modified Files: handflow.c Log Message: Implemented SERIAL_XOFF_CONTINUE Index: handflow.c =================================================================== RCS file: /cvsroot/com0com/com0com/handflow.c,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** handflow.c 17 May 2006 15:31:14 -0000 1.5 --- handflow.c 19 May 2006 12:16:19 -0000 1.6 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.6 2006/05/19 12:16:19 vfrolov + * Implemented SERIAL_XOFF_CONTINUE + * * Revision 1.5 2006/05/17 15:31:14 vfrolov * Implemented SERIAL_TRANSMIT_TOGGLE *************** *** 76,81 **** // Set local side ! if ((pNewHandFlow->FlowReplace & SERIAL_AUTO_TRANSMIT) == 0) SetXonXoffHolding(pIoPortLocal, C0C_XCHAR_ON); if (!pHandFlow || --- 79,88 ---- // 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 || *************** *** 166,169 **** --- 173,178 ---- 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; *************** *** 173,176 **** --- 182,186 ---- 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 *************** *** 246,249 **** --- 256,261 ---- 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; *************** *** 266,269 **** --- 278,282 ---- if (pHandFlowLocal->FlowReplace & SERIAL_AUTO_RECEIVE) { pIoPortLocal->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_XON; + pIoPortLocal->writeHolding &= ~SERIAL_TX_WAITING_FOR_XON; pIoPortLocal->sendXonXoff = C0C_XCHAR_ON; pIoPortLocal->tryWrite = TRUE; |
From: Vyacheslav F. <vf...@us...> - 2006-05-18 09:38:14
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv30687 Modified Files: ioctl.c Log Message: Implemented SERIAL_TX_WAITING_XOFF_SENT Index: ioctl.c =================================================================== RCS file: /cvsroot/com0com/com0com/ioctl.c,v retrieving revision 1.20 retrieving revision 1.21 diff -C2 -d -r1.20 -r1.21 *** ioctl.c 18 May 2006 08:00:30 -0000 1.20 --- ioctl.c 18 May 2006 09:38:10 -0000 1.21 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.21 2006/05/18 09:38:10 vfrolov + * Implemented SERIAL_TX_WAITING_XOFF_SENT + * * Revision 1.20 2006/05/18 08:00:30 vfrolov * Implemented SERIAL_RX_WAITING_FOR_DSR *************** *** 368,371 **** --- 371,377 ---- } + if (pIoPort->writeHoldingRemote & SERIAL_TX_WAITING_FOR_XON) + pSysBuf->HoldReasons |= SERIAL_TX_WAITING_XOFF_SENT; + pSysBuf->Errors = pIoPort->errors; pIoPort->errors = 0; |
From: Vyacheslav F. <vf...@us...> - 2006-05-18 08:00:44
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv29056 Modified Files: ioctl.c Log Message: Implemented SERIAL_RX_WAITING_FOR_DSR Index: ioctl.c =================================================================== RCS file: /cvsroot/com0com/com0com/ioctl.c,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** ioctl.c 17 May 2006 15:31:14 -0000 1.19 --- ioctl.c 18 May 2006 08:00:30 -0000 1.20 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.20 2006/05/18 08:00:30 vfrolov + * Implemented SERIAL_RX_WAITING_FOR_DSR + * * Revision 1.19 2006/05/17 15:31:14 vfrolov * Implemented SERIAL_TRANSMIT_TOGGLE *************** *** 337,344 **** pSysBuf = (PSERIAL_STATUS)pIrp->AssociatedIrp.SystemBuffer; pIoPort = pDevExt->pIoPortLocal; KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! RtlZeroMemory(pSysBuf, sizeof(*pSysBuf)); pSysBuf->AmountInInQueue = (ULONG)C0C_BUFFER_BUSY(&pIoPort->readBuf); --- 340,348 ---- 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); *************** *** 357,363 **** --- 361,376 ---- 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; + } + pSysBuf->Errors = pIoPort->errors; pIoPort->errors = 0; + KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); + pIrp->IoStatus.Information = sizeof(SERIAL_STATUS); |
From: Vyacheslav F. <vf...@us...> - 2006-05-17 15:31:17
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv20663 Modified Files: handflow.c handflow.h io.c ioctl.c startirp.c Log Message: Implemented SERIAL_TRANSMIT_TOGGLE Index: startirp.c =================================================================== RCS file: /cvsroot/com0com/com0com/startirp.c,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** startirp.c 10 Jan 2006 10:17:23 -0000 1.8 --- startirp.c 17 May 2006 15:31:14 -0000 1.9 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.9 2006/05/17 15:31:14 vfrolov + * Implemented SERIAL_TRANSMIT_TOGGLE + * * Revision 1.8 2006/01/10 10:17:23 vfrolov * Implemented flow control and handshaking *************** *** 50,53 **** --- 53,57 ---- #include "precomp.h" + #include "handflow.h" /* *************** *** 245,252 **** pState->flags |= C0C_IRP_FLAG_IS_CURRENT; - if (pState->iQueue == C0C_QUEUE_WRITE) - pDevExt->pIoPortLocal->amountInWriteQueue += GetWriteLength(pIrp); - InitializeListHead(&queueToComplete); status = pStartRoutine(pDevExt, &queueToComplete); --- 249,263 ---- pState->flags |= C0C_IRP_FLAG_IS_CURRENT; InitializeListHead(&queueToComplete); + + if (pState->iQueue == C0C_QUEUE_WRITE) { + ULONG length = GetWriteLength(pIrp); + + if (length) { + pDevExt->pIoPortLocal->amountInWriteQueue += length; + UpdateTransmitToggle(pDevExt, &queueToComplete); + } + } + status = pStartRoutine(pDevExt, &queueToComplete); Index: io.c =================================================================== RCS file: /cvsroot/com0com/com0com/io.c,v retrieving revision 1.26 retrieving revision 1.27 diff -C2 -d -r1.26 -r1.27 *** io.c 26 Feb 2006 08:39:19 -0000 1.26 --- io.c 17 May 2006 15:31:14 -0000 1.27 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.27 2006/05/17 15:31:14 vfrolov + * Implemented SERIAL_TRANSMIT_TOGGLE + * * Revision 1.26 2006/02/26 08:39:19 vfrolov * Added check for start/stop queue matching *************** *** 1113,1116 **** --- 1116,1121 ---- } + UpdateTransmitToggle(pIoPortWrite->pDevExt, pQueueToComplete); + return status; } *************** *** 1167,1171 **** pIoPort->modemStatus &= ~(~bits & mask); ! /* CD = DSR */ if (pIoPort->modemStatus & C0C_MSB_DSR) pIoPort->modemStatus |= C0C_MSB_RLSD; --- 1172,1176 ---- pIoPort->modemStatus &= ~(~bits & mask); ! /* DCD = DSR */ if (pIoPort->modemStatus & C0C_MSB_DSR) pIoPort->modemStatus |= C0C_MSB_RLSD; Index: handflow.c =================================================================== RCS file: /cvsroot/com0com/com0com/handflow.c,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** handflow.c 5 Apr 2006 07:22:15 -0000 1.4 --- handflow.c 17 May 2006 15:31:14 -0000 1.5 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.5 2006/05/17 15:31:14 vfrolov + * Implemented SERIAL_TRANSMIT_TOGGLE + * * Revision 1.4 2006/04/05 07:22:15 vfrolov * Replaced flipXoffLimit flag by writeHoldingRemote to correct handFlow changing *************** *** 190,193 **** --- 193,198 ---- SetModemStatus(pDevExt->pIoPortRemote, bits, mask, pQueueToComplete); + UpdateTransmitToggle(pDevExt, pQueueToComplete); + SetLimit(pDevExt->pIoPortRemote->pDevExt); SetLimit(pDevExt); *************** *** 271,274 **** --- 276,301 ---- } + VOID UpdateTransmitToggle( + PC0C_FDOPORT_EXTENSION pDevExt, + PLIST_ENTRY pQueueToComplete) + { + if ((pDevExt->handFlow.FlowReplace & SERIAL_RTS_MASK) == SERIAL_TRANSMIT_TOGGLE) { + ULONG bits; + PC0C_IO_PORT pIoPortLocal; + + pIoPortLocal = pDevExt->pIoPortLocal; + + if ((pIoPortLocal->writeHolding & SERIAL_TX_WAITING_ON_BREAK) == 0 && + (pIoPortLocal->sendXonXoff || pIoPortLocal->irpQueues[C0C_QUEUE_WRITE].pCurrent)) + { + bits = C0C_MSB_CTS; + } else { + bits = 0; + } + + SetModemStatus(pDevExt->pIoPortRemote, bits, C0C_MSB_CTS, pQueueToComplete); + } + } + VOID SetLimit(PC0C_FDOPORT_EXTENSION pDevExt) { *************** *** 281,288 **** pReadBuf = &pDevExt->pIoPortLocal->readBuf; if ((((pHandFlowLocal->FlowReplace & SERIAL_RTS_MASK) == SERIAL_RTS_HANDSHAKE) && (pHandFlowRemote->ControlHandShake & SERIAL_CTS_HANDSHAKE)) || (((pHandFlowLocal->ControlHandShake & SERIAL_DTR_MASK) == SERIAL_DTR_HANDSHAKE) && ! (pHandFlowRemote->ControlHandShake & SERIAL_DSR_HANDSHAKE))) { limit = C0C_BUFFER_SIZE(pReadBuf) - pHandFlowLocal->XoffLimit + 1; --- 308,318 ---- pReadBuf = &pDevExt->pIoPortLocal->readBuf; + /* DCD = DSR */ + #define C0C_DSR_HANDSHAKE (SERIAL_DSR_HANDSHAKE|SERIAL_DCD_HANDSHAKE) + if ((((pHandFlowLocal->FlowReplace & SERIAL_RTS_MASK) == SERIAL_RTS_HANDSHAKE) && (pHandFlowRemote->ControlHandShake & SERIAL_CTS_HANDSHAKE)) || (((pHandFlowLocal->ControlHandShake & SERIAL_DTR_MASK) == SERIAL_DTR_HANDSHAKE) && ! (pHandFlowRemote->ControlHandShake & C0C_DSR_HANDSHAKE))) { limit = C0C_BUFFER_SIZE(pReadBuf) - pHandFlowLocal->XoffLimit + 1; *************** *** 354,360 **** if (pIoPort->writeHolding & SERIAL_TX_WAITING_ON_BREAK) { pIoPort->writeHolding &= ~SERIAL_TX_WAITING_ON_BREAK; ! if (!pIoPort->writeHolding && pIoPort->irpQueues[C0C_QUEUE_WRITE].pCurrent) pIoPort->tryWrite = TRUE; } } --- 384,394 ---- if (pIoPort->writeHolding & SERIAL_TX_WAITING_ON_BREAK) { pIoPort->writeHolding &= ~SERIAL_TX_WAITING_ON_BREAK; + pIoPort->sendBreak = FALSE; ! if ((!(pIoPort->writeHolding & ~SERIAL_TX_WAITING_FOR_XON) && pIoPort->sendXonXoff) || ! !pIoPort->writeHolding && pIoPort->irpQueues[C0C_QUEUE_WRITE].pCurrent) ! { pIoPort->tryWrite = TRUE; + } } } Index: ioctl.c =================================================================== RCS file: /cvsroot/com0com/com0com/ioctl.c,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** ioctl.c 14 Apr 2006 15:57:51 -0000 1.18 --- ioctl.c 17 May 2006 15:31:14 -0000 1.19 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.19 2006/05/17 15:31:14 vfrolov + * Implemented SERIAL_TRANSMIT_TOGGLE + * * Revision 1.18 2006/04/14 15:57:51 vfrolov * Fixed XON char sending delay after SERIAL_PURGE_RXCLEAR *************** *** 197,201 **** SetXonXoffHolding(pDevExt->pIoPortLocal, C0C_XCHAR_ON); ! if (pDevExt->pIoPortRemote->tryWrite) { ReadWrite( pDevExt->pIoPortLocal, FALSE, --- 200,204 ---- SetXonXoffHolding(pDevExt->pIoPortLocal, C0C_XCHAR_ON); ! if (pDevExt->pIoPortLocal->tryWrite) { ReadWrite( pDevExt->pIoPortLocal, FALSE, *************** *** 218,224 **** KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); SetBreakHolding(pDevExt->pIoPortLocal, TRUE); - pDevExt->pIoPortLocal->sendBreak = TRUE; ReadWrite( pDevExt->pIoPortLocal, FALSE, --- 221,228 ---- KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); + SetBreakHolding(pDevExt->pIoPortLocal, TRUE); + UpdateTransmitToggle(pDevExt, &queueToComplete); ReadWrite( pDevExt->pIoPortLocal, FALSE, *************** *** 236,242 **** KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); SetBreakHolding(pDevExt->pIoPortLocal, FALSE); ! if (pDevExt->pIoPortRemote->tryWrite) { ReadWrite( pDevExt->pIoPortLocal, FALSE, --- 240,248 ---- KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); + SetBreakHolding(pDevExt->pIoPortLocal, FALSE); + UpdateTransmitToggle(pDevExt, &queueToComplete); ! if (pDevExt->pIoPortLocal->tryWrite || pDevExt->pIoPortRemote->tryWrite) { ReadWrite( pDevExt->pIoPortLocal, FALSE, Index: handflow.h =================================================================== RCS file: /cvsroot/com0com/com0com/handflow.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** handflow.h 17 Feb 2006 07:55:13 -0000 1.2 --- handflow.h 17 May 2006 15:31:14 -0000 1.3 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.3 2006/05/17 15:31:14 vfrolov + * Implemented SERIAL_TRANSMIT_TOGGLE + * * Revision 1.2 2006/02/17 07:55:13 vfrolov * Implemented IOCTL_SERIAL_SET_BREAK_ON and IOCTL_SERIAL_SET_BREAK_OFF *************** *** 42,45 **** --- 45,52 ---- PLIST_ENTRY pQueueToComplete); + VOID UpdateTransmitToggle( + PC0C_FDOPORT_EXTENSION pDevExt, + PLIST_ENTRY pQueueToComplete); + VOID SetLimit(PC0C_FDOPORT_EXTENSION pDevExt); VOID SetModemStatusHolding(PC0C_IO_PORT pIoPort); |
From: Vyacheslav F. <vf...@us...> - 2006-05-17 15:28:08
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv19313 Modified Files: bufutils.c bufutils.h Log Message: Implemented SERIAL_DSR_SENSITIVITY Index: bufutils.c =================================================================== RCS file: /cvsroot/com0com/com0com/bufutils.c,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** bufutils.c 10 Jan 2006 10:17:23 -0000 1.5 --- bufutils.c 17 May 2006 15:28:03 -0000 1.6 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.6 2006/05/17 15:28:03 vfrolov + * Implemented SERIAL_DSR_SENSITIVITY + * * Revision 1.5 2006/01/10 10:17:23 vfrolov * Implemented flow control and handshaking *************** *** 102,105 **** --- 105,115 ---- pHandFlow = &pIoPort->pDevExt->handFlow; + if ((pHandFlow->ControlHandShake & SERIAL_DSR_SENSITIVITY) && + (pIoPort->modemStatus & C0C_MSB_DSR) == 0) + { + pFlowFilter->flags |= C0C_FLOW_FILTER_IGNORE_RECEIVED; + return; + } + if (pHandFlow->FlowReplace & SERIAL_AUTO_TRANSMIT) { pFlowFilter->flags |= C0C_FLOW_FILTER_AUTO_TRANSMIT; *************** *** 168,172 **** readDone += writeDone; } ! } else { writeDone = 0; --- 178,187 ---- readDone += writeDone; } ! } ! else ! if (pFlowFilter->flags & C0C_FLOW_FILTER_IGNORE_RECEIVED) { ! writeDone = writeLength; ! } ! else { writeDone = 0; Index: bufutils.h =================================================================== RCS file: /cvsroot/com0com/com0com/bufutils.h,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** bufutils.h 10 Jan 2006 10:17:23 -0000 1.4 --- bufutils.h 17 May 2006 15:28:03 -0000 1.5 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.5 2006/05/17 15:28:03 vfrolov + * Implemented SERIAL_DSR_SENSITIVITY + * * Revision 1.4 2006/01/10 10:17:23 vfrolov * Implemented flow control and handshaking *************** *** 45,48 **** --- 48,52 ---- #define C0C_FLOW_FILTER_EV_RXFLAG 0x04 #define C0C_FLOW_FILTER_NULL_STRIPPING 0x08 + #define C0C_FLOW_FILTER_IGNORE_RECEIVED 0x10 UCHAR flags; |
From: Vyacheslav F. <vf...@us...> - 2006-05-17 15:25:52
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv18440 Added Files: .cvsignore Log Message: Initial revision --- NEW FILE: .cvsignore --- *.log MSG00001.bin c0clog.h c0clog.rc obj objchk objfre |
From: Vyacheslav F. <vf...@us...> - 2006-04-14 15:57:59
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25788 Modified Files: ioctl.c Log Message: Fixed XON char sending delay after SERIAL_PURGE_RXCLEAR and IOCTL_SERIAL_SET_QUEUE_SIZE Index: ioctl.c =================================================================== RCS file: /cvsroot/com0com/com0com/ioctl.c,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** ioctl.c 17 Feb 2006 07:55:13 -0000 1.17 --- ioctl.c 14 Apr 2006 15:57:51 -0000 1.18 *************** *** 20,23 **** --- 20,27 ---- * * $Log$ + * Revision 1.18 2006/04/14 15:57:51 vfrolov + * Fixed XON char sending delay after SERIAL_PURGE_RXCLEAR + * and IOCTL_SERIAL_SET_QUEUE_SIZE + * * Revision 1.17 2006/02/17 07:55:13 vfrolov * Implemented IOCTL_SERIAL_SET_BREAK_ON and IOCTL_SERIAL_SET_BREAK_OFF *************** *** 302,306 **** PurgeBuffer(&pDevExt->pIoPortLocal->readBuf); UpdateHandFlow(pDevExt, TRUE, &queueToComplete); ! if (pDevExt->pIoPortRemote->tryWrite) { ReadWrite( pDevExt->pIoPortLocal, FALSE, --- 306,310 ---- PurgeBuffer(&pDevExt->pIoPortLocal->readBuf); UpdateHandFlow(pDevExt, TRUE, &queueToComplete); ! if (pDevExt->pIoPortLocal->tryWrite || pDevExt->pIoPortRemote->tryWrite) { ReadWrite( pDevExt->pIoPortLocal, FALSE, *************** *** 652,656 **** SetLimit(pDevExt); UpdateHandFlow(pDevExt, TRUE, &queueToComplete); ! if (pDevExt->pIoPortRemote->tryWrite) { ReadWrite( pDevExt->pIoPortLocal, FALSE, --- 656,660 ---- SetLimit(pDevExt); UpdateHandFlow(pDevExt, TRUE, &queueToComplete); ! if (pDevExt->pIoPortLocal->tryWrite || pDevExt->pIoPortRemote->tryWrite) { ReadWrite( pDevExt->pIoPortLocal, FALSE, |
From: Vyacheslav F. <vf...@us...> - 2006-04-05 07:22:31
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2969 Modified Files: com0com.h handflow.c openclos.c Log Message: Replaced flipXoffLimit flag by writeHoldingRemote to correct handFlow changing Index: handflow.c =================================================================== RCS file: /cvsroot/com0com/com0com/handflow.c,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** handflow.c 15 Mar 2006 13:49:15 -0000 1.3 --- handflow.c 5 Apr 2006 07:22:15 -0000 1.4 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.4 2006/04/05 07:22:15 vfrolov + * Replaced flipXoffLimit flag by writeHoldingRemote to correct handFlow changing + * * Revision 1.3 2006/03/15 13:49:15 vfrolov * Fixed [1446861] Problems with setting DCB.fOutxCtsFlow and DCB.fRtsControl *************** *** 47,50 **** --- 50,54 ---- PLIST_ENTRY pQueueToComplete) { + PC0C_IO_PORT pIoPortLocal; ULONG bits, mask; PC0C_BUFFER pReadBuf; *************** *** 52,59 **** BOOLEAN setModemStatusHolding; ! pReadBuf = &pDevExt->pIoPortLocal->readBuf; if (pHandFlow) { ! if ((pDevExt->pIoPortLocal->escapeChar && (pHandFlow->FlowReplace & SERIAL_ERROR_CHAR)) || ((SIZE_T)pHandFlow->XonLimit > C0C_BUFFER_SIZE(pReadBuf)) || ((SIZE_T)pHandFlow->XoffLimit > C0C_BUFFER_SIZE(pReadBuf))) --- 56,64 ---- 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))) *************** *** 69,73 **** // Set local side if ((pNewHandFlow->FlowReplace & SERIAL_AUTO_TRANSMIT) == 0) ! SetXonXoffHolding(pDevExt->pIoPortLocal, C0C_XCHAR_ON); if (!pHandFlow || --- 74,78 ---- // Set local side if ((pNewHandFlow->FlowReplace & SERIAL_AUTO_TRANSMIT) == 0) ! SetXonXoffHolding(pIoPortLocal, C0C_XCHAR_ON); if (!pHandFlow || *************** *** 87,97 **** (pHandFlow->FlowReplace & SERIAL_RTS_MASK)) { ! if ((pNewHandFlow->FlowReplace & SERIAL_RTS_MASK) == 0) { mask |= C0C_MSB_CTS; // Turn off CTS on remote side if RTS is disabled ! } ! else ! if ((pNewHandFlow->FlowReplace & SERIAL_RTS_MASK) == SERIAL_RTS_CONTROL) { bits |= C0C_MSB_CTS; mask |= C0C_MSB_CTS; } } --- 92,122 ---- (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; + break; + 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; + } + } + else { + bits |= C0C_MSB_CTS; + mask |= C0C_MSB_CTS; + } } } *************** *** 101,111 **** (pHandFlow->ControlHandShake & SERIAL_DTR_MASK)) { ! if ((pNewHandFlow->ControlHandShake & SERIAL_DTR_MASK) == 0) { mask |= C0C_MSB_DSR; // Turn off DSR on remote side if DTR is disabled ! } ! else ! if ((pNewHandFlow->ControlHandShake & SERIAL_DTR_MASK) == SERIAL_DTR_CONTROL) { bits |= C0C_MSB_DSR; mask |= C0C_MSB_DSR; } } --- 126,181 ---- (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; + break; + 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; + } + } + else { + bits |= C0C_MSB_DSR; + mask |= C0C_MSB_DSR; + } + } + } + + 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; + pIoPortLocal->sendXonXoff = C0C_XCHAR_OFF; + pIoPortLocal->tryWrite = TRUE; + } + } + else + if (pIoPortLocal->writeHoldingRemote & SERIAL_TX_WAITING_FOR_XON) { + pIoPortLocal->writeHoldingRemote &= ~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; + } } } *************** *** 115,119 **** if (setModemStatusHolding) ! SetModemStatusHolding(pDevExt->pIoPortLocal); if (mask) --- 185,189 ---- if (setModemStatusHolding) ! SetModemStatusHolding(pIoPortLocal); if (mask) *************** *** 122,138 **** SetLimit(pDevExt->pIoPortRemote->pDevExt); SetLimit(pDevExt); - UpdateHandFlow(pDevExt, TRUE, pQueueToComplete); if (pDevExt->pIoPortRemote->tryWrite) { ReadWrite( ! pDevExt->pIoPortLocal, FALSE, pDevExt->pIoPortRemote, FALSE, pQueueToComplete); } ! if (pDevExt->pIoPortLocal->tryWrite) { ReadWrite( pDevExt->pIoPortRemote, FALSE, ! pDevExt->pIoPortLocal, FALSE, pQueueToComplete); } --- 192,207 ---- 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); } *************** *** 158,172 **** bits = mask = 0; ! if (pIoPortLocal->flipXoffLimit) { if (!freed && C0C_BUFFER_BUSY(pReadBuf) > (C0C_BUFFER_SIZE(pReadBuf) - pHandFlowLocal->XoffLimit)) { ! pIoPortLocal->flipXoffLimit = FALSE; ! ! if ((pHandFlowLocal->FlowReplace & SERIAL_RTS_MASK) == SERIAL_RTS_HANDSHAKE) mask |= C0C_MSB_CTS; ! if ((pHandFlowLocal->ControlHandShake & SERIAL_DTR_MASK) == SERIAL_DTR_HANDSHAKE) mask |= C0C_MSB_DSR; if (pHandFlowLocal->FlowReplace & SERIAL_AUTO_RECEIVE) { pIoPortLocal->sendXonXoff = C0C_XCHAR_OFF; pIoPortLocal->tryWrite = TRUE; --- 227,244 ---- 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; pIoPortLocal->sendXonXoff = C0C_XCHAR_OFF; pIoPortLocal->tryWrite = TRUE; *************** *** 175,181 **** } else { if (freed && C0C_BUFFER_BUSY(pReadBuf) <= (SIZE_T)pHandFlowLocal->XonLimit) { - pIoPortLocal->flipXoffLimit = TRUE; - if ((pHandFlowLocal->FlowReplace & SERIAL_RTS_MASK) == SERIAL_RTS_HANDSHAKE) { bits |= C0C_MSB_CTS; mask |= C0C_MSB_CTS; --- 247,252 ---- } else { 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; *************** *** 183,186 **** --- 254,258 ---- if ((pHandFlowLocal->ControlHandShake & SERIAL_DTR_MASK) == SERIAL_DTR_HANDSHAKE) { + pIoPortLocal->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_DSR; bits |= C0C_MSB_DSR; mask |= C0C_MSB_DSR; *************** *** 188,191 **** --- 260,264 ---- if (pHandFlowLocal->FlowReplace & SERIAL_AUTO_RECEIVE) { + pIoPortLocal->writeHoldingRemote &= ~SERIAL_TX_WAITING_FOR_XON; pIoPortLocal->sendXonXoff = C0C_XCHAR_ON; pIoPortLocal->tryWrite = TRUE; Index: openclos.c =================================================================== RCS file: /cvsroot/com0com/com0com/openclos.c,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** openclos.c 17 Feb 2006 07:55:13 -0000 1.11 --- openclos.c 5 Apr 2006 07:22:15 -0000 1.12 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.12 2006/04/05 07:22:15 vfrolov + * Replaced flipXoffLimit flag by writeHoldingRemote to correct handFlow changing + * * Revision 1.11 2006/02/17 07:55:13 vfrolov * Implemented IOCTL_SERIAL_SET_BREAK_ON and IOCTL_SERIAL_SET_BREAK_OFF *************** *** 139,143 **** KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! pDevExt->pIoPortLocal->flipXoffLimit = FALSE; SetModemStatus(pDevExt->pIoPortRemote, 0, C0C_MSB_CTS | C0C_MSB_DSR, &queueToComplete); FreeBuffer(&pDevExt->pIoPortLocal->readBuf); --- 142,147 ---- KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! pDevExt->pIoPortLocal->writeHoldingRemote = 0; ! pDevExt->pIoPortLocal->sendXonXoff = 0; SetModemStatus(pDevExt->pIoPortRemote, 0, C0C_MSB_CTS | C0C_MSB_DSR, &queueToComplete); FreeBuffer(&pDevExt->pIoPortLocal->readBuf); Index: com0com.h =================================================================== RCS file: /cvsroot/com0com/com0com/com0com.h,v retrieving revision 1.24 retrieving revision 1.25 diff -C2 -d -r1.24 -r1.25 *** com0com.h 26 Feb 2006 08:35:55 -0000 1.24 --- com0com.h 5 Apr 2006 07:22:15 -0000 1.25 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.25 2006/04/05 07:22:15 vfrolov + * Replaced flipXoffLimit flag by writeHoldingRemote to correct handFlow changing + * * Revision 1.24 2006/02/26 08:35:55 vfrolov * Added check for start/stop queue matching *************** *** 215,221 **** short sendXonXoff; ULONG writeHolding; BOOLEAN sendBreak; BOOLEAN tryWrite; - BOOLEAN flipXoffLimit; BOOLEAN emuOverrun; --- 218,224 ---- short sendXonXoff; ULONG writeHolding; + ULONG writeHoldingRemote; BOOLEAN sendBreak; BOOLEAN tryWrite; BOOLEAN emuOverrun; |