com0com-cvs Mailing List for Null-modem emulator (Page 34)
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-03-29 09:39:56
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv20338 Modified Files: adddev.c Log Message: Fixed possible usage uninitialized portName Index: adddev.c =================================================================== RCS file: /cvsroot/com0com/com0com/adddev.c,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** adddev.c 27 Mar 2006 09:38:23 -0000 1.13 --- adddev.c 29 Mar 2006 09:39:28 -0000 1.14 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.14 2006/03/29 09:39:28 vfrolov + * Fixed possible usage uninitialized portName + * * Revision 1.13 2006/03/27 09:38:23 vfrolov * Utilized StrAppendDeviceProperty() *************** *** 124,127 **** --- 127,131 ---- status = STATUS_SUCCESS; + RtlInitUnicodeString(&portName, NULL); RtlInitUnicodeString(&property, NULL); *************** *** 145,150 **** } - RtlInitUnicodeString(&portName, NULL); - { UNICODE_STRING portRegistryPath; --- 149,152 ---- |
From: Vyacheslav F. <vf...@us...> - 2006-03-27 09:43:26
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv10895 Modified Files: adddev.c Log Message: Utilized StrAppendDeviceProperty() Index: adddev.c =================================================================== RCS file: /cvsroot/com0com/com0com/adddev.c,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** adddev.c 26 Feb 2006 08:35:55 -0000 1.12 --- adddev.c 27 Mar 2006 09:38:23 -0000 1.13 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.13 2006/03/27 09:38:23 vfrolov + * Utilized StrAppendDeviceProperty() + * * Revision 1.12 2006/02/26 08:35:55 vfrolov * Added check for start/stop queue matching *************** *** 116,130 **** PC0C_FDOPORT_EXTENSION pDevExt = NULL; ULONG emuBR, emuOverrun; ! WCHAR propertyBuffer[255]; PWCHAR pPortName; - ULONG len; int i; ! status = IoGetDeviceProperty( ! pPhDevObj, ! DevicePropertyPhysicalDeviceObjectName, ! sizeof propertyBuffer, ! propertyBuffer, ! &len); if (!NT_SUCCESS(status)) { --- 119,130 ---- PC0C_FDOPORT_EXTENSION pDevExt = NULL; ULONG emuBR, emuOverrun; ! UNICODE_STRING property; PWCHAR pPortName; int i; ! status = STATUS_SUCCESS; ! RtlInitUnicodeString(&property, NULL); ! ! StrAppendDeviceProperty(&status, &property, pPhDevObj, DevicePropertyPhysicalDeviceObjectName); if (!NT_SUCCESS(status)) { *************** *** 133,141 **** } ! Trace00((PC0C_COMMON_EXTENSION)pPhDevObj->DeviceExtension, L"AddFdoPort for ", propertyBuffer); ! for (pPortName = NULL, i = 0 ; propertyBuffer[i] ; i++) ! if (propertyBuffer[i] == L'\\') ! pPortName = &propertyBuffer[i + 1]; if (!pPortName || !*pPortName) { --- 133,141 ---- } ! Trace00((PC0C_COMMON_EXTENSION)pPhDevObj->DeviceExtension, L"AddFdoPort for ", property.Buffer); ! for (pPortName = NULL, i = 0 ; property.Buffer[i] ; i++) ! if (property.Buffer[i] == L'\\') ! pPortName = &property.Buffer[i + 1]; if (!pPortName || !*pPortName) { *************** *** 243,247 **** RtlInitUnicodeString(&pDevExt->ntDeviceName, NULL); ! StrAppendStr0(&status, &pDevExt->ntDeviceName, propertyBuffer); RtlInitUnicodeString(&pDevExt->win32DeviceName, NULL); --- 243,247 ---- RtlInitUnicodeString(&pDevExt->ntDeviceName, NULL); ! StrAppendStr0(&status, &pDevExt->ntDeviceName, property.Buffer); RtlInitUnicodeString(&pDevExt->win32DeviceName, NULL); *************** *** 330,333 **** --- 330,334 ---- RemoveFdoPort(pDevExt); + StrFree(&property); StrFree(&portName); *************** *** 579,590 **** { NTSTATUS status; ! WCHAR propertyBuffer[255]; ! ULONG len; ! status = IoGetDeviceProperty(pPhDevObj, DevicePropertyHardwareID, ! sizeof propertyBuffer, propertyBuffer, &len); if (NT_SUCCESS(status)) ! Trace00(NULL, L"c0cAddDevice for ", propertyBuffer); else { SysLog(pDrvObj, status, L"c0cAddDevice IoGetDeviceProperty FAIL"); --- 580,592 ---- { NTSTATUS status; ! UNICODE_STRING property; ! status = STATUS_SUCCESS; ! RtlInitUnicodeString(&property, NULL); ! ! StrAppendDeviceProperty(&status, &property, pPhDevObj, DevicePropertyHardwareID); if (NT_SUCCESS(status)) ! Trace00(NULL, L"c0cAddDevice for ", property.Buffer); else { SysLog(pDrvObj, status, L"c0cAddDevice IoGetDeviceProperty FAIL"); *************** *** 592,603 **** } ! if (!_wcsicmp(C0C_PORT_DEVICE_ID, propertyBuffer)) status = AddFdoPort(pDrvObj, pPhDevObj); else ! if (!_wcsicmp(C0C_BUS_DEVICE_ID, propertyBuffer)) status = AddFdoBus(pDrvObj, pPhDevObj); else { status = STATUS_UNSUCCESSFUL; ! SysLog(pDrvObj, status, L"c0cAddDevice unknown property"); } --- 594,610 ---- } ! if (!_wcsicmp(C0C_PORT_DEVICE_ID, property.Buffer)) { ! StrFree(&property); status = AddFdoPort(pDrvObj, pPhDevObj); + } else ! if (!_wcsicmp(C0C_BUS_DEVICE_ID, property.Buffer)) { ! StrFree(&property); status = AddFdoBus(pDrvObj, pPhDevObj); + } else { + StrFree(&property); status = STATUS_UNSUCCESSFUL; ! SysLog(pDrvObj, status, L"c0cAddDevice unknown HardwareID"); } |
From: Vyacheslav F. <vf...@us...> - 2006-03-27 09:37:37
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv10234 Modified Files: strutils.c strutils.h Log Message: Added StrAppendDeviceProperty() Index: strutils.h =================================================================== RCS file: /cvsroot/com0com/com0com/strutils.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** strutils.h 17 May 2005 15:07:36 -0000 1.2 --- strutils.h 27 Mar 2006 09:37:28 -0000 1.3 *************** *** 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.3 2006/03/27 09:37:28 vfrolov + * Added StrAppendDeviceProperty() + * * Revision 1.2 2005/05/17 15:07:36 vfrolov * Fixed parameter type typo *************** *** 26,30 **** * Initial revision * - * */ --- 29,32 ---- *************** *** 48,51 **** --- 50,58 ---- IN ULONG num, IN ULONG base); + VOID StrAppendDeviceProperty( + IN OUT PNTSTATUS pStatus, + IN OUT PUNICODE_STRING pDest, + IN PDEVICE_OBJECT pDevObj, + IN DEVICE_REGISTRY_PROPERTY deviceProperty); #endif /* _C0C_STRUTILS_H_ */ Index: strutils.c =================================================================== RCS file: /cvsroot/com0com/com0com/strutils.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** strutils.c 26 Jan 2005 12:18:54 -0000 1.1 --- strutils.c 27 Mar 2006 09:37:28 -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,27 **** * * $Log$ * Revision 1.1 2005/01/26 12:18:54 vfrolov * Initial revision * - * */ --- 20,29 ---- * * $Log$ + * Revision 1.2 2006/03/27 09:37:28 vfrolov + * Added StrAppendDeviceProperty() + * * Revision 1.1 2005/01/26 12:18:54 vfrolov * Initial revision * */ *************** *** 75,79 **** len = (ULONG)(pStrTmp - pStr) * sizeof(WCHAR); pStrTmp = (PWCHAR)ExAllocatePool(PagedPool, len); ! if (!pStrTmp) return STATUS_INSUFFICIENT_RESOURCES; --- 77,81 ---- len = (ULONG)(pStrTmp - pStr) * sizeof(WCHAR); pStrTmp = (PWCHAR)ExAllocatePool(PagedPool, len); ! if (!pStrTmp) return STATUS_INSUFFICIENT_RESOURCES; *************** *** 181,182 **** --- 183,230 ---- StrAppendStr(pStatus, pDest, numStr.Buffer, numStr.Length); } + + VOID StrAppendDeviceProperty( + IN OUT PNTSTATUS pStatus, + IN OUT PUNICODE_STRING pDest, + IN PDEVICE_OBJECT pDevObj, + IN DEVICE_REGISTRY_PROPERTY deviceProperty) + { + NTSTATUS status; + ULONG len; + + status = *pStatus; + + if (!NT_SUCCESS(status)) + return; + + status = IoGetDeviceProperty(pDevObj, + deviceProperty, + 0, + NULL, + &len); + + if (status == STATUS_BUFFER_TOO_SMALL && len) { + PWCHAR pStrTmp; + + pStrTmp = (PWCHAR)ExAllocatePool(PagedPool, len); + + if (pStrTmp) { + status = IoGetDeviceProperty(pDevObj, + deviceProperty, + len, + pStrTmp, + &len); + + if (NT_SUCCESS(status)) + StrAppendStr0(&status, pDest, pStrTmp); + + ExFreePool(pStrTmp); + } else { + status = STATUS_INSUFFICIENT_RESOURCES; + } + } + + StrFreeBad(status, pDest); + + *pStatus = status; + } |
From: Vyacheslav F. <vf...@us...> - 2006-03-15 13:49:29
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv28310 Modified Files: handflow.c Log Message: Fixed [1446861] Problems with setting DCB.fOutxCtsFlow and DCB.fRtsControl Thanks to Brad (bdwade100 at users.sourceforge.net) Index: handflow.c =================================================================== RCS file: /cvsroot/com0com/com0com/handflow.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** handflow.c 17 Feb 2006 07:55:13 -0000 1.2 --- handflow.c 15 Mar 2006 13:49:15 -0000 1.3 *************** *** 20,23 **** --- 20,27 ---- * * $Log$ + * Revision 1.3 2006/03/15 13:49:15 vfrolov + * Fixed [1446861] Problems with setting DCB.fOutxCtsFlow and DCB.fRtsControl + * Thanks to Brad (bdwade100 at users.sourceforge.net) + * * Revision 1.2 2006/02/17 07:55:13 vfrolov * Implemented IOCTL_SERIAL_SET_BREAK_ON and IOCTL_SERIAL_SET_BREAK_OFF *************** *** 43,49 **** PLIST_ENTRY pQueueToComplete) { ! ULONG bits; PC0C_BUFFER pReadBuf; PSERIAL_HANDFLOW pNewHandFlow; pReadBuf = &pDevExt->pIoPortLocal->readBuf; --- 47,54 ---- PLIST_ENTRY pQueueToComplete) { ! ULONG bits, mask; PC0C_BUFFER pReadBuf; PSERIAL_HANDFLOW pNewHandFlow; + BOOLEAN setModemStatusHolding; pReadBuf = &pDevExt->pIoPortLocal->readBuf; *************** *** 62,69 **** } if ((pNewHandFlow->FlowReplace & SERIAL_AUTO_TRANSMIT) == 0) SetXonXoffHolding(pDevExt->pIoPortLocal, C0C_XCHAR_ON); ! bits = 0; if (!pHandFlow || --- 67,85 ---- } + // Set local side if ((pNewHandFlow->FlowReplace & SERIAL_AUTO_TRANSMIT) == 0) SetXonXoffHolding(pDevExt->pIoPortLocal, C0C_XCHAR_ON); ! if (!pHandFlow || ! (pDevExt->handFlow.ControlHandShake & SERIAL_OUT_HANDSHAKEMASK) != ! (pHandFlow->ControlHandShake & SERIAL_OUT_HANDSHAKEMASK)) ! { ! setModemStatusHolding = TRUE; ! } else { ! setModemStatusHolding = FALSE; ! } ! ! // Set remote side ! bits = mask = 0; if (!pHandFlow || *************** *** 71,76 **** (pHandFlow->FlowReplace & SERIAL_RTS_MASK)) { ! if ((pNewHandFlow->FlowReplace & SERIAL_RTS_MASK) == SERIAL_RTS_CONTROL) bits |= C0C_MSB_CTS; } --- 87,98 ---- (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; + } } *************** *** 79,84 **** (pHandFlow->ControlHandShake & SERIAL_DTR_MASK)) { ! if ((pNewHandFlow->ControlHandShake & SERIAL_DTR_MASK) == SERIAL_DTR_CONTROL) bits |= C0C_MSB_DSR; } --- 101,112 ---- (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; + } } *************** *** 86,91 **** pDevExt->handFlow = *pHandFlow; ! if (bits) ! SetModemStatus(pDevExt->pIoPortRemote, bits, bits, pQueueToComplete); SetLimit(pDevExt->pIoPortRemote->pDevExt); --- 114,122 ---- pDevExt->handFlow = *pHandFlow; ! if (setModemStatusHolding) ! SetModemStatusHolding(pDevExt->pIoPortLocal); ! ! if (mask) ! SetModemStatus(pDevExt->pIoPortRemote, bits, mask, pQueueToComplete); SetLimit(pDevExt->pIoPortRemote->pDevExt); |
From: Vyacheslav F. <vf...@us...> - 2006-02-26 08:39:23
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24906 Modified Files: io.c Log Message: Added check for start/stop queue matching Fixed delayed BREAK losts Index: io.c =================================================================== RCS file: /cvsroot/com0com/com0com/io.c,v retrieving revision 1.25 retrieving revision 1.26 diff -C2 -d -r1.25 -r1.26 *** io.c 21 Feb 2006 13:42:11 -0000 1.25 --- io.c 26 Feb 2006 08:39:19 -0000 1.26 *************** *** 20,23 **** --- 20,27 ---- * * $Log$ + * Revision 1.26 2006/02/26 08:39:19 vfrolov + * Added check for start/stop queue matching + * Fixed delayed BREAK losts + * * Revision 1.25 2006/02/21 13:42:11 vfrolov * Implemented SERIAL_BREAK_CHAR *************** *** 502,507 **** #pragma warning(pop) ! if (*ppCancelRoutine) return pIrp; ShiftQueue(pQueue); --- 506,516 ---- #pragma warning(pop) ! if (*ppCancelRoutine) { ! #if DBG ! HALT_UNLESS(!pQueue->started); ! pQueue->started = TRUE; ! #endif /* DBG */ return pIrp; + } ShiftQueue(pQueue); *************** *** 522,525 **** --- 531,539 ---- PIRP pIrp; + #if DBG + HALT_UNLESS(pQueue->started); + pQueue->started = FALSE; + #endif /* DBG */ + pIrp = pQueue->pCurrent; *************** *** 721,725 **** if (pWriteDelay) { ! if (pQueueWrite->pCurrent || pIoPortWrite->sendXonXoff) { StartWriteDelayTimer(pWriteDelay); writeLimit = GetWriteLimit(pWriteDelay); --- 735,739 ---- if (pWriteDelay) { ! if (pQueueWrite->pCurrent || pIoPortWrite->sendBreak || pIoPortWrite->sendXonXoff) { StartWriteDelayTimer(pWriteDelay); writeLimit = GetWriteLimit(pWriteDelay); |
From: Vyacheslav F. <vf...@us...> - 2006-02-26 08:36:03
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22584 Modified Files: adddev.c com0com.h Log Message: Added check for start/stop queue matching Index: adddev.c =================================================================== RCS file: /cvsroot/com0com/com0com/adddev.c,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** adddev.c 10 Jan 2006 10:17:23 -0000 1.11 --- adddev.c 26 Feb 2006 08:35:55 -0000 1.12 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.12 2006/02/26 08:35:55 vfrolov + * Added check for start/stop queue matching + * * Revision 1.11 2006/01/10 10:17:23 vfrolov * Implemented flow control and handshaking *************** *** 401,404 **** --- 404,410 ---- InitializeListHead(&pIoPortLocal->irpQueues[i].queue); pIoPortLocal->irpQueues[i].pCurrent = NULL; + #if DBG + pIoPortLocal->irpQueues[i].started = FALSE; + #endif /* DBG */ } Index: com0com.h =================================================================== RCS file: /cvsroot/com0com/com0com/com0com.h,v retrieving revision 1.23 retrieving revision 1.24 diff -C2 -d -r1.23 -r1.24 *** com0com.h 17 Feb 2006 07:55:13 -0000 1.23 --- com0com.h 26 Feb 2006 08:35:55 -0000 1.24 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.24 2006/02/26 08:35:55 vfrolov + * Added check for start/stop queue matching + * * Revision 1.23 2006/02/17 07:55:13 vfrolov * Implemented IOCTL_SERIAL_SET_BREAK_ON and IOCTL_SERIAL_SET_BREAK_OFF *************** *** 139,142 **** --- 142,148 ---- PIRP pCurrent; LIST_ENTRY queue; + #if DBG + BOOLEAN started; + #endif /* DBG */ } C0C_IRP_QUEUE, *PC0C_IRP_QUEUE; |
From: Vyacheslav F. <vf...@us...> - 2006-02-21 13:42:18
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2149 Modified Files: io.c Log Message: Implemented SERIAL_BREAK_CHAR Index: io.c =================================================================== RCS file: /cvsroot/com0com/com0com/io.c,v retrieving revision 1.24 retrieving revision 1.25 diff -C2 -d -r1.24 -r1.25 *** io.c 17 Feb 2006 07:55:13 -0000 1.24 --- io.c 21 Feb 2006 13:42:11 -0000 1.25 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.25 2006/02/21 13:42:11 vfrolov + * Implemented SERIAL_BREAK_CHAR + * * Revision 1.24 2006/02/17 07:55:13 vfrolov * Implemented IOCTL_SERIAL_SET_BREAK_ON and IOCTL_SERIAL_SET_BREAK_OFF *************** *** 658,661 **** --- 661,686 ---- } + VOID InsertChar( + PC0C_IO_PORT pIoPortRead, + UCHAR value, + PLIST_ENTRY pQueueToComplete) + { + C0C_RAW_DATA insertData; + + insertData.size = 1; + insertData.data[0] = value; + + if (FdoPortIo( + C0C_IO_TYPE_INSERT, + &insertData, + pIoPortRead, + &pIoPortRead->irpQueues[C0C_QUEUE_READ], + pQueueToComplete) == STATUS_PENDING) + { + AlertOverrun(pIoPortRead, pQueueToComplete); + Trace0((PC0C_COMMON_EXTENSION)pIoPortRead->pDevExt, L"WARNING: Lost char"); + } + } + NTSTATUS TryReadWrite( PC0C_IO_PORT pIoPortRead, *************** *** 979,982 **** --- 1004,1009 ---- InsertLsrMst(pIoPortRead, FALSE, lsr, pQueueToComplete); } + if (pIoPortRead->pDevExt->handFlow.FlowReplace & SERIAL_BREAK_CHAR) + InsertChar(pIoPortRead, pIoPortRead->pDevExt->specialChars.BreakChar, pQueueToComplete); } break; |
From: Vyacheslav F. <vf...@us...> - 2006-02-17 07:55:23
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv11091 Modified Files: com0com.h handflow.c handflow.h io.c ioctl.c openclos.c Log Message: Implemented IOCTL_SERIAL_SET_BREAK_ON and IOCTL_SERIAL_SET_BREAK_OFF Index: openclos.c =================================================================== RCS file: /cvsroot/com0com/com0com/openclos.c,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** openclos.c 10 Jan 2006 10:17:23 -0000 1.10 --- openclos.c 17 Feb 2006 07:55:13 -0000 1.11 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.11 2006/02/17 07:55:13 vfrolov + * Implemented IOCTL_SERIAL_SET_BREAK_ON and IOCTL_SERIAL_SET_BREAK_OFF + * * Revision 1.10 2006/01/10 10:17:23 vfrolov * Implemented flow control and handshaking *************** *** 139,142 **** --- 142,146 ---- SetModemStatus(pDevExt->pIoPortRemote, 0, C0C_MSB_CTS | C0C_MSB_DSR, &queueToComplete); FreeBuffer(&pDevExt->pIoPortLocal->readBuf); + SetBreakHolding(pDevExt->pIoPortLocal, FALSE); KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); Index: ioctl.c =================================================================== RCS file: /cvsroot/com0com/com0com/ioctl.c,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** ioctl.c 10 Jan 2006 10:17:23 -0000 1.16 --- ioctl.c 17 Feb 2006 07:55:13 -0000 1.17 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.17 2006/02/17 07:55:13 vfrolov + * Implemented IOCTL_SERIAL_SET_BREAK_ON and IOCTL_SERIAL_SET_BREAK_OFF + * * Revision 1.16 2006/01/10 10:17:23 vfrolov * Implemented flow control and handshaking *************** *** 205,208 **** --- 208,247 ---- KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); break; + case IOCTL_SERIAL_SET_BREAK_ON: { + LIST_ENTRY queueToComplete; + + InitializeListHead(&queueToComplete); + + KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); + SetBreakHolding(pDevExt->pIoPortLocal, TRUE); + + pDevExt->pIoPortLocal->sendBreak = TRUE; + ReadWrite( + pDevExt->pIoPortLocal, FALSE, + pDevExt->pIoPortRemote, FALSE, + &queueToComplete); + + KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); + FdoPortCompleteQueue(&queueToComplete); + break; + } + case IOCTL_SERIAL_SET_BREAK_OFF:{ + LIST_ENTRY queueToComplete; + + InitializeListHead(&queueToComplete); + + KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); + SetBreakHolding(pDevExt->pIoPortLocal, FALSE); + + if (pDevExt->pIoPortRemote->tryWrite) { + ReadWrite( + pDevExt->pIoPortLocal, FALSE, + pDevExt->pIoPortRemote, FALSE, + &queueToComplete); + } + KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); + FdoPortCompleteQueue(&queueToComplete); + break; + } case IOCTL_SERIAL_GET_MODEMSTATUS: if (pIrpStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(ULONG)) { Index: com0com.h =================================================================== RCS file: /cvsroot/com0com/com0com/com0com.h,v retrieving revision 1.22 retrieving revision 1.23 diff -C2 -d -r1.22 -r1.23 *** com0com.h 10 Jan 2006 10:17:23 -0000 1.22 --- com0com.h 17 Feb 2006 07:55:13 -0000 1.23 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.23 2006/02/17 07:55:13 vfrolov + * Implemented IOCTL_SERIAL_SET_BREAK_ON and IOCTL_SERIAL_SET_BREAK_OFF + * * Revision 1.22 2006/01/10 10:17:23 vfrolov * Implemented flow control and handshaking *************** *** 206,209 **** --- 209,213 ---- short sendXonXoff; ULONG writeHolding; + BOOLEAN sendBreak; BOOLEAN tryWrite; BOOLEAN flipXoffLimit; Index: io.c =================================================================== RCS file: /cvsroot/com0com/com0com/io.c,v retrieving revision 1.23 retrieving revision 1.24 diff -C2 -d -r1.23 -r1.24 *** io.c 10 Jan 2006 10:17:23 -0000 1.23 --- io.c 17 Feb 2006 07:55:13 -0000 1.24 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.24 2006/02/17 07:55:13 vfrolov + * Implemented IOCTL_SERIAL_SET_BREAK_ON and IOCTL_SERIAL_SET_BREAK_OFF + * * Revision 1.23 2006/01/10 10:17:23 vfrolov * Implemented flow control and handshaking *************** *** 122,125 **** --- 125,135 ---- struct { UCHAR chr; + + #define RW_DATA_TYPE_CHR_NONE 0 + #define RW_DATA_TYPE_CHR_XCHR 1 + #define RW_DATA_TYPE_CHR_BREAK 2 + + short type; + BOOLEAN isChr; } chr; *************** *** 127,130 **** --- 137,147 ---- } RW_DATA, *PRW_DATA; + #define CAN_WRITE_RW_DATA_CHR(pIoPort, dataChar) \ + ( \ + ((dataChar).data.chr.type == RW_DATA_TYPE_CHR_XCHR && \ + ((pIoPort)->writeHolding & ~SERIAL_TX_WAITING_FOR_XON) == 0) || \ + ((dataChar).data.chr.type == RW_DATA_TYPE_CHR_BREAK) \ + ) \ + ULONG GetWriteLength(IN PIRP pIrp) { *************** *** 168,171 **** --- 185,199 ---- } + VOID OnRxBreak( + PC0C_IO_PORT pReadIoPort, + PLIST_ENTRY pQueueToComplete) + { + pReadIoPort->errors |= SERIAL_ERROR_BREAK; + pReadIoPort->eventMask |= pReadIoPort->waitMask & (SERIAL_EV_BREAK | SERIAL_EV_ERR); + + if (pReadIoPort->eventMask) + WaitComplete(pReadIoPort, pQueueToComplete); + } + VOID OnRxChars( PC0C_IO_PORT pReadIoPort, *************** *** 188,192 **** pReadIoPort->perfStats.ReceivedCount += (ULONG)size; - pReadIoPort->pDevExt->pIoPortRemote->perfStats.TransmittedCount += (ULONG)size; } --- 216,219 ---- *************** *** 204,207 **** --- 231,237 ---- PC0C_BUFFER pBuf; SIZE_T length; + BOOLEAN isBreak; + + isBreak = FALSE; if (pDataWrite->type == RW_DATA_TYPE_IRP) { *************** *** 217,220 **** --- 247,252 ---- pWriteBuf = &pDataWrite->data.chr.chr; writeLength = pDataWrite->data.chr.isChr ? 1 : 0; + if (pDataWrite->data.chr.type == RW_DATA_TYPE_CHR_BREAK) + isBreak = TRUE; } *************** *** 242,245 **** --- 274,281 ---- OnRxChars(pReadIoPort, writeDone, &flowFilter, pQueueToComplete); + if (isBreak) + OnRxBreak(pReadIoPort, pQueueToComplete); + else + pReadIoPort->pDevExt->pIoPortRemote->perfStats.TransmittedCount += (ULONG)writeDone; } *************** *** 280,283 **** --- 316,322 ---- PVOID pWriteBuf; SIZE_T length; + BOOLEAN isBreak; + + isBreak = FALSE; if (pDataWrite->type == RW_DATA_TYPE_IRP) { *************** *** 293,296 **** --- 332,337 ---- pWriteBuf = &pDataWrite->data.chr.chr; writeLength = pDataWrite->data.chr.isChr ? 1 : 0; + if (pDataWrite->data.chr.type == RW_DATA_TYPE_CHR_BREAK) + isBreak = TRUE; } *************** *** 326,329 **** --- 367,374 ---- OnRxChars(pReadIoPort, writeDone, &flowFilter, pQueueToComplete); + if (isBreak) + OnRxBreak(pReadIoPort, pQueueToComplete); + else + pReadIoPort->pDevExt->pIoPortRemote->perfStats.TransmittedCount += (ULONG)writeDone; } *************** *** 353,356 **** --- 398,404 ---- C0C_FLOW_FILTER flowFilter; PVOID pWriteBuf, pReadBuf; + BOOLEAN isBreak; + + isBreak = FALSE; pReadBuf = GET_REST_BUFFER(pIrpRead, pIrpRead->IoStatus.Information); *************** *** 368,371 **** --- 416,421 ---- pWriteBuf = &pDataWrite->data.chr.chr; writeLength = pDataWrite->data.chr.isChr ? 1 : 0; + if (pDataWrite->data.chr.type == RW_DATA_TYPE_CHR_BREAK) + isBreak = TRUE; } *************** *** 401,406 **** } ! if (writeDone) OnRxChars(pReadIoPort, writeDone, &flowFilter, pQueueToComplete); *pReadDone += readDone; --- 451,461 ---- } ! if (writeDone) { OnRxChars(pReadIoPort, writeDone, &flowFilter, pQueueToComplete); + if (isBreak) + OnRxBreak(pReadIoPort, pQueueToComplete); + else + pReadIoPort->pDevExt->pIoPortRemote->perfStats.TransmittedCount += (ULONG)writeDone; + } *pReadDone += readDone; *************** *** 577,580 **** --- 632,661 ---- } + VOID InsertLsrMst( + PC0C_IO_PORT pIoPortRead, + BOOLEAN isMST, + UCHAR value, + PLIST_ENTRY pQueueToComplete) + { + C0C_RAW_DATA insertData; + + insertData.size = 3; + insertData.data[0] = pIoPortRead->escapeChar; + insertData.data[1] = (UCHAR)(isMST ? SERIAL_LSRMST_MST : SERIAL_LSRMST_LSR_NODATA); + insertData.data[2] = value; + + if (FdoPortIo( + C0C_IO_TYPE_INSERT, + &insertData, + pIoPortRead, + &pIoPortRead->irpQueues[C0C_QUEUE_READ], + pQueueToComplete) == STATUS_PENDING) + { + AlertOverrun(pIoPortRead, pQueueToComplete); + Trace00((PC0C_COMMON_EXTENSION)pIoPortRead->pDevExt, + L"WARNING: Lost SERIAL_LSRMST_", isMST ? L"MST" : L"LSR_NODATA"); + } + } + NTSTATUS TryReadWrite( PC0C_IO_PORT pIoPortRead, *************** *** 593,597 **** SIZE_T doneRead; ! RW_DATA dataCharX; RW_DATA dataIrpWrite; --- 674,678 ---- SIZE_T doneRead; ! RW_DATA dataChar; RW_DATA dataIrpWrite; *************** *** 607,611 **** dataIrpRead.type = RW_DATA_TYPE_IRP; ! dataCharX.type = RW_DATA_TYPE_CHR; dataIrpWrite.type = RW_DATA_TYPE_IRP; --- 688,692 ---- dataIrpRead.type = RW_DATA_TYPE_IRP; ! dataChar.type = RW_DATA_TYPE_CHR; dataIrpWrite.type = RW_DATA_TYPE_IRP; *************** *** 677,693 **** } ! /* get XON or XOFF char */ ! switch (pIoPortWrite->sendXonXoff) { ! case C0C_XCHAR_ON: ! dataCharX.data.chr.chr = pIoPortWrite->pDevExt->specialChars.XonChar; ! dataCharX.data.chr.isChr = TRUE; ! break; ! case C0C_XCHAR_OFF: ! dataCharX.data.chr.chr = pIoPortWrite->pDevExt->specialChars.XoffChar; ! dataCharX.data.chr.isChr = TRUE; ! break; ! default: ! dataCharX.data.chr.isChr = FALSE; } --- 758,787 ---- } ! /* get char */ ! if (pIoPortWrite->sendBreak) { ! /* get BREAK char */ ! ! dataChar.data.chr.type = RW_DATA_TYPE_CHR_BREAK; ! dataChar.data.chr.chr = 0; ! dataChar.data.chr.isChr = TRUE; ! } else { ! /* get XON or XOFF char */ ! ! switch (pIoPortWrite->sendXonXoff) { ! 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; ! default: ! dataChar.data.chr.type = RW_DATA_TYPE_CHR_NONE; ! dataChar.data.chr.isChr = FALSE; ! } } *************** *** 709,720 **** while (dataIrpRead.data.irp.pIrp) { ! if (dataCharX.data.chr.isChr) { if (!pWriteLimit || *pWriteLimit) { ! if ((pIoPortWrite->writeHolding & ~SERIAL_TX_WAITING_FOR_XON) == 0) { if (dataIrpRead.data.irp.status == STATUS_PENDING) { SIZE_T done = 0; ReadWriteDirect(dataIrpRead.data.irp.pIrp, ! &dataCharX, &dataIrpRead.data.irp.status, pIoPortRead, --- 803,814 ---- while (dataIrpRead.data.irp.pIrp) { ! if (dataChar.data.chr.isChr) { if (!pWriteLimit || *pWriteLimit) { ! if (CAN_WRITE_RW_DATA_CHR(pIoPortWrite, dataChar)) { if (dataIrpRead.data.irp.status == STATUS_PENDING) { SIZE_T done = 0; ReadWriteDirect(dataIrpRead.data.irp.pIrp, ! &dataChar, &dataIrpRead.data.irp.status, pIoPortRead, *************** *** 824,833 **** /* write to buffer */ ! if (dataCharX.data.chr.isChr) { if (!pWriteLimit || *pWriteLimit) { ! if ((pIoPortWrite->writeHolding & ~SERIAL_TX_WAITING_FOR_XON) == 0) { SIZE_T done = 0; ! WriteBuffer(&dataCharX, pIoPortRead, pQueueToComplete, pWriteLimit, &done); --- 918,927 ---- /* write to buffer */ ! if (dataChar.data.chr.isChr) { if (!pWriteLimit || *pWriteLimit) { ! if (CAN_WRITE_RW_DATA_CHR(pIoPortWrite, dataChar)) { SIZE_T done = 0; ! WriteBuffer(&dataChar, pIoPortRead, pQueueToComplete, pWriteLimit, &done); *************** *** 848,856 **** if (pIoPortRead->emuOverrun && ! dataCharX.data.chr.isChr && ! (pIoPortWrite->writeHolding & ~SERIAL_TX_WAITING_FOR_XON) == 0 && C0C_BUFFER_BUSY(&pIoPortRead->readBuf) >= C0C_BUFFER_SIZE(&pIoPortRead->readBuf)) { ! WriteOverrun(&dataCharX, pIoPortRead, pQueueToComplete, pWriteLimit, &done); } --- 942,950 ---- if (pIoPortRead->emuOverrun && ! dataChar.data.chr.isChr && ! CAN_WRITE_RW_DATA_CHR(pIoPortWrite, dataChar) && C0C_BUFFER_BUSY(&pIoPortRead->readBuf) >= C0C_BUFFER_SIZE(&pIoPortRead->readBuf)) { ! WriteOverrun(&dataChar, pIoPortRead, pQueueToComplete, pWriteLimit, &done); } *************** *** 869,874 **** } ! if (!dataCharX.data.chr.isChr) ! pIoPortWrite->sendXonXoff = 0; while (dataIrpWrite.data.irp.pIrp) { --- 963,986 ---- } ! if (!dataChar.data.chr.isChr) { ! switch (dataChar.data.chr.type) { ! case RW_DATA_TYPE_CHR_XCHR: ! pIoPortWrite->sendXonXoff = 0; ! break; ! case RW_DATA_TYPE_CHR_BREAK: ! if (pIoPortWrite->sendBreak) { ! pIoPortWrite->sendBreak = FALSE; ! if (pIoPortRead->escapeChar) { ! UCHAR lsr = 0x10; /* break interrupt indicator */ ! ! if (!pIoPortRead->amountInWriteQueue || pIoPortRead->writeHolding) ! lsr |= 0x60; /* transmit holding register empty and transmitter empty indicators */ ! ! InsertLsrMst(pIoPortRead, FALSE, lsr, pQueueToComplete); ! } ! } ! break; ! } ! } while (dataIrpWrite.data.irp.pIrp) { *************** *** 1027,1051 **** SetModemStatusHolding(pIoPort); ! if (pIoPort->escapeChar) { ! NTSTATUS status; ! C0C_RAW_DATA insertData; ! ! insertData.size = 3; ! insertData.data[0] = pIoPort->escapeChar; ! insertData.data[1] = SERIAL_LSRMST_MST; ! insertData.data[2] = (UCHAR)(pIoPort->modemStatus | (modemStatusChanged >> 4)); ! ! status = FdoPortIo( ! C0C_IO_TYPE_INSERT, ! &insertData, ! pIoPort, ! &pIoPort->irpQueues[C0C_QUEUE_READ], ! pQueueToComplete); ! ! if (status == STATUS_PENDING) { ! AlertOverrun(pIoPort, pQueueToComplete); ! Trace0((PC0C_COMMON_EXTENSION)pIoPort->pDevExt, L"WARNING: Lost SERIAL_LSRMST_MST"); ! } ! } if (modemStatusChanged & C0C_MSB_CTS) --- 1139,1145 ---- SetModemStatusHolding(pIoPort); ! if (pIoPort->escapeChar) ! InsertLsrMst(pIoPort, TRUE, ! (UCHAR)(pIoPort->modemStatus | (modemStatusChanged >> 4)), pQueueToComplete); if (modemStatusChanged & C0C_MSB_CTS) Index: handflow.c =================================================================== RCS file: /cvsroot/com0com/com0com/handflow.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** handflow.c 10 Jan 2006 10:12:05 -0000 1.1 --- handflow.c 17 Feb 2006 07:55:13 -0000 1.2 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.2 2006/02/17 07:55:13 vfrolov + * Implemented IOCTL_SERIAL_SET_BREAK_ON and IOCTL_SERIAL_SET_BREAK_OFF + * * Revision 1.1 2006/01/10 10:12:05 vfrolov * Initial revision *************** *** 235,236 **** --- 238,257 ---- } } + + VOID SetBreakHolding(PC0C_IO_PORT pIoPort, BOOLEAN on) + { + if (on) { + if ((pIoPort->writeHolding & SERIAL_TX_WAITING_ON_BREAK) == 0) { + pIoPort->writeHolding |= SERIAL_TX_WAITING_ON_BREAK; + pIoPort->sendBreak = TRUE; + pIoPort->tryWrite = TRUE; + } + } else { + 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; + } + } + } Index: handflow.h =================================================================== RCS file: /cvsroot/com0com/com0com/handflow.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** handflow.h 10 Jan 2006 10:12:05 -0000 1.1 --- handflow.h 17 Feb 2006 07:55:13 -0000 1.2 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.2 2006/02/17 07:55:13 vfrolov + * Implemented IOCTL_SERIAL_SET_BREAK_ON and IOCTL_SERIAL_SET_BREAK_OFF + * * Revision 1.1 2006/01/10 10:12:05 vfrolov * Initial revision *************** *** 42,45 **** --- 45,49 ---- VOID SetModemStatusHolding(PC0C_IO_PORT pIoPort); VOID SetXonXoffHolding(PC0C_IO_PORT pIoPort, short xonXoff); + VOID SetBreakHolding(PC0C_IO_PORT pIoPort, BOOLEAN on); #endif /* _C0C_FLOW_H_ */ |
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7721 Modified Files: adddev.c bufutils.c bufutils.h com0com.h delay.c io.c ioctl.c openclos.c read.c sources startirp.c write.c Log Message: Implemented flow control and handshaking Implemented IOCTL_SERIAL_SET_XON and IOCTL_SERIAL_SET_XOFF Added setting of HoldReasons, WaitForImmediate and AmountInOutQueue fields of SERIAL_STATUS for IOCTL_SERIAL_GET_COMMSTATUS Index: bufutils.c =================================================================== RCS file: /cvsroot/com0com/com0com/bufutils.c,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** bufutils.c 29 Nov 2005 08:35:14 -0000 1.4 --- bufutils.c 10 Jan 2006 10:17:23 -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,29 ---- * * $Log$ + * Revision 1.5 2006/01/10 10:17:23 vfrolov + * Implemented flow control and handshaking + * Implemented IOCTL_SERIAL_SET_XON and IOCTL_SERIAL_SET_XOFF + * Added setting of HoldReasons, WaitForImmediate and AmountInOutQueue + * fields of SERIAL_STATUS for IOCTL_SERIAL_GET_COMMSTATUS + * * Revision 1.4 2005/11/29 08:35:14 vfrolov * Implemented SERIAL_EV_RX80FULL *************** *** 42,45 **** --- 48,52 ---- #define FILE_ID 8 + /********************************************************************/ VOID CompactRawData(PC0C_RAW_DATA pRawData, SIZE_T writeDone) { *************** *** 85,91 **** return pSrcRawData->size ? STATUS_PENDING : STATUS_SUCCESS; } VOID CopyCharsWithEscape( ! PC0C_BUFFER pBuf, UCHAR escapeChar, PUCHAR pReadBuf, SIZE_T readLength, PUCHAR pWriteBuf, SIZE_T writeLength, --- 92,129 ---- return pSrcRawData->size ? STATUS_PENDING : STATUS_SUCCESS; } + /********************************************************************/ + + VOID FlowFilterInit(PC0C_IO_PORT pIoPort, PC0C_FLOW_FILTER pFlowFilter) + { + PSERIAL_HANDFLOW pHandFlow; + + RtlZeroMemory(pFlowFilter, sizeof(*pFlowFilter)); + + pHandFlow = &pIoPort->pDevExt->handFlow; + + 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; + } + + if (pHandFlow->FlowReplace & SERIAL_NULL_STRIPPING) + pFlowFilter->flags |= C0C_FLOW_FILTER_NULL_STRIPPING; + + if (pIoPort->waitMask & SERIAL_EV_RXCHAR) + pFlowFilter->flags |= C0C_FLOW_FILTER_EV_RXCHAR; + + if (pIoPort->waitMask & SERIAL_EV_RXFLAG) { + pFlowFilter->flags |= C0C_FLOW_FILTER_EV_RXFLAG; + pFlowFilter->eventChar = pIoPort->pDevExt->specialChars.EventChar; + } + + pFlowFilter->escapeChar = pIoPort->escapeChar; + } + /********************************************************************/ VOID CopyCharsWithEscape( ! PC0C_BUFFER pBuf, ! PC0C_FLOW_FILTER pFlowFilter, PUCHAR pReadBuf, SIZE_T readLength, PUCHAR pWriteBuf, SIZE_T writeLength, *************** *** 96,99 **** --- 134,139 ---- SIZE_T writeDone; + HALT_UNLESS(pReadBuf || (pFlowFilter && !readLength)); + readDone = 0; *************** *** 121,125 **** } ! if (!escapeChar) { writeDone = writeLength < readLength ? writeLength : readLength; --- 161,165 ---- } ! if (!pFlowFilter) { writeDone = writeLength < readLength ? writeLength : readLength; *************** *** 134,153 **** UCHAR curChar; - if (!readLength--) - break; - curChar = *pWriteBuf++; - writeDone++; - *pReadBuf++ = curChar; - readDone++; ! if (curChar == escapeChar) { ! if (!readLength--) { ! pBuf->escape = TRUE; ! break; } - *pReadBuf++ = SERIAL_LSRMST_ESCAPE; readDone++; } } } --- 174,219 ---- UCHAR curChar; curChar = *pWriteBuf++; ! if (!curChar && (pFlowFilter->flags & C0C_FLOW_FILTER_NULL_STRIPPING)) { ! } ! else ! if ((pFlowFilter->flags & C0C_FLOW_FILTER_AUTO_TRANSMIT) && ! (curChar == pFlowFilter->xoffChar || curChar == pFlowFilter->xonChar)) ! { ! if (curChar == pFlowFilter->xoffChar) ! pFlowFilter->lastXonXoff = C0C_XCHAR_OFF; ! else ! pFlowFilter->lastXonXoff = C0C_XCHAR_ON; ! } ! else { ! if (pReadBuf) { ! if (!readLength--) ! break; ! ! *pReadBuf++ = curChar; ! ! if (pFlowFilter->flags & C0C_FLOW_FILTER_EV_RXCHAR) ! pFlowFilter->events |= C0C_FLOW_FILTER_EV_RXCHAR; ! ! if ((pFlowFilter->flags & C0C_FLOW_FILTER_EV_RXFLAG) && ! curChar == pFlowFilter->eventChar) ! { ! pFlowFilter->events |= C0C_FLOW_FILTER_EV_RXFLAG; ! } ! ! if (pFlowFilter->escapeChar && curChar == pFlowFilter->escapeChar) { ! if (!readLength--) { ! pBuf->escape = TRUE; ! readLength++; ! } else { ! *pReadBuf++ = SERIAL_LSRMST_ESCAPE; ! readDone++; ! } ! } } readDone++; } + writeDone++; } } *************** *** 215,219 **** } ! SIZE_T WriteToBuffer(PC0C_BUFFER pBuf, PVOID pWrite, SIZE_T writeLength, UCHAR escapeChar) { PUCHAR pWriteBuf = (PUCHAR)pWrite; --- 281,289 ---- } ! SIZE_T WriteToBuffer( ! PC0C_BUFFER pBuf, ! PVOID pWrite, ! SIZE_T writeLength, ! PC0C_FLOW_FILTER pFlowFilter) { PUCHAR pWriteBuf = (PUCHAR)pWrite; *************** *** 222,237 **** SIZE_T readDone, writeDone; SIZE_T readLength; ! PVOID pReadBuf; ! if ((SIZE_T)(pBuf->pEnd - pBuf->pBase) <= pBuf->busy) break; - readLength = pBuf->pBusy <= pBuf->pFree ? - pBuf->pEnd - pBuf->pFree : pBuf->pBusy - pBuf->pFree; - pReadBuf = pBuf->pFree; CopyCharsWithEscape( ! pBuf, escapeChar, pReadBuf, readLength, pWriteBuf, writeLength, --- 292,310 ---- SIZE_T readDone, writeDone; SIZE_T readLength; ! PUCHAR pReadBuf; ! if (pBuf->limit <= pBuf->busy) break; pReadBuf = pBuf->pFree; + readLength = pBuf->pBusy <= pReadBuf ? + pBuf->pEnd - pReadBuf : pBuf->pBusy - pReadBuf; + + if (readLength > (pBuf->limit - pBuf->busy)) + readLength = pBuf->limit - pBuf->busy; + CopyCharsWithEscape( ! pBuf, pFlowFilter, pReadBuf, readLength, pWriteBuf, writeLength, *************** *** 252,256 **** VOID WriteMandatoryToBuffer(PC0C_BUFFER pBuf, UCHAR mandatoryChar) { ! if ((SIZE_T)(pBuf->pEnd - pBuf->pBase) <= pBuf->busy) { if (pBuf->pBase) { if (pBuf->pFree == pBuf->pBase) --- 325,329 ---- VOID WriteMandatoryToBuffer(PC0C_BUFFER pBuf, UCHAR mandatoryChar) { ! if (C0C_BUFFER_SIZE(pBuf) <= pBuf->busy) { if (pBuf->pBase) { if (pBuf->pFree == pBuf->pBase) *************** *** 293,297 **** pWriteBuf = pRawData->data; ! if ((SIZE_T)(pBuf->pEnd - pBuf->pBase) <= pBuf->busy) break; --- 366,370 ---- pWriteBuf = pRawData->data; ! if (C0C_BUFFER_SIZE(pBuf) <= pBuf->busy) break; *************** *** 302,306 **** CopyCharsWithEscape( ! pBuf, 0, pReadBuf, readLength, pWriteBuf, writeLength, --- 375,379 ---- CopyCharsWithEscape( ! pBuf, NULL, pReadBuf, readLength, pWriteBuf, writeLength, *************** *** 345,348 **** --- 418,422 ---- pBuf->pBase = pBase; pBuf->pEnd = pBuf->pBase + size; + pBuf->limit = size; pBuf->size80 = (size*4 + 4)/5; } *************** *** 413,414 **** --- 487,497 ---- RtlZeroMemory(pBuf, sizeof(*pBuf)); } + + VOID SetBufferLimit(PC0C_BUFFER pBuf, SIZE_T limit) + { + if (limit > C0C_BUFFER_SIZE(pBuf)) + limit = C0C_BUFFER_SIZE(pBuf); + + pBuf->limit = limit; + } + /********************************************************************/ Index: openclos.c =================================================================== RCS file: /cvsroot/com0com/com0com/openclos.c,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** openclos.c 30 Nov 2005 16:04:12 -0000 1.9 --- openclos.c 10 Jan 2006 10:17:23 -0000 1.10 *************** *** 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,29 ---- * * $Log$ + * Revision 1.10 2006/01/10 10:17:23 vfrolov + * Implemented flow control and handshaking + * Implemented IOCTL_SERIAL_SET_XON and IOCTL_SERIAL_SET_XOFF + * Added setting of HoldReasons, WaitForImmediate and AmountInOutQueue + * fields of SERIAL_STATUS for IOCTL_SERIAL_GET_COMMSTATUS + * * Revision 1.9 2005/11/30 16:04:12 vfrolov * Implemented IOCTL_SERIAL_GET_STATS and IOCTL_SERIAL_CLEAR_STATS *************** *** 50,53 **** --- 56,60 ---- #include "precomp.h" + #include "handflow.h" #include "bufutils.h" *************** *** 92,99 **** --- 99,113 ---- InitializeListHead(&queueToComplete); + #if DBG + if (pDevExt->pIoPortLocal->amountInWriteQueue) { + Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"!!!WARNING!!! amountInWriteQueue != 0"); + } + #endif /* DBG */ + KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); InitBuffer(&pDevExt->pIoPortLocal->readBuf, pBase, size); + pDevExt->pIoPortLocal->tryWrite = FALSE; pDevExt->pIoPortLocal->errors = 0; pDevExt->pIoPortLocal->waitMask = 0; *************** *** 104,108 **** pDevExt->handFlow.XonLimit = size >> 1; ! UpdateHandFlow(pDevExt, &queueToComplete); KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); --- 118,122 ---- pDevExt->handFlow.XonLimit = size >> 1; ! SetHandFlow(pDevExt, NULL, &queueToComplete); KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); *************** *** 122,125 **** --- 136,140 ---- KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); + pDevExt->pIoPortLocal->flipXoffLimit = FALSE; SetModemStatus(pDevExt->pIoPortRemote, 0, C0C_MSB_CTS | C0C_MSB_DSR, &queueToComplete); FreeBuffer(&pDevExt->pIoPortLocal->readBuf); Index: ioctl.c =================================================================== RCS file: /cvsroot/com0com/com0com/ioctl.c,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** ioctl.c 28 Dec 2005 10:01:59 -0000 1.15 --- ioctl.c 10 Jan 2006 10:17:23 -0000 1.16 *************** *** 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,29 ---- * * $Log$ + * Revision 1.16 2006/01/10 10:17:23 vfrolov + * Implemented flow control and handshaking + * Implemented IOCTL_SERIAL_SET_XON and IOCTL_SERIAL_SET_XOFF + * Added setting of HoldReasons, WaitForImmediate and AmountInOutQueue + * fields of SERIAL_STATUS for IOCTL_SERIAL_GET_COMMSTATUS + * * Revision 1.15 2005/12/28 10:01:59 vfrolov * Added stub for IOCTL_SERIAL_SET_XON *************** *** 71,74 **** --- 77,81 ---- #include "delay.h" #include "bufutils.h" + #include "handflow.h" NTSTATUS FdoPortIoCtl( *************** *** 111,114 **** --- 118,128 ---- &queueToComplete); + if (pDevExt->pIoPortRemote->tryWrite) { + ReadWrite( + pDevExt->pIoPortLocal, FALSE, + pDevExt->pIoPortRemote, FALSE, + &queueToComplete); + } + KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); FdoPortCompleteQueue(&queueToComplete); *************** *** 135,138 **** --- 149,159 ---- &queueToComplete); + if (pDevExt->pIoPortRemote->tryWrite) { + ReadWrite( + pDevExt->pIoPortLocal, FALSE, + pDevExt->pIoPortRemote, FALSE, + &queueToComplete); + } + KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); FdoPortCompleteQueue(&queueToComplete); *************** *** 161,165 **** break; } ! case IOCTL_SERIAL_SET_XON: break; case IOCTL_SERIAL_GET_MODEMSTATUS: --- 182,207 ---- break; } ! case IOCTL_SERIAL_SET_XON: { ! LIST_ENTRY queueToComplete; ! ! InitializeListHead(&queueToComplete); ! ! KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! SetXonXoffHolding(pDevExt->pIoPortLocal, C0C_XCHAR_ON); ! ! if (pDevExt->pIoPortRemote->tryWrite) { ! ReadWrite( ! pDevExt->pIoPortLocal, FALSE, ! pDevExt->pIoPortRemote, FALSE, ! &queueToComplete); ! } ! KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); ! FdoPortCompleteQueue(&queueToComplete); ! break; ! } ! case IOCTL_SERIAL_SET_XOFF: ! KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! SetXonXoffHolding(pDevExt->pIoPortLocal, C0C_XCHAR_OFF); ! KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); break; case IOCTL_SERIAL_GET_MODEMSTATUS: *************** *** 220,223 **** --- 262,272 ---- if (*pSysBuf & SERIAL_PURGE_RXCLEAR) { PurgeBuffer(&pDevExt->pIoPortLocal->readBuf); + UpdateHandFlow(pDevExt, TRUE, &queueToComplete); + if (pDevExt->pIoPortRemote->tryWrite) { + ReadWrite( + pDevExt->pIoPortLocal, FALSE, + pDevExt->pIoPortRemote, FALSE, + &queueToComplete); + } } *************** *** 230,233 **** --- 279,284 ---- case IOCTL_SERIAL_GET_COMMSTATUS: { PSERIAL_STATUS pSysBuf; + PC0C_IO_PORT pIoPort; + PIRP pIrpWrite; if (pIrpStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(SERIAL_STATUS)) { *************** *** 237,246 **** pSysBuf = (PSERIAL_STATUS)pIrp->AssociatedIrp.SystemBuffer; KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); RtlZeroMemory(pSysBuf, sizeof(*pSysBuf)); ! pSysBuf->AmountInInQueue = (ULONG)C0C_BUFFER_BUSY(&pDevExt->pIoPortLocal->readBuf); ! pSysBuf->Errors = pDevExt->pIoPortLocal->errors; ! pDevExt->pIoPortLocal->errors = 0; KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); pIrp->IoStatus.Information = sizeof(SERIAL_STATUS); --- 288,313 ---- 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); ! ! pIrpWrite = pIoPort->irpQueues[C0C_QUEUE_WRITE].pCurrent; ! ! if (pIrpWrite) { ! PIO_STACK_LOCATION pIrpStackWrite = IoGetCurrentIrpStackLocation(pIrpWrite); ! ! if (pIrpStackWrite->MajorFunction == IRP_MJ_DEVICE_CONTROL && ! pIrpStackWrite->Parameters.DeviceIoControl.IoControlCode == IOCTL_SERIAL_IMMEDIATE_CHAR) ! { ! pSysBuf->WaitForImmediate = TRUE; ! } ! } ! ! pSysBuf->AmountInOutQueue = pIoPort->amountInWriteQueue; ! pSysBuf->HoldReasons = pIoPort->writeHolding; ! pSysBuf->Errors = pIoPort->errors; ! pIoPort->errors = 0; KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); pIrp->IoStatus.Information = sizeof(SERIAL_STATUS); *************** *** 274,286 **** KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! if (pDevExt->pIoPortLocal->escapeChar && ! (pSysBuf->FlowReplace & SERIAL_ERROR_CHAR)) { ! status = STATUS_INVALID_PARAMETER; ! } ! ! if (status == STATUS_SUCCESS) { ! pDevExt->handFlow = *pSysBuf; ! UpdateHandFlow(pDevExt, &queueToComplete); ! } KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); --- 341,345 ---- KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! status = SetHandFlow(pDevExt, pSysBuf, &queueToComplete); KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); *************** *** 518,521 **** --- 577,581 ---- case IOCTL_SERIAL_SET_QUEUE_SIZE: { PSERIAL_QUEUE_SIZE pSysBuf = (PSERIAL_QUEUE_SIZE)pIrp->AssociatedIrp.SystemBuffer; + LIST_ENTRY queueToComplete; PC0C_BUFFER pReadBuf; PUCHAR pBase; *************** *** 545,548 **** --- 605,609 ---- break; + InitializeListHead(&queueToComplete); KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); *************** *** 550,556 **** --- 611,626 ---- pDevExt->handFlow.XoffLimit = pSysBuf->InSize >> 3; pDevExt->handFlow.XonLimit = pSysBuf->InSize >> 1; + SetLimit(pDevExt); + UpdateHandFlow(pDevExt, TRUE, &queueToComplete); + if (pDevExt->pIoPortRemote->tryWrite) { + ReadWrite( + pDevExt->pIoPortLocal, FALSE, + pDevExt->pIoPortRemote, FALSE, + &queueToComplete); + } } KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); + FdoPortCompleteQueue(&queueToComplete); break; } Index: io.c =================================================================== RCS file: /cvsroot/com0com/com0com/io.c,v retrieving revision 1.22 retrieving revision 1.23 diff -C2 -d -r1.22 -r1.23 *** io.c 6 Dec 2005 13:04:32 -0000 1.22 --- io.c 10 Jan 2006 10:17:23 -0000 1.23 *************** *** 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 * [...1041 lines suppressed...] - { - ULONG bits = 0; - - switch (pDevExt->handFlow.FlowReplace & SERIAL_RTS_MASK) { - case SERIAL_RTS_CONTROL: - case SERIAL_RTS_HANDSHAKE: - case SERIAL_TRANSMIT_TOGGLE: - bits |= C0C_MSB_CTS; - } - - switch (pDevExt->handFlow.ControlHandShake & SERIAL_DTR_MASK) { - case SERIAL_DTR_CONTROL: - case SERIAL_DTR_HANDSHAKE: - bits |= C0C_MSB_DSR; - } - - if (bits) - SetModemStatus(pDevExt->pIoPortRemote, bits, bits, pQueueToComplete); - } --- 1064,1065 ---- Index: startirp.c =================================================================== RCS file: /cvsroot/com0com/com0com/startirp.c,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** startirp.c 5 Dec 2005 10:54:55 -0000 1.7 --- startirp.c 10 Jan 2006 10:17:23 -0000 1.8 *************** *** 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,29 ---- * * $Log$ + * Revision 1.8 2006/01/10 10:17:23 vfrolov + * Implemented flow control and handshaking + * Implemented IOCTL_SERIAL_SET_XON and IOCTL_SERIAL_SET_XOFF + * Added setting of HoldReasons, WaitForImmediate and AmountInOutQueue + * fields of SERIAL_STATUS for IOCTL_SERIAL_GET_COMMSTATUS + * * Revision 1.7 2005/12/05 10:54:55 vfrolov * Implemented IOCTL_SERIAL_IMMEDIATE_CHAR *************** *** 121,124 **** --- 127,135 ---- KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); + if (pState->iQueue == C0C_QUEUE_WRITE) { + pDevExt->pIoPortLocal->amountInWriteQueue -= + GetWriteLength(pIrp) - (ULONG)pIrp->IoStatus.Information; + } + if (pState->flags & C0C_IRP_FLAG_IN_QUEUE) { RemoveEntryList(&pIrp->Tail.Overlay.ListEntry); *************** *** 154,158 **** if (pCancelRoutine) { pIrp->IoStatus.Status = STATUS_CANCELLED; - pIrp->IoStatus.Information = 0; InsertTailList(pQueueToComplete, &pIrp->Tail.Overlay.ListEntry); } --- 165,168 ---- *************** *** 180,183 **** --- 190,194 ---- while (!IsListEmpty(pQueueToComplete)) { PIRP pIrp; + PC0C_IRP_STATE pState; PLIST_ENTRY pListEntry; *************** *** 187,190 **** --- 198,216 ---- TraceIrp("complete", pIrp, &pIrp->IoStatus.Status, TRACE_FLAG_RESULTS); + 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; + } + + if (pIrp->IoStatus.Status == STATUS_CANCELLED) + pIrp->IoStatus.Information = 0; + IoCompleteRequest(pIrp, IO_SERIAL_INCREMENT); } *************** *** 219,222 **** --- 245,251 ---- pState->flags |= C0C_IRP_FLAG_IS_CURRENT; + if (pState->iQueue == C0C_QUEUE_WRITE) + pDevExt->pIoPortLocal->amountInWriteQueue += GetWriteLength(pIrp); + InitializeListHead(&queueToComplete); status = pStartRoutine(pDevExt, &queueToComplete); *************** *** 227,231 **** } else { status = NoPending(pIrp, status); ! ShiftQueue(pQueue); } --- 256,267 ---- } else { status = NoPending(pIrp, status); ! ! if (pState->iQueue == C0C_QUEUE_WRITE && status != STATUS_PENDING) { ! pDevExt->pIoPortLocal->amountInWriteQueue -= ! GetWriteLength(pIrp) - (ULONG)pIrp->IoStatus.Information; ! } ! ! if (pQueue->pCurrent == pIrp) ! ShiftQueue(pQueue); } *************** *** 310,313 **** --- 346,353 ---- InsertTailList(&pQueue->queue, &pIrp->Tail.Overlay.ListEntry); pState->flags |= C0C_IRP_FLAG_IN_QUEUE; + + if (pState->iQueue == C0C_QUEUE_WRITE) + pDevExt->pIoPortLocal->amountInWriteQueue += GetWriteLength(pIrp); + status = STATUS_PENDING; } Index: bufutils.h =================================================================== RCS file: /cvsroot/com0com/com0com/bufutils.h,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** bufutils.h 28 Nov 2005 12:57:16 -0000 1.3 --- bufutils.h 10 Jan 2006 10:17:23 -0000 1.4 *************** *** 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,29 ---- * * $Log$ + * Revision 1.4 2006/01/10 10:17:23 vfrolov + * Implemented flow control and handshaking + * Implemented IOCTL_SERIAL_SET_XON and IOCTL_SERIAL_SET_XOFF + * Added setting of HoldReasons, WaitForImmediate and AmountInOutQueue + * fields of SERIAL_STATUS for IOCTL_SERIAL_GET_COMMSTATUS + * * Revision 1.3 2005/11/28 12:57:16 vfrolov * Moved some C0C_BUFFER code to bufutils.c *************** *** 34,40 **** #define _C0C_BUFUTILS_H_ NTSTATUS MoveRawData(PC0C_RAW_DATA pDstRawData, PC0C_RAW_DATA pSrcRawData); VOID CopyCharsWithEscape( ! PC0C_BUFFER pBuf, UCHAR escapeChar, PUCHAR pReadBuf, SIZE_T readLength, PUCHAR pWriteBuf, SIZE_T writeLength, --- 40,65 ---- #define _C0C_BUFUTILS_H_ + typedef struct _C0C_FLOW_FILTER { + #define C0C_FLOW_FILTER_AUTO_TRANSMIT 0x01 + #define C0C_FLOW_FILTER_EV_RXCHAR 0x02 + #define C0C_FLOW_FILTER_EV_RXFLAG 0x04 + #define C0C_FLOW_FILTER_NULL_STRIPPING 0x08 + + UCHAR flags; + UCHAR xonChar; + UCHAR xoffChar; + UCHAR eventChar; + UCHAR escapeChar; + + UCHAR events; + UCHAR lastXonXoff; + } C0C_FLOW_FILTER, *PC0C_FLOW_FILTER; + + NTSTATUS MoveRawData(PC0C_RAW_DATA pDstRawData, PC0C_RAW_DATA pSrcRawData); + VOID FlowFilterInit(PC0C_IO_PORT pIoPort, PC0C_FLOW_FILTER pFlowFilter); VOID CopyCharsWithEscape( ! PC0C_BUFFER pBuf, ! PC0C_FLOW_FILTER pFlowFilter, PUCHAR pReadBuf, SIZE_T readLength, PUCHAR pWriteBuf, SIZE_T writeLength, *************** *** 42,46 **** PSIZE_T pWriteDone); SIZE_T ReadFromBuffer(PC0C_BUFFER pBuf, PVOID pRead, SIZE_T readLength); ! SIZE_T WriteToBuffer(PC0C_BUFFER pBuf, PVOID pWrite, SIZE_T writeLength, UCHAR escapeChar); VOID WriteMandatoryToBuffer(PC0C_BUFFER pBuf, UCHAR mandatoryChar); NTSTATUS WriteRawDataToBuffer(PC0C_RAW_DATA pRawData, PC0C_BUFFER pBuf); --- 67,75 ---- PSIZE_T pWriteDone); SIZE_T ReadFromBuffer(PC0C_BUFFER pBuf, PVOID pRead, SIZE_T readLength); ! SIZE_T WriteToBuffer( ! PC0C_BUFFER pBuf, ! PVOID pWrite, ! SIZE_T writeLength, ! PC0C_FLOW_FILTER pFlowFilter); VOID WriteMandatoryToBuffer(PC0C_BUFFER pBuf, UCHAR mandatoryChar); NTSTATUS WriteRawDataToBuffer(PC0C_RAW_DATA pRawData, PC0C_BUFFER pBuf); *************** *** 50,53 **** --- 79,83 ---- VOID InitBuffer(PC0C_BUFFER pBuf, PUCHAR pBase, SIZE_T size); VOID FreeBuffer(PC0C_BUFFER pBuf); + VOID SetBufferLimit(PC0C_BUFFER pBuf, SIZE_T limit); #endif /* _C0C_BUFUTILS_H_ */ Index: delay.c =================================================================== RCS file: /cvsroot/com0com/com0com/delay.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** delay.c 23 Aug 2005 15:30:22 -0000 1.1 --- delay.c 10 Jan 2006 10:17:23 -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,29 ---- * * $Log$ + * Revision 1.2 2006/01/10 10:17:23 vfrolov + * Implemented flow control and handshaking + * Implemented IOCTL_SERIAL_SET_XON and IOCTL_SERIAL_SET_XOFF + * Added setting of HoldReasons, WaitForImmediate and AmountInOutQueue + * fields of SERIAL_STATUS for IOCTL_SERIAL_GET_COMMSTATUS + * * Revision 1.1 2005/08/23 15:30:22 vfrolov * Initial revision *************** *** 62,71 **** status = ReadWrite( ! pDevExt->pIoPortRemote, ! &pDevExt->pIoPortRemote->irpQueues[C0C_QUEUE_READ], ! FALSE, ! pDevExt->pIoPortLocal, ! &pDevExt->pIoPortLocal->irpQueues[C0C_QUEUE_WRITE], ! FALSE, &queueToComplete); --- 68,73 ---- status = ReadWrite( ! pDevExt->pIoPortRemote, FALSE, ! pDevExt->pIoPortLocal, FALSE, &queueToComplete); Index: adddev.c =================================================================== RCS file: /cvsroot/com0com/com0com/adddev.c,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** adddev.c 27 Sep 2005 16:41:01 -0000 1.10 --- adddev.c 10 Jan 2006 10:17:23 -0000 1.11 *************** *** 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,29 ---- * * $Log$ + * Revision 1.11 2006/01/10 10:17:23 vfrolov + * Implemented flow control and handshaking + * Implemented IOCTL_SERIAL_SET_XON and IOCTL_SERIAL_SET_XOFF + * Added setting of HoldReasons, WaitForImmediate and AmountInOutQueue + * fields of SERIAL_STATUS for IOCTL_SERIAL_GET_COMMSTATUS + * * Revision 1.10 2005/09/27 16:41:01 vfrolov * Fixed DeviceType *************** *** 65,69 **** PC0C_COMMON_EXTENSION pDevExt, IN PDEVICE_OBJECT pDevObj, ! int doType, PWCHAR pPortName) { --- 71,75 ---- PC0C_COMMON_EXTENSION pDevExt, IN PDEVICE_OBJECT pDevObj, ! short doType, PWCHAR pPortName) { Index: sources =================================================================== RCS file: /cvsroot/com0com/com0com/sources,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** sources 28 Sep 2005 10:06:42 -0000 1.4 --- sources 10 Jan 2006 10:17:23 -0000 1.5 *************** *** 18,21 **** --- 18,22 ---- fileinfo.c \ io.c \ + handflow.c \ startirp.c \ timeout.c \ Index: write.c =================================================================== RCS file: /cvsroot/com0com/com0com/write.c,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** write.c 5 Dec 2005 10:54:56 -0000 1.5 --- write.c 10 Jan 2006 10:17:23 -0000 1.6 *************** *** 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,29 ---- * * $Log$ + * Revision 1.6 2006/01/10 10:17:23 vfrolov + * Implemented flow control and handshaking + * Implemented IOCTL_SERIAL_SET_XON and IOCTL_SERIAL_SET_XOFF + * Added setting of HoldReasons, WaitForImmediate and AmountInOutQueue + * fields of SERIAL_STATUS for IOCTL_SERIAL_GET_COMMSTATUS + * * Revision 1.5 2005/12/05 10:54:56 vfrolov * Implemented IOCTL_SERIAL_IMMEDIATE_CHAR *************** *** 44,53 **** { return ReadWrite( ! pDevExt->pIoPortRemote, ! &pDevExt->pIoPortRemote->irpQueues[C0C_QUEUE_READ], ! FALSE, ! pDevExt->pIoPortLocal, ! &pDevExt->pIoPortLocal->irpQueues[C0C_QUEUE_WRITE], ! TRUE, pQueueToComplete); } --- 50,55 ---- { return ReadWrite( ! pDevExt->pIoPortRemote, FALSE, ! pDevExt->pIoPortLocal, TRUE, pQueueToComplete); } Index: read.c =================================================================== RCS file: /cvsroot/com0com/com0com/read.c,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** read.c 6 Sep 2005 07:23:44 -0000 1.3 --- read.c 10 Jan 2006 10:17:23 -0000 1.4 *************** *** 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,29 ---- * * $Log$ + * Revision 1.4 2006/01/10 10:17:23 vfrolov + * Implemented flow control and handshaking + * Implemented IOCTL_SERIAL_SET_XON and IOCTL_SERIAL_SET_XOFF + * Added setting of HoldReasons, WaitForImmediate and AmountInOutQueue + * fields of SERIAL_STATUS for IOCTL_SERIAL_GET_COMMSTATUS + * * Revision 1.3 2005/09/06 07:23:44 vfrolov * Implemented overrun emulation *************** *** 38,47 **** { return ReadWrite( ! pDevExt->pIoPortLocal, ! &pDevExt->pIoPortLocal->irpQueues[C0C_QUEUE_READ], ! TRUE, ! pDevExt->pIoPortRemote, ! &pDevExt->pIoPortRemote->irpQueues[C0C_QUEUE_WRITE], ! FALSE, pQueueToComplete); } --- 44,49 ---- { return ReadWrite( ! pDevExt->pIoPortLocal, TRUE, ! pDevExt->pIoPortRemote, FALSE, pQueueToComplete); } Index: com0com.h =================================================================== RCS file: /cvsroot/com0com/com0com/com0com.h,v retrieving revision 1.21 retrieving revision 1.22 diff -C2 -d -r1.21 -r1.22 *** com0com.h 6 Dec 2005 13:04:32 -0000 1.21 --- com0com.h 10 Jan 2006 10:17:23 -0000 1.22 *************** *** 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,29 ---- * * $Log$ + * Revision 1.22 2006/01/10 10:17:23 vfrolov + * Implemented flow control and handshaking + * Implemented IOCTL_SERIAL_SET_XON and IOCTL_SERIAL_SET_XOFF + * Added setting of HoldReasons, WaitForImmediate and AmountInOutQueue + * fields of SERIAL_STATUS for IOCTL_SERIAL_GET_COMMSTATUS + * * Revision 1.21 2005/12/06 13:04:32 vfrolov * Fixed data types *************** *** 108,112 **** #define COMMON_EXTENSION \ ! int doType; \ PDEVICE_OBJECT pDevObj; \ WCHAR portName[C0C_PORT_NAME_LEN]; \ --- 114,118 ---- #define COMMON_EXTENSION \ ! short doType; \ PDEVICE_OBJECT pDevObj; \ WCHAR portName[C0C_PORT_NAME_LEN]; \ *************** *** 116,119 **** --- 122,128 ---- PDEVICE_OBJECT pLowDevObj; \ + #define C0C_XCHAR_ON 1 + #define C0C_XCHAR_OFF 2 + typedef struct _C0C_COMMON_EXTENSION { COMMON_EXTENSION *************** *** 139,142 **** --- 148,152 ---- PUCHAR pFree; PUCHAR pEnd; + SIZE_T limit; SIZE_T busy; SIZE_T size80; *************** *** 179,182 **** --- 189,193 ---- ULONG errors; + ULONG amountInWriteQueue; ULONG waitMask; ULONG eventMask; *************** *** 193,196 **** --- 204,212 ---- C0C_BUFFER readBuf; + short sendXonXoff; + ULONG writeHolding; + BOOLEAN tryWrite; + BOOLEAN flipXoffLimit; + BOOLEAN emuOverrun; } C0C_IO_PORT, *PC0C_IO_PORT; *************** *** 332,336 **** NTSTATUS FdoPortIo( ! int ioType, PVOID pParam, PC0C_IO_PORT pIoPort, --- 348,352 ---- NTSTATUS FdoPortIo( ! short ioType, PVOID pParam, PC0C_IO_PORT pIoPort, *************** *** 340,347 **** NTSTATUS ReadWrite( PC0C_IO_PORT pIoPortRead, - PC0C_IRP_QUEUE pQueueRead, BOOLEAN startRead, PC0C_IO_PORT pIoPortWrite, - PC0C_IRP_QUEUE pQueueWrite, BOOLEAN startWrite, PLIST_ENTRY pQueueToComplete); --- 356,361 ---- *************** *** 353,359 **** PLIST_ENTRY pQueueToComplete); - VOID UpdateHandFlow( - IN PC0C_FDOPORT_EXTENSION pDevExt, - IN PLIST_ENTRY pQueueToComplete); - #endif /* _C0C_COM0COM_H_ */ --- 367,369 ---- |
From: Vyacheslav F. <vf...@us...> - 2006-01-10 10:12:13
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv6699 Added Files: handflow.c handflow.h Log Message: Initial revision --- NEW FILE: handflow.c --- /* * $Id: handflow.c,v 1.1 2006/01/10 10:12:05 vfrolov Exp $ * * Copyright (c) 2005-2006 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * $Log: handflow.c,v $ * Revision 1.1 2006/01/10 10:12:05 vfrolov * Initial revision * * */ #include "precomp.h" #include "handflow.h" #include "bufutils.h" /* * FILE_ID used by HALT_UNLESS to put it on BSOD */ #define FILE_ID 9 NTSTATUS SetHandFlow( PC0C_FDOPORT_EXTENSION pDevExt, PSERIAL_HANDFLOW pHandFlow, PLIST_ENTRY pQueueToComplete) { ULONG bits; PC0C_BUFFER pReadBuf; PSERIAL_HANDFLOW pNewHandFlow; 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))) { return STATUS_INVALID_PARAMETER; } pNewHandFlow = pHandFlow; } else { pNewHandFlow = &pDevExt->handFlow; } if ((pNewHandFlow->FlowReplace & SERIAL_AUTO_TRANSMIT) == 0) SetXonXoffHolding(pDevExt->pIoPortLocal, C0C_XCHAR_ON); bits = 0; if (!pHandFlow || (pDevExt->handFlow.FlowReplace & SERIAL_RTS_MASK) != (pHandFlow->FlowReplace & SERIAL_RTS_MASK)) { if ((pNewHandFlow->FlowReplace & SERIAL_RTS_MASK) == SERIAL_RTS_CONTROL) bits |= C0C_MSB_CTS; } if (!pHandFlow || (pDevExt->handFlow.ControlHandShake & SERIAL_DTR_MASK) != (pHandFlow->ControlHandShake & SERIAL_DTR_MASK)) { if ((pNewHandFlow->ControlHandShake & SERIAL_DTR_MASK) == SERIAL_DTR_CONTROL) bits |= C0C_MSB_DSR; } if (pHandFlow) pDevExt->handFlow = *pHandFlow; if (bits) SetModemStatus(pDevExt->pIoPortRemote, bits, bits, pQueueToComplete); 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); } return STATUS_SUCCESS; } VOID UpdateHandFlow( PC0C_FDOPORT_EXTENSION pDevExt, BOOLEAN freed, PLIST_ENTRY pQueueToComplete) { ULONG bits, mask; 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->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; } } } 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; } if ((pHandFlowLocal->ControlHandShake & SERIAL_DTR_MASK) == SERIAL_DTR_HANDSHAKE) { bits |= C0C_MSB_DSR; mask |= C0C_MSB_DSR; } if (pHandFlowLocal->FlowReplace & SERIAL_AUTO_RECEIVE) { pIoPortLocal->sendXonXoff = C0C_XCHAR_ON; pIoPortLocal->tryWrite = TRUE; } } } if (mask) SetModemStatus(pDevExt->pIoPortRemote, bits, mask, pQueueToComplete); } VOID SetLimit(PC0C_FDOPORT_EXTENSION pDevExt) { PC0C_BUFFER pReadBuf; SIZE_T limit; PSERIAL_HANDFLOW pHandFlowLocal, pHandFlowRemote; pHandFlowLocal = &pDevExt->handFlow; pHandFlowRemote = &pDevExt->pIoPortRemote->pDevExt->handFlow; 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; } else { limit = C0C_BUFFER_SIZE(pReadBuf); } SetBufferLimit(pReadBuf, limit); } VOID SetModemStatusHolding(PC0C_IO_PORT pIoPort) { ULONG writeHolding; PSERIAL_HANDFLOW pHandFlow; pHandFlow = &pIoPort->pDevExt->handFlow; writeHolding = pIoPort->writeHolding; if ((pHandFlow->ControlHandShake & SERIAL_CTS_HANDSHAKE) && !(pIoPort->modemStatus & C0C_MSB_CTS)) writeHolding |= SERIAL_TX_WAITING_FOR_CTS; else writeHolding &= ~SERIAL_TX_WAITING_FOR_CTS; if ((pHandFlow->ControlHandShake & SERIAL_DSR_HANDSHAKE) && !(pIoPort->modemStatus & C0C_MSB_DSR)) writeHolding |= SERIAL_TX_WAITING_FOR_DSR; else writeHolding &= ~SERIAL_TX_WAITING_FOR_DSR; if ((pHandFlow->ControlHandShake & SERIAL_DCD_HANDSHAKE) && !(pIoPort->modemStatus & C0C_MSB_RLSD)) writeHolding |= SERIAL_TX_WAITING_FOR_DCD; else writeHolding &= ~SERIAL_TX_WAITING_FOR_DCD; if (!(writeHolding & ~SERIAL_TX_WAITING_FOR_XON) && (pIoPort->writeHolding & ~SERIAL_TX_WAITING_FOR_XON)) { if (pIoPort->sendXonXoff || (!writeHolding && pIoPort->irpQueues[C0C_QUEUE_WRITE].pCurrent)) pIoPort->tryWrite = TRUE; } pIoPort->writeHolding = writeHolding; } VOID SetXonXoffHolding(PC0C_IO_PORT pIoPort, short xonXoff) { switch (xonXoff) { case C0C_XCHAR_ON: if (pIoPort->writeHolding & SERIAL_TX_WAITING_FOR_XON) { pIoPort->writeHolding &= ~SERIAL_TX_WAITING_FOR_XON; if (!pIoPort->writeHolding && pIoPort->irpQueues[C0C_QUEUE_WRITE].pCurrent) pIoPort->tryWrite = TRUE; } break; case C0C_XCHAR_OFF: pIoPort->writeHolding |= SERIAL_TX_WAITING_FOR_XON; break; } } --- NEW FILE: handflow.h --- /* * $Id: handflow.h,v 1.1 2006/01/10 10:12:05 vfrolov Exp $ * * Copyright (c) 2005-2006 Vyacheslav Frolov * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * $Log: handflow.h,v $ * Revision 1.1 2006/01/10 10:12:05 vfrolov * Initial revision * * */ #ifndef _C0C_FLOW_H_ #define _C0C_FLOW_H_ NTSTATUS SetHandFlow( PC0C_FDOPORT_EXTENSION pDevExt, PSERIAL_HANDFLOW pHandFlow, PLIST_ENTRY pQueueToComplete); VOID UpdateHandFlow( PC0C_FDOPORT_EXTENSION pDevExt, BOOLEAN freed, PLIST_ENTRY pQueueToComplete); VOID SetLimit(PC0C_FDOPORT_EXTENSION pDevExt); VOID SetModemStatusHolding(PC0C_IO_PORT pIoPort); VOID SetXonXoffHolding(PC0C_IO_PORT pIoPort, short xonXoff); #endif /* _C0C_FLOW_H_ */ |
From: Vyacheslav F. <vf...@us...> - 2006-01-10 09:44:12
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2114 Modified Files: trace.c Log Message: Added ability to enable/disable dump Added tracing of HoldReasons, WaitForImmediate, AmountInOutQueue for SERIAL_STATUS Index: trace.c =================================================================== RCS file: /cvsroot/com0com/com0com/trace.c,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** trace.c 6 Dec 2005 13:01:54 -0000 1.17 --- trace.c 10 Jan 2006 09:44:04 -0000 1.18 *************** *** 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.18 2006/01/10 09:44:04 vfrolov + * Added ability to enable/disable dump + * Added tracing of HoldReasons, WaitForImmediate, AmountInOutQueue for SERIAL_STATUS + * * Revision 1.17 2005/12/06 13:01:54 vfrolov * Implemented IOCTL_SERIAL_GET_DTRRTS *************** *** 101,104 **** --- 105,113 ---- } TRACE_BUFFER, *PTRACE_BUFFER; /********************************************************************/ + #define TRACE_ENABLE_IRP 0x00000001 + #define TRACE_ENABLE_DUMP 0x00000002 + + #define TRACE_ENABLE_ALL 0xFFFFFFFF + static struct { ULONG read; *************** *** 576,580 **** if (count) pDestStr = AnsiStrCopyStr(pDestStr, pSize, "|"); ! pDestStr = AnsiStrFormat(pDestStr, pSize, "0x%lX", unknown); } --- 585,589 ---- if (count) pDestStr = AnsiStrCopyStr(pDestStr, pSize, "|"); ! pDestStr = AnsiStrFormat(pDestStr, pSize, "0x%lX", (long)unknown); } *************** *** 608,612 **** if (count) pDestStr = AnsiStrCopyStr(pDestStr, pSize, "|"); ! pDestStr = AnsiStrFormat(pDestStr, pSize, "0x%lX", mask); } --- 617,621 ---- if (count) pDestStr = AnsiStrCopyStr(pDestStr, pSize, "|"); ! pDestStr = AnsiStrFormat(pDestStr, pSize, "0x%lX", (long)mask); } *************** *** 624,628 **** SIZE_T i; ! pDestStr = AnsiStrFormat(pDestStr, pSize, "%lu:", (ULONG)length); for (i = 0 ; i < length && i < DUMP_MAX ; i++) { --- 633,637 ---- SIZE_T i; ! pDestStr = AnsiStrFormat(pDestStr, pSize, "%lu:", (long)length); for (i = 0 ; i < length && i < DUMP_MAX ; i++) { *************** *** 631,635 **** bufA[i] = (CHAR)((c >= 0x20 && c < 0x7F) ? c : '.'); ! pDestStr = AnsiStrFormat(pDestStr, pSize, " %02X", c); } --- 640,644 ---- bufA[i] = (CHAR)((c >= 0x20 && c < 0x7F) ? c : '.'); ! pDestStr = AnsiStrFormat(pDestStr, pSize, " %02X", (int)c); } *************** *** 739,750 **** IN PSERIAL_STATUS pCommStatus) { ! pDestStr = AnsiStrCopyStr(pDestStr, pSize, " Errors"); ! pDestStr = AnsiStrCopyMask(pDestStr, pSize, ! codeNameTableErrors, ! pCommStatus->Errors); ! return AnsiStrFormat(pDestStr, pSize, ! " AmountInInQueue=%lu", ! (long)pCommStatus->AmountInInQueue); } --- 748,778 ---- IN PSERIAL_STATUS pCommStatus) { ! pDestStr = AnsiStrCopyStr(pDestStr, pSize, " {"); ! if (pCommStatus->Errors) { ! pDestStr = AnsiStrCopyStr(pDestStr, pSize, " Errors"); ! pDestStr = AnsiStrCopyMask(pDestStr, pSize, ! codeNameTableErrors, pCommStatus->Errors); ! } ! ! if (pCommStatus->HoldReasons) { ! pDestStr = AnsiStrCopyStr(pDestStr, pSize, " HoldReasons"); ! pDestStr = AnsiStrCopyMask(pDestStr, pSize, ! codeNameTableHoldReasons, pCommStatus->HoldReasons); ! } ! ! if (pCommStatus->WaitForImmediate) ! pDestStr = AnsiStrCopyStr(pDestStr, pSize, " WaitForImmediate=TRUE"); ! ! if (pCommStatus->AmountInInQueue) ! pDestStr = AnsiStrFormat(pDestStr, pSize, ! " AmountInInQueue=%lu", (long)pCommStatus->AmountInInQueue); ! ! if (pCommStatus->AmountInOutQueue) ! pDestStr = AnsiStrFormat(pDestStr, pSize, ! " AmountInOutQueue=%lu", (long)pCommStatus->AmountInOutQueue); ! ! pDestStr = AnsiStrCopyStr(pDestStr, pSize, " }"); ! return pDestStr; } *************** *** 754,757 **** --- 782,787 ---- IN PSERIALPERF_STATS pPerfStats) { + pDestStr = AnsiStrCopyStr(pDestStr, pSize, " {"); + if (pPerfStats->ReceivedCount) pDestStr = AnsiStrFormat(pDestStr, pSize, *************** *** 778,781 **** --- 808,812 ---- " ParityErrorCount=%lu", (long)pPerfStats->ParityErrorCount); + pDestStr = AnsiStrCopyStr(pDestStr, pSize, " }"); return pDestStr; } *************** *** 955,959 **** SIZE_T tmp_size = size; ! AnsiStrFormat(pDestStr, &tmp_size, "*** skipped %lu lines ***\r\n", skipped); TraceWrite(pIoObject, handle, pBuf->buf); } --- 986,990 ---- SIZE_T tmp_size = size; ! AnsiStrFormat(pDestStr, &tmp_size, "*** skipped %lu lines ***\r\n", (long)skipped); TraceWrite(pIoObject, handle, pBuf->buf); } *************** *** 1166,1170 **** ULONG_PTR inform; ULONG major; ! ULONG disabled; if (!TRACE_FILE_OK) --- 1197,1201 ---- ULONG_PTR inform; ULONG major; ! ULONG enableMask; if (!TRACE_FILE_OK) *************** *** 1173,1198 **** pIrpStack = IoGetCurrentIrpStackLocation(pIrp); major = pIrpStack->MajorFunction; ! disabled = FALSE; switch (major) { case IRP_MJ_WRITE: ! disabled = !traceEnable.write; break; case IRP_MJ_READ: ! disabled = !traceEnable.read; break; case IRP_MJ_DEVICE_CONTROL: switch (pIrpStack->Parameters.DeviceIoControl.IoControlCode) { case IOCTL_SERIAL_GET_TIMEOUTS: ! disabled = !traceEnable.getTimeouts; break; case IOCTL_SERIAL_SET_TIMEOUTS: ! disabled = !traceEnable.setTimeouts; break; case IOCTL_SERIAL_GET_COMMSTATUS: ! disabled = !traceEnable.getCommStatus; break; case IOCTL_SERIAL_GET_MODEMSTATUS: ! disabled = !traceEnable.getModemStatus; break; } --- 1204,1229 ---- pIrpStack = IoGetCurrentIrpStackLocation(pIrp); major = pIrpStack->MajorFunction; ! enableMask = TRACE_ENABLE_ALL; switch (major) { case IRP_MJ_WRITE: ! enableMask = traceEnable.write; break; case IRP_MJ_READ: ! enableMask = traceEnable.read; break; case IRP_MJ_DEVICE_CONTROL: switch (pIrpStack->Parameters.DeviceIoControl.IoControlCode) { case IOCTL_SERIAL_GET_TIMEOUTS: ! enableMask = traceEnable.getTimeouts; break; case IOCTL_SERIAL_SET_TIMEOUTS: ! enableMask = traceEnable.setTimeouts; break; case IOCTL_SERIAL_GET_COMMSTATUS: ! enableMask = traceEnable.getCommStatus; break; case IOCTL_SERIAL_GET_MODEMSTATUS: ! enableMask = traceEnable.getModemStatus; break; } *************** *** 1202,1206 **** pDevExt = pIrpStack->DeviceObject->DeviceExtension; ! if (disabled) { TraceOutput(pDevExt, NULL); return; --- 1233,1237 ---- pDevExt = pIrpStack->DeviceObject->DeviceExtension; ! if (!(enableMask & TRACE_ENABLE_IRP)) { TraceOutput(pDevExt, NULL); return; *************** *** 1239,1247 **** else length = pIrpStack->Parameters.Read.Length; ! pDestStr = AnsiStrFormat(pDestStr, &size, " length=%u", length); } if (flags & TRACE_FLAG_RESULTS) { pDestStr = AnsiStrCopyStr(pDestStr, &size, " "); ! pDestStr = AnsiStrCopyDump(pDestStr, &size, pSysBuf, inform); } break; --- 1270,1281 ---- else length = pIrpStack->Parameters.Read.Length; ! pDestStr = AnsiStrFormat(pDestStr, &size, " length=%lu", (long)length); } if (flags & TRACE_FLAG_RESULTS) { pDestStr = AnsiStrCopyStr(pDestStr, &size, " "); ! if (enableMask & TRACE_ENABLE_DUMP) ! pDestStr = AnsiStrCopyDump(pDestStr, &size, pSysBuf, inform); ! else ! pDestStr = AnsiStrFormat(pDestStr, &size, "%lu:", (long)inform); } break; |
From: Vyacheslav F. <vf...@us...> - 2006-01-10 09:32:28
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv32760 Modified Files: trace.h tracetbl.c Log Message: Added codeNameTableHoldReasons[] Index: trace.h =================================================================== RCS file: /cvsroot/com0com/com0com/trace.h,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** trace.h 6 Dec 2005 13:01:54 -0000 1.7 --- trace.h 10 Jan 2006 09:32:20 -0000 1.8 *************** *** 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.8 2006/01/10 09:32:20 vfrolov + * Added codeNameTableHoldReasons[] + * * Revision 1.7 2005/12/06 13:01:54 vfrolov * Implemented IOCTL_SERIAL_GET_DTRRTS *************** *** 122,125 **** --- 125,129 ---- CODE2NAME codeNameTableDeviceText[]; CODE2NAME codeNameTableErrors[]; + CODE2NAME codeNameTableHoldReasons[]; CODE2NAME codeNameTableFileInformationClass[]; Index: tracetbl.c =================================================================== RCS file: /cvsroot/com0com/com0com/tracetbl.c,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** tracetbl.c 6 Dec 2005 13:01:54 -0000 1.5 --- tracetbl.c 10 Jan 2006 09:32:20 -0000 1.6 *************** *** 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.6 2006/01/10 09:32:20 vfrolov + * Added codeNameTableHoldReasons[] + * * Revision 1.5 2005/12/06 13:01:54 vfrolov * Implemented IOCTL_SERIAL_GET_DTRRTS *************** *** 290,293 **** --- 293,307 ---- }; + CODE2NAME codeNameTableHoldReasons[] = { + TOCODE2NAME(SERIAL_TX_WAITING_, FOR_CTS), + TOCODE2NAME(SERIAL_TX_WAITING_, FOR_DSR), + TOCODE2NAME(SERIAL_TX_WAITING_, FOR_DCD), + TOCODE2NAME(SERIAL_TX_WAITING_, FOR_XON), + TOCODE2NAME(SERIAL_TX_WAITING_, XOFF_SENT), + TOCODE2NAME(SERIAL_TX_WAITING_, ON_BREAK), + TOCODE2NAME(SERIAL_RX_WAITING_, FOR_DSR), + {0, NULL} + }; + CODE2NAME codeNameTableFileInformationClass[] = { #ifndef _WDMDDK_ |
From: Vyacheslav F. <vf...@us...> - 2006-01-10 09:24:39
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31463 Modified Files: com0com.rc Log Message: Utilized C0C_COPYRIGHT_YEARS Index: com0com.rc =================================================================== RCS file: /cvsroot/com0com/com0com/com0com.rc,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** com0com.rc 5 Sep 2005 16:05:03 -0000 1.7 --- com0com.rc 10 Jan 2006 09:24:31 -0000 1.8 *************** *** 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.8 2006/01/10 09:24:31 vfrolov + * Utilized C0C_COPYRIGHT_YEARS + * * Revision 1.7 2005/09/05 16:05:03 vfrolov * Moved version info to version.h *************** *** 62,66 **** VALUE "FileVersion", VER_VERSION_STR VALUE "InternalName", "com0com\0" ! VALUE "LegalCopyright", "Copyright (c) 2004-2005 Vyacheslav Frolov\0" VALUE "OriginalFilename", "com0com.sys\0" VALUE "ProductName", VER_PODUCT_NAME_STR --- 65,69 ---- VALUE "FileVersion", VER_VERSION_STR VALUE "InternalName", "com0com\0" ! VALUE "LegalCopyright", "Copyright (c) " C0C_COPYRIGHT_YEARS " Vyacheslav Frolov\0" VALUE "OriginalFilename", "com0com.sys\0" VALUE "ProductName", VER_PODUCT_NAME_STR |
From: Vyacheslav F. <vf...@us...> - 2006-01-10 09:19:54
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30673 Modified Files: version.h Log Message: Post-tagging version change Index: version.h =================================================================== RCS file: /cvsroot/com0com/com0com/version.h,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** version.h 29 Dec 2005 08:40:59 -0000 1.4 --- version.h 10 Jan 2006 09:19:47 -0000 1.5 *************** *** 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 *************** *** 23,30 **** #define _C0C_VERSION_H_ #define C0C_V1 1 #define C0C_V2 5 #define C0C_V3 0 ! #define C0C_V4 0 #define MK_VERSION_STR1(V1, V2, V3, V4) #V1 "." #V2 "." #V3 "." #V4 --- 23,32 ---- #define _C0C_VERSION_H_ + #define C0C_COPYRIGHT_YEARS "2004-2006" + #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 |
From: Vyacheslav F. <vf...@us...> - 2005-12-29 08:41:07
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19553 Modified Files: version.h Log Message: Pre-tagging version change Index: version.h =================================================================== RCS file: /cvsroot/com0com/com0com/version.h,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** version.h 25 Nov 2005 08:56:30 -0000 1.3 --- version.h 29 Dec 2005 08:40:59 -0000 1.4 *************** *** 24,30 **** #define C0C_V1 1 ! #define C0C_V2 4 #define C0C_V3 0 ! #define C0C_V4 1 #define MK_VERSION_STR1(V1, V2, V3, V4) #V1 "." #V2 "." #V3 "." #V4 --- 24,30 ---- #define C0C_V1 1 ! #define C0C_V2 5 #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...> - 2005-12-28 10:02:11
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1843 Modified Files: ioctl.c Log Message: Added stub for IOCTL_SERIAL_SET_XON Index: ioctl.c =================================================================== RCS file: /cvsroot/com0com/com0com/ioctl.c,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** ioctl.c 6 Dec 2005 13:01:54 -0000 1.14 --- ioctl.c 28 Dec 2005 10:01:59 -0000 1.15 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.15 2005/12/28 10:01:59 vfrolov + * Added stub for IOCTL_SERIAL_SET_XON + * * Revision 1.14 2005/12/06 13:01:54 vfrolov * Implemented IOCTL_SERIAL_GET_DTRRTS *************** *** 158,161 **** --- 161,166 ---- break; } + case IOCTL_SERIAL_SET_XON: + break; case IOCTL_SERIAL_GET_MODEMSTATUS: if (pIrpStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(ULONG)) { |
From: Vyacheslav F. <vf...@us...> - 2005-12-06 13:04:40
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv13489 Modified Files: com0com.h io.c Log Message: Fixed data types Index: io.c =================================================================== RCS file: /cvsroot/com0com/com0com/io.c,v retrieving revision 1.21 retrieving revision 1.22 diff -C2 -d -r1.21 -r1.22 *** io.c 5 Dec 2005 10:54:55 -0000 1.21 --- io.c 6 Dec 2005 13:04:32 -0000 1.22 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.22 2005/12/06 13:04:32 vfrolov + * Fixed data types + * * Revision 1.21 2005/12/05 10:54:55 vfrolov * Implemented IOCTL_SERIAL_IMMEDIATE_CHAR *************** *** 98,102 **** (((PUCHAR)(pIrp)->AssociatedIrp.SystemBuffer) + done) ! SIZE_T GetWriteLength(IN PIRP pIrp) { PIO_STACK_LOCATION pIrpStack = IoGetCurrentIrpStackLocation(pIrp); --- 101,105 ---- (((PUCHAR)(pIrp)->AssociatedIrp.SystemBuffer) + done) ! ULONG GetWriteLength(IN PIRP pIrp) { PIO_STACK_LOCATION pIrpStack = IoGetCurrentIrpStackLocation(pIrp); *************** *** 162,167 **** } ! pReadIoPort->perfStats.ReceivedCount += size; ! pReadIoPort->pDevExt->pIoPortRemote->perfStats.TransmittedCount += size; } --- 165,170 ---- } ! pReadIoPort->perfStats.ReceivedCount += (ULONG)size; ! pReadIoPort->pDevExt->pIoPortRemote->perfStats.TransmittedCount += (ULONG)size; } *************** *** 256,260 **** AlertOverrun(pReadIoPort, pQueueToComplete); ! pReadIoPort->perfStats.BufferOverrunErrorCount += writeDone; OnRxChars(pReadIoPort, pWriteBuf, writeDone, pQueueToComplete); } --- 259,263 ---- AlertOverrun(pReadIoPort, pQueueToComplete); ! pReadIoPort->perfStats.BufferOverrunErrorCount += (ULONG)writeDone; OnRxChars(pReadIoPort, pWriteBuf, writeDone, pQueueToComplete); } Index: com0com.h =================================================================== RCS file: /cvsroot/com0com/com0com/com0com.h,v retrieving revision 1.20 retrieving revision 1.21 diff -C2 -d -r1.20 -r1.21 *** com0com.h 5 Dec 2005 10:54:55 -0000 1.20 --- com0com.h 6 Dec 2005 13:04:32 -0000 1.21 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.21 2005/12/06 13:04:32 vfrolov + * Fixed data types + * * Revision 1.20 2005/12/05 10:54:55 vfrolov * Implemented IOCTL_SERIAL_IMMEDIATE_CHAR *************** *** 323,327 **** PC0C_IRP_STATE GetIrpState(IN PIRP pIrp); ! SIZE_T GetWriteLength(IN PIRP pIrp); #define C0C_IO_TYPE_WAIT_COMPLETE 3 --- 326,330 ---- PC0C_IRP_STATE GetIrpState(IN PIRP pIrp); ! ULONG GetWriteLength(IN PIRP pIrp); #define C0C_IO_TYPE_WAIT_COMPLETE 3 |
From: Vyacheslav F. <vf...@us...> - 2005-12-06 13:02:02
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv11739 Modified Files: ioctl.c trace.c trace.h tracetbl.c Log Message: Implemented IOCTL_SERIAL_GET_DTRRTS Index: trace.c =================================================================== RCS file: /cvsroot/com0com/com0com/trace.c,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** trace.c 5 Dec 2005 10:54:55 -0000 1.16 --- trace.c 6 Dec 2005 13:01:54 -0000 1.17 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.17 2005/12/06 13:01:54 vfrolov + * Implemented IOCTL_SERIAL_GET_DTRRTS + * * Revision 1.16 2005/12/05 10:54:55 vfrolov * Implemented IOCTL_SERIAL_IMMEDIATE_CHAR *************** *** 1258,1261 **** --- 1261,1271 ---- } 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; case IOCTL_SERIAL_SET_WAIT_MASK: if ((flags & TRACE_FLAG_PARAMS) && inLength >= sizeof(ULONG)) { Index: trace.h =================================================================== RCS file: /cvsroot/com0com/com0com/trace.h,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** trace.h 28 Sep 2005 10:06:42 -0000 1.6 --- trace.h 6 Dec 2005 13:01:54 -0000 1.7 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.7 2005/12/06 13:01:54 vfrolov + * Implemented IOCTL_SERIAL_GET_DTRRTS + * * Revision 1.6 2005/09/28 10:06:42 vfrolov * Implemented IRP_MJ_QUERY_INFORMATION and IRP_MJ_SET_INFORMATION *************** *** 112,115 **** --- 115,119 ---- CODE2NAME codeNameTableDoType[]; CODE2NAME codeNameTableModemStatus[]; + CODE2NAME codeNameTableDTRRTS[]; CODE2NAME codeNameTableStatus[]; CODE2NAME codeNameTableIrpMj[]; Index: tracetbl.c =================================================================== RCS file: /cvsroot/com0com/com0com/tracetbl.c,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** tracetbl.c 28 Sep 2005 10:06:42 -0000 1.4 --- tracetbl.c 6 Dec 2005 13:01:54 -0000 1.5 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.5 2005/12/06 13:01:54 vfrolov + * Implemented IOCTL_SERIAL_GET_DTRRTS + * * Revision 1.4 2005/09/28 10:06:42 vfrolov * Implemented IRP_MJ_QUERY_INFORMATION and IRP_MJ_SET_INFORMATION *************** *** 174,177 **** --- 177,186 ---- }; + CODE2NAME codeNameTableDTRRTS[] = { + {SERIAL_DTR_STATE, "DTR"}, + {SERIAL_RTS_STATE, "RTS"}, + {0, NULL} + }; + FIELD2NAME codeNameTableControlHandShake[] = { TOFIELD2NAME (SERIAL_, DTR_CONTROL, SERIAL_DTR_MASK), Index: ioctl.c =================================================================== RCS file: /cvsroot/com0com/com0com/ioctl.c,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** ioctl.c 5 Dec 2005 10:54:55 -0000 1.13 --- ioctl.c 6 Dec 2005 13:01:54 -0000 1.14 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.14 2005/12/06 13:01:54 vfrolov + * Implemented IOCTL_SERIAL_GET_DTRRTS + * * Revision 1.13 2005/12/05 10:54:55 vfrolov * Implemented IOCTL_SERIAL_IMMEDIATE_CHAR *************** *** 134,137 **** --- 137,161 ---- } break; + case IOCTL_SERIAL_GET_DTRRTS: { + ULONG modemStatusRemote; + + if (pIrpStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(ULONG)) { + status = STATUS_BUFFER_TOO_SMALL; + break; + } + + KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); + modemStatusRemote = pDevExt->pIoPortRemote->modemStatus; + KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); + + *(PULONG)pIrp->AssociatedIrp.SystemBuffer = + ((modemStatusRemote & C0C_MSB_DSR) ? SERIAL_DTR_STATE : 0) | + ((modemStatusRemote & C0C_MSB_CTS) ? SERIAL_RTS_STATE : 0); + + pIrp->IoStatus.Information = sizeof(ULONG); + + TraceIrp("FdoPortIoCtl", pIrp, &status, TRACE_FLAG_RESULTS); + break; + } case IOCTL_SERIAL_GET_MODEMSTATUS: if (pIrpStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(ULONG)) { |
From: Vyacheslav F. <vf...@us...> - 2005-12-05 10:55:10
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv10465 Modified Files: com0com.h io.c ioctl.c startirp.c timeout.c trace.c write.c Log Message: Implemented IOCTL_SERIAL_IMMEDIATE_CHAR Index: ioctl.c =================================================================== RCS file: /cvsroot/com0com/com0com/ioctl.c,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** ioctl.c 30 Nov 2005 16:04:12 -0000 1.12 --- ioctl.c 5 Dec 2005 10:54:55 -0000 1.13 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.13 2005/12/05 10:54:55 vfrolov + * Implemented IOCTL_SERIAL_IMMEDIATE_CHAR + * * Revision 1.12 2005/11/30 16:04:12 vfrolov * Implemented IOCTL_SERIAL_GET_STATS and IOCTL_SERIAL_CLEAR_STATS *************** *** 153,156 **** --- 156,162 ---- status = FdoPortWaitOnMask(pDevExt, pIrp, pIrpStack); break; + case IOCTL_SERIAL_IMMEDIATE_CHAR: + status = FdoPortImmediateChar(pDevExt, pIrp, pIrpStack); + break; case IOCTL_SERIAL_PURGE: { LIST_ENTRY queueToComplete; Index: io.c =================================================================== RCS file: /cvsroot/com0com/com0com/io.c,v retrieving revision 1.20 retrieving revision 1.21 diff -C2 -d -r1.20 -r1.21 *** io.c 30 Nov 2005 16:04:11 -0000 1.20 --- io.c 5 Dec 2005 10:54:55 -0000 1.21 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.21 2005/12/05 10:54:55 vfrolov + * Implemented IOCTL_SERIAL_IMMEDIATE_CHAR + * * Revision 1.20 2005/11/30 16:04:11 vfrolov * Implemented IOCTL_SERIAL_GET_STATS and IOCTL_SERIAL_CLEAR_STATS *************** *** 95,98 **** --- 98,116 ---- (((PUCHAR)(pIrp)->AssociatedIrp.SystemBuffer) + done) + SIZE_T GetWriteLength(IN PIRP pIrp) + { + PIO_STACK_LOCATION pIrpStack = IoGetCurrentIrpStackLocation(pIrp); + + switch(pIrpStack->MajorFunction) { + case IRP_MJ_WRITE: + return pIrpStack->Parameters.Write.Length; + case IRP_MJ_DEVICE_CONTROL: + if (pIrpStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_SERIAL_IMMEDIATE_CHAR) + return sizeof(UCHAR); + break; + } + return 0; + } + NTSTATUS ReadBuffer(PIRP pIrp, PC0C_BUFFER pBuf, PSIZE_T pReadDone) { *************** *** 165,169 **** pWriteBuf = GET_REST_BUFFER(pIrp, information); ! writeLength = IoGetCurrentIrpStackLocation(pIrp)->Parameters.Write.Length; pBuf = &pReadIoPort->readBuf; --- 183,187 ---- pWriteBuf = GET_REST_BUFFER(pIrp, information); ! writeLength = GetWriteLength(pIrp); pBuf = &pReadIoPort->readBuf; *************** *** 222,226 **** pWriteBuf = GET_REST_BUFFER(pIrp, information); ! writeLength = IoGetCurrentIrpStackLocation(pIrp)->Parameters.Write.Length; writeDone = writeLength - information; --- 240,244 ---- pWriteBuf = GET_REST_BUFFER(pIrp, information); ! writeLength = GetWriteLength(pIrp); writeDone = writeLength - information; *************** *** 270,275 **** pWriteBuf = GET_REST_BUFFER(pIrpWrite, pIrpWrite->IoStatus.Information); ! writeLength = IoGetCurrentIrpStackLocation(pIrpWrite)->Parameters.Write.Length ! - pIrpWrite->IoStatus.Information; CopyCharsWithEscape( --- 288,292 ---- pWriteBuf = GET_REST_BUFFER(pIrpWrite, pIrpWrite->IoStatus.Information); ! writeLength = GetWriteLength(pIrpWrite) - pIrpWrite->IoStatus.Information; CopyCharsWithEscape( Index: startirp.c =================================================================== RCS file: /cvsroot/com0com/com0com/startirp.c,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** startirp.c 29 Nov 2005 16:16:46 -0000 1.6 --- startirp.c 5 Dec 2005 10:54:55 -0000 1.7 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.7 2005/12/05 10:54:55 vfrolov + * Implemented IOCTL_SERIAL_IMMEDIATE_CHAR + * * Revision 1.6 2005/11/29 16:16:46 vfrolov * Removed FdoPortCancelQueue() *************** *** 59,62 **** --- 62,66 ---- switch (pIrpStack->Parameters.DeviceIoControl.IoControlCode) { case IOCTL_SERIAL_WAIT_ON_MASK: + case IOCTL_SERIAL_IMMEDIATE_CHAR: return (PC0C_IRP_STATE)&pIrpStack->Parameters.DeviceIoControl.Type3InputBuffer; } *************** *** 201,204 **** --- 205,240 ---- } + NTSTATUS StartIrp( + IN PC0C_FDOPORT_EXTENSION pDevExt, + IN PIRP pIrp, + IN PC0C_IRP_STATE pState, + IN PC0C_IRP_QUEUE pQueue, + IN KIRQL oldIrql, + IN PC0C_FDOPORT_START_ROUTINE pStartRoutine) + { + NTSTATUS status; + LIST_ENTRY queueToComplete; + + pQueue->pCurrent = pIrp; + pState->flags |= C0C_IRP_FLAG_IS_CURRENT; + + InitializeListHead(&queueToComplete); + status = pStartRoutine(pDevExt, &queueToComplete); + + if (status == STATUS_PENDING) { + pIrp->IoStatus.Status = STATUS_PENDING; + IoMarkIrpPending(pIrp); + } else { + status = NoPending(pIrp, status); + ShiftQueue(pQueue); + } + + KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); + + FdoPortCompleteQueue(&queueToComplete); + + return status; + } + NTSTATUS FdoPortStartIrp( IN PC0C_FDOPORT_EXTENSION pDevExt, *************** *** 232,254 **** } else { if (!pQueue->pCurrent) { ! LIST_ENTRY queueToComplete; ! ! pQueue->pCurrent = pIrp; ! pState->flags |= C0C_IRP_FLAG_IS_CURRENT; ! ! InitializeListHead(&queueToComplete); ! status = pStartRoutine(pDevExt, &queueToComplete); ! ! if (status == STATUS_PENDING) { ! pIrp->IoStatus.Status = STATUS_PENDING; ! IoMarkIrpPending(pIrp); ! } else { ! status = NoPending(pIrp, status); ! ShiftQueue(pQueue); ! } ! ! KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); ! ! FdoPortCompleteQueue(&queueToComplete); } else { PIO_STACK_LOCATION pIrpStack; --- 268,272 ---- } else { if (!pQueue->pCurrent) { ! status = StartIrp(pDevExt, pIrp, pState, pQueue, oldIrql, pStartRoutine); } else { PIO_STACK_LOCATION pIrpStack; *************** *** 257,263 **** if (pIrpStack->MajorFunction == IRP_MJ_DEVICE_CONTROL && ! pIrpStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_SERIAL_WAIT_ON_MASK) { status = NoPending(pIrp, STATUS_INVALID_PARAMETER); ! } else { pIrp->IoStatus.Status = STATUS_PENDING; IoMarkIrpPending(pIrp); --- 275,309 ---- if (pIrpStack->MajorFunction == IRP_MJ_DEVICE_CONTROL && ! pIrpStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_SERIAL_WAIT_ON_MASK) ! { status = NoPending(pIrp, STATUS_INVALID_PARAMETER); ! } ! else ! if (pIrpStack->MajorFunction == IRP_MJ_DEVICE_CONTROL && ! pIrpStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_SERIAL_IMMEDIATE_CHAR) ! { ! PIO_STACK_LOCATION pCurrentStack; ! ! pCurrentStack = IoGetCurrentIrpStackLocation(pQueue->pCurrent); ! ! if (pCurrentStack->MajorFunction == IRP_MJ_DEVICE_CONTROL && ! pCurrentStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_SERIAL_IMMEDIATE_CHAR) ! { ! status = NoPending(pIrp, STATUS_INVALID_PARAMETER); ! } else { ! PC0C_IRP_STATE pCurrentState; ! ! pCurrentState = GetIrpState(pQueue->pCurrent); ! ! HALT_UNLESS(pCurrentState); ! ! pCurrentState->flags &= ~C0C_IRP_FLAG_IS_CURRENT; ! InsertHeadList(&pQueue->queue, &pQueue->pCurrent->Tail.Overlay.ListEntry); ! pCurrentState->flags |= C0C_IRP_FLAG_IN_QUEUE; ! ! status = StartIrp(pDevExt, pIrp, pState, pQueue, oldIrql, pStartRoutine); ! } ! } ! else { pIrp->IoStatus.Status = STATUS_PENDING; IoMarkIrpPending(pIrp); Index: com0com.h =================================================================== RCS file: /cvsroot/com0com/com0com/com0com.h,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** com0com.h 30 Nov 2005 16:04:11 -0000 1.19 --- com0com.h 5 Dec 2005 10:54:55 -0000 1.20 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.20 2005/12/05 10:54:55 vfrolov + * Implemented IOCTL_SERIAL_IMMEDIATE_CHAR + * * Revision 1.19 2005/11/30 16:04:11 vfrolov * Implemented IOCTL_SERIAL_GET_STATS and IOCTL_SERIAL_CLEAR_STATS *************** *** 284,287 **** --- 287,295 ---- 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, *************** *** 315,318 **** --- 323,327 ---- PC0C_IRP_STATE GetIrpState(IN PIRP pIrp); + SIZE_T GetWriteLength(IN PIRP pIrp); #define C0C_IO_TYPE_WAIT_COMPLETE 3 Index: trace.c =================================================================== RCS file: /cvsroot/com0com/com0com/trace.c,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** trace.c 30 Nov 2005 16:04:12 -0000 1.15 --- trace.c 5 Dec 2005 10:54:55 -0000 1.16 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.16 2005/12/05 10:54:55 vfrolov + * Implemented IOCTL_SERIAL_IMMEDIATE_CHAR + * * Revision 1.15 2005/11/30 16:04:12 vfrolov * Implemented IOCTL_SERIAL_GET_STATS and IOCTL_SERIAL_CLEAR_STATS *************** *** 1344,1347 **** --- 1347,1356 ---- pDestStr = AnsiStrCopyPerfStats(pDestStr, &size, (PSERIALPERF_STATS)pSysBuf); break; + case IOCTL_SERIAL_IMMEDIATE_CHAR: + if (flags & TRACE_FLAG_RESULTS) { + pDestStr = AnsiStrCopyStr(pDestStr, &size, " "); + pDestStr = AnsiStrCopyDump(pDestStr, &size, pSysBuf, inform); + } + break; } break; Index: write.c =================================================================== RCS file: /cvsroot/com0com/com0com/write.c,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** write.c 13 Sep 2005 14:56:16 -0000 1.4 --- write.c 5 Dec 2005 10:54:56 -0000 1.5 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.5 2005/12/05 10:54:56 vfrolov + * Implemented IOCTL_SERIAL_IMMEDIATE_CHAR + * * Revision 1.4 2005/09/13 14:56:16 vfrolov * Implemented IRP_MJ_FLUSH_BUFFERS *************** *** 50,53 **** --- 53,67 ---- } + NTSTATUS FdoPortImmediateChar( + IN PC0C_FDOPORT_EXTENSION pDevExt, + IN PIRP pIrp, + IN PIO_STACK_LOCATION pIrpStack) + { + if (pIrpStack->Parameters.DeviceIoControl.InputBufferLength < sizeof(UCHAR)) + return STATUS_BUFFER_TOO_SMALL; + + return FdoPortStartIrp(pDevExt, pIrp, C0C_QUEUE_WRITE, StartIrpWrite); + } + NTSTATUS FdoPortWrite(IN PC0C_FDOPORT_EXTENSION pDevExt, IN PIRP pIrp) { Index: timeout.c =================================================================== RCS file: /cvsroot/com0com/com0com/timeout.c,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** timeout.c 23 Aug 2005 15:49:21 -0000 1.4 --- timeout.c 5 Dec 2005 10:54:55 -0000 1.5 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.5 2005/12/05 10:54:55 vfrolov + * Implemented IOCTL_SERIAL_IMMEDIATE_CHAR + * * Revision 1.4 2005/08/23 15:49:21 vfrolov * Implemented baudrate emulation *************** *** 184,188 **** ULONG length; ! length = IoGetCurrentIrpStackLocation(pIrp)->Parameters.Write.Length; total.QuadPart = ((LONGLONG)(UInt32x32To64(length, multiplier) + constant)) * -10000; --- 187,191 ---- ULONG length; ! length = GetWriteLength(pIrp); total.QuadPart = ((LONGLONG)(UInt32x32To64(length, multiplier) + constant)) * -10000; |
From: Vyacheslav F. <vf...@us...> - 2005-12-05 10:43:30
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv8786 Modified Files: ReadMe.txt Log Message: Added FAQ about port name Index: ReadMe.txt =================================================================== RCS file: /cvsroot/com0com/com0com/ReadMe.txt,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** ReadMe.txt 1 Sep 2005 13:17:18 -0000 1.7 --- ReadMe.txt 5 Dec 2005 10:43:19 -0000 1.8 *************** *** 106,107 **** --- 106,112 ---- [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\com0com\Parameters\CNCA0] "EmuBR"=dword:FFFFFFFF + + Q. The HyperTerminal test succeeds, but I get a failure when trying to open the + port with CreateFile("CNCA0", ...). GetLastError() returns ERROR_FILE_NOT_FOUND. + A. You must prefix name with the special characters "\\.\". Try to open the port + with CreateFile("\\\\.\\CNCA0", ...). |
From: Vyacheslav F. <vf...@us...> - 2005-11-30 16:04:22
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23450 Modified Files: com0com.h io.c ioctl.c openclos.c trace.c Log Message: Implemented IOCTL_SERIAL_GET_STATS and IOCTL_SERIAL_CLEAR_STATS Index: trace.c =================================================================== RCS file: /cvsroot/com0com/com0com/trace.c,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** trace.c 28 Sep 2005 10:06:42 -0000 1.14 --- trace.c 30 Nov 2005 16:04:12 -0000 1.15 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.15 2005/11/30 16:04:12 vfrolov + * Implemented IOCTL_SERIAL_GET_STATS and IOCTL_SERIAL_CLEAR_STATS + * * Revision 1.14 2005/09/28 10:06:42 vfrolov * Implemented IRP_MJ_QUERY_INFORMATION and IRP_MJ_SET_INFORMATION *************** *** 739,742 **** --- 742,777 ---- (long)pCommStatus->AmountInInQueue); } + + PCHAR AnsiStrCopyPerfStats( + PCHAR pDestStr, + PSIZE_T pSize, + IN PSERIALPERF_STATS pPerfStats) + { + if (pPerfStats->ReceivedCount) + pDestStr = AnsiStrFormat(pDestStr, pSize, + " ReceivedCount=%lu", (long)pPerfStats->ReceivedCount); + + if (pPerfStats->TransmittedCount) + pDestStr = AnsiStrFormat(pDestStr, pSize, + " TransmittedCount=%lu", (long)pPerfStats->TransmittedCount); + + if (pPerfStats->FrameErrorCount) + pDestStr = AnsiStrFormat(pDestStr, pSize, + " FrameErrorCount=%lu", (long)pPerfStats->FrameErrorCount); + + if (pPerfStats->SerialOverrunErrorCount) + pDestStr = AnsiStrFormat(pDestStr, pSize, + " SerialOverrunErrorCount=%lu", (long)pPerfStats->SerialOverrunErrorCount); + + if (pPerfStats->BufferOverrunErrorCount) + pDestStr = AnsiStrFormat(pDestStr, pSize, + " BufferOverrunErrorCount=%lu", (long)pPerfStats->BufferOverrunErrorCount); + + if (pPerfStats->ParityErrorCount) + pDestStr = AnsiStrFormat(pDestStr, pSize, + " ParityErrorCount=%lu", (long)pPerfStats->ParityErrorCount); + + return pDestStr; + } /********************************************************************/ *************** *** 1305,1308 **** --- 1340,1347 ---- pDestStr = AnsiStrFormat(pDestStr, &size, " escapeChar=0x%02X", (int)(*(PUCHAR)pSysBuf & 0xFF)); break; + case IOCTL_SERIAL_GET_STATS: + if ((flags & TRACE_FLAG_RESULTS) && inform >= sizeof(SERIALPERF_STATS)) + pDestStr = AnsiStrCopyPerfStats(pDestStr, &size, (PSERIALPERF_STATS)pSysBuf); + break; } break; Index: com0com.h =================================================================== RCS file: /cvsroot/com0com/com0com/com0com.h,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** com0com.h 29 Nov 2005 16:16:46 -0000 1.18 --- com0com.h 30 Nov 2005 16:04:11 -0000 1.19 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.19 2005/11/30 16:04:11 vfrolov + * Implemented IOCTL_SERIAL_GET_STATS and IOCTL_SERIAL_CLEAR_STATS + * * Revision 1.18 2005/11/29 16:16:46 vfrolov * Removed FdoPortCancelQueue() *************** *** 173,176 **** --- 176,180 ---- ULONG eventMask; UCHAR escapeChar; + SERIALPERF_STATS perfStats; #define C0C_MSB_CTS 0x10 Index: openclos.c =================================================================== RCS file: /cvsroot/com0com/com0com/openclos.c,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** openclos.c 29 Nov 2005 12:33:21 -0000 1.8 --- openclos.c 30 Nov 2005 16:04:12 -0000 1.9 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.9 2005/11/30 16:04:12 vfrolov + * Implemented IOCTL_SERIAL_GET_STATS and IOCTL_SERIAL_CLEAR_STATS + * * Revision 1.8 2005/11/29 12:33:21 vfrolov * Changed SetModemStatus() to ability set and clear bits simultaneously *************** *** 97,100 **** --- 100,104 ---- pDevExt->pIoPortLocal->eventMask = 0; pDevExt->pIoPortLocal->escapeChar = 0; + RtlZeroMemory(&pDevExt->pIoPortLocal->perfStats, sizeof(pDevExt->pIoPortLocal->perfStats)); pDevExt->handFlow.XoffLimit = size >> 3; pDevExt->handFlow.XonLimit = size >> 1; Index: ioctl.c =================================================================== RCS file: /cvsroot/com0com/com0com/ioctl.c,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** ioctl.c 29 Nov 2005 16:16:46 -0000 1.11 --- ioctl.c 30 Nov 2005 16:04:12 -0000 1.12 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.12 2005/11/30 16:04:12 vfrolov + * Implemented IOCTL_SERIAL_GET_STATS and IOCTL_SERIAL_CLEAR_STATS + * * Revision 1.11 2005/11/29 16:16:46 vfrolov * Removed FdoPortCancelQueue() *************** *** 517,520 **** --- 520,541 ---- break; } + case IOCTL_SERIAL_GET_STATS: + if (pIrpStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(SERIALPERF_STATS)) { + status = STATUS_BUFFER_TOO_SMALL; + break; + } + + KeAcquireSpinLock(&pDevExt->controlLock, &oldIrql); + *(PSERIALPERF_STATS)pIrp->AssociatedIrp.SystemBuffer = pDevExt->pIoPortLocal->perfStats; + KeReleaseSpinLock(&pDevExt->controlLock, oldIrql); + pIrp->IoStatus.Information = sizeof(SERIALPERF_STATS); + + TraceIrp("FdoPortIoCtl", pIrp, &status, TRACE_FLAG_RESULTS); + break; + case IOCTL_SERIAL_CLEAR_STATS: + KeAcquireSpinLock(&pDevExt->controlLock, &oldIrql); + RtlZeroMemory(&pDevExt->pIoPortLocal->perfStats, sizeof(pDevExt->pIoPortLocal->perfStats)); + KeReleaseSpinLock(&pDevExt->controlLock, oldIrql); + break; default: status = STATUS_INVALID_PARAMETER; Index: io.c =================================================================== RCS file: /cvsroot/com0com/com0com/io.c,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** io.c 29 Nov 2005 12:33:21 -0000 1.19 --- io.c 30 Nov 2005 16:04:11 -0000 1.20 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.20 2005/11/30 16:04:11 vfrolov + * Implemented IOCTL_SERIAL_GET_STATS and IOCTL_SERIAL_CLEAR_STATS + * * Revision 1.19 2005/11/29 12:33:21 vfrolov * Changed SetModemStatus() to ability set and clear bits simultaneously *************** *** 140,143 **** --- 143,149 ---- WaitComplete(pReadIoPort, pQueueToComplete); } + + pReadIoPort->perfStats.ReceivedCount += size; + pReadIoPort->pDevExt->pIoPortRemote->perfStats.TransmittedCount += size; } *************** *** 232,235 **** --- 238,242 ---- AlertOverrun(pReadIoPort, pQueueToComplete); + pReadIoPort->perfStats.BufferOverrunErrorCount += writeDone; OnRxChars(pReadIoPort, pWriteBuf, writeDone, pQueueToComplete); } |
From: Vyacheslav F. <vf...@us...> - 2005-11-29 16:16:56
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv17660 Modified Files: com0com.h ioctl.c startirp.c Log Message: Removed FdoPortCancelQueue() Index: startirp.c =================================================================== RCS file: /cvsroot/com0com/com0com/startirp.c,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** startirp.c 13 Sep 2005 14:56:16 -0000 1.5 --- startirp.c 29 Nov 2005 16:16:46 -0000 1.6 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.6 2005/11/29 16:16:46 vfrolov + * Removed FdoPortCancelQueue() + * * Revision 1.5 2005/09/13 14:56:16 vfrolov * Implemented IRP_MJ_FLUSH_BUFFERS *************** *** 153,180 **** } ! VOID FdoPortCancelQueue(IN PC0C_FDOPORT_EXTENSION pDevExt, IN PC0C_IRP_QUEUE pQueue) { LIST_ENTRY queueToComplete; KIRQL oldIrql; InitializeListHead(&queueToComplete); - KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! CancelQueue(pQueue, &queueToComplete); KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); - FdoPortCompleteQueue(&queueToComplete); } - VOID FdoPortCancelQueues(IN PC0C_FDOPORT_EXTENSION pDevExt) - { - int i; - - for (i = 0 ; i < C0C_QUEUE_SIZE ; i++) - FdoPortCancelQueue(pDevExt, &pDevExt->pIoPortLocal->irpQueues[i]); - } - VOID FdoPortCompleteQueue(IN PLIST_ENTRY pQueueToComplete) { --- 156,175 ---- } ! VOID FdoPortCancelQueues(IN PC0C_FDOPORT_EXTENSION pDevExt) { LIST_ENTRY queueToComplete; KIRQL oldIrql; + int i; 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); } VOID FdoPortCompleteQueue(IN PLIST_ENTRY pQueueToComplete) { Index: ioctl.c =================================================================== RCS file: /cvsroot/com0com/com0com/ioctl.c,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** ioctl.c 29 Nov 2005 12:33:21 -0000 1.10 --- ioctl.c 29 Nov 2005 16:16:46 -0000 1.11 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.11 2005/11/29 16:16:46 vfrolov + * Removed FdoPortCancelQueue() + * * Revision 1.10 2005/11/29 12:33:21 vfrolov * Changed SetModemStatus() to ability set and clear bits simultaneously *************** *** 148,151 **** --- 151,155 ---- break; case IOCTL_SERIAL_PURGE: { + LIST_ENTRY queueToComplete; PULONG pSysBuf; *************** *** 167,182 **** } if (*pSysBuf & SERIAL_PURGE_RXABORT) ! FdoPortCancelQueue(pDevExt, &pDevExt->pIoPortLocal->irpQueues[C0C_QUEUE_READ]); if (*pSysBuf & SERIAL_PURGE_TXABORT) ! FdoPortCancelQueue(pDevExt, &pDevExt->pIoPortLocal->irpQueues[C0C_QUEUE_WRITE]); if (*pSysBuf & SERIAL_PURGE_RXCLEAR) { - KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); PurgeBuffer(&pDevExt->pIoPortLocal->readBuf); - KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); } pIrp->IoStatus.Information = sizeof(ULONG); break; --- 171,190 ---- } + InitializeListHead(&queueToComplete); + KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); + 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); } + KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); + FdoPortCompleteQueue(&queueToComplete); + pIrp->IoStatus.Information = sizeof(ULONG); break; *************** *** 226,230 **** InitializeListHead(&queueToComplete); - KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); --- 234,237 ---- Index: com0com.h =================================================================== RCS file: /cvsroot/com0com/com0com/com0com.h,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** com0com.h 29 Nov 2005 12:33:21 -0000 1.17 --- com0com.h 29 Nov 2005 16:16:46 -0000 1.18 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.18 2005/11/29 16:16:46 vfrolov + * Removed FdoPortCancelQueue() + * * Revision 1.17 2005/11/29 12:33:21 vfrolov * Changed SetModemStatus() to ability set and clear bits simultaneously *************** *** 274,278 **** VOID CancelQueue(PC0C_IRP_QUEUE pQueue, PLIST_ENTRY pQueueToComplete); - VOID FdoPortCancelQueue(IN PC0C_FDOPORT_EXTENSION pDevExt, IN PC0C_IRP_QUEUE pQueue); VOID FdoPortCancelQueues(IN PC0C_FDOPORT_EXTENSION pDevExt); VOID FdoPortCompleteQueue(IN PLIST_ENTRY pQueueToComplete); --- 277,280 ---- |
From: Vyacheslav F. <vf...@us...> - 2005-11-29 12:33:34
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv32150 Modified Files: com0com.h io.c ioctl.c openclos.c Log Message: Changed SetModemStatus() to ability set and clear bits simultaneously Index: io.c =================================================================== RCS file: /cvsroot/com0com/com0com/io.c,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** io.c 29 Nov 2005 08:35:13 -0000 1.18 --- io.c 29 Nov 2005 12:33:21 -0000 1.19 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.19 2005/11/29 12:33:21 vfrolov + * Changed SetModemStatus() to ability set and clear bits simultaneously + * * Revision 1.18 2005/11/29 08:35:13 vfrolov * Implemented SERIAL_EV_RX80FULL *************** *** 628,632 **** IN PC0C_IO_PORT pIoPort, IN ULONG bits, ! IN BOOLEAN set, PLIST_ENTRY pQueueToComplete) { --- 631,635 ---- IN PC0C_IO_PORT pIoPort, IN ULONG bits, ! IN ULONG mask, PLIST_ENTRY pQueueToComplete) { *************** *** 636,646 **** modemStatusOld = pIoPort->modemStatus; ! if (bits & C0C_MSB_DSR) ! bits |= C0C_MSB_RLSD; /* CD = DSR */ ! if (set) ! pIoPort->modemStatus |= bits; else ! pIoPort->modemStatus &= ~bits; modemStatusChanged = modemStatusOld ^ pIoPort->modemStatus; --- 639,650 ---- modemStatusOld = pIoPort->modemStatus; ! pIoPort->modemStatus |= bits & mask; ! pIoPort->modemStatus &= ~(~bits & mask); ! /* CD = DSR */ ! if (pIoPort->modemStatus & C0C_MSB_DSR) ! pIoPort->modemStatus |= C0C_MSB_RLSD; else ! pIoPort->modemStatus &= ~C0C_MSB_RLSD; modemStatusChanged = modemStatusOld ^ pIoPort->modemStatus; *************** *** 707,710 **** if (bits) ! SetModemStatus(pDevExt->pIoPortRemote, bits, TRUE, pQueueToComplete); } --- 711,714 ---- if (bits) ! SetModemStatus(pDevExt->pIoPortRemote, bits, bits, pQueueToComplete); } Index: openclos.c =================================================================== RCS file: /cvsroot/com0com/com0com/openclos.c,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** openclos.c 28 Nov 2005 12:57:16 -0000 1.7 --- openclos.c 29 Nov 2005 12:33:21 -0000 1.8 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.8 2005/11/29 12:33:21 vfrolov + * Changed SetModemStatus() to ability set and clear bits simultaneously + * * Revision 1.7 2005/11/28 12:57:16 vfrolov * Moved some C0C_BUFFER code to bufutils.c *************** *** 115,119 **** KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! SetModemStatus(pDevExt->pIoPortRemote, C0C_MSB_CTS | C0C_MSB_DSR, FALSE, &queueToComplete); FreeBuffer(&pDevExt->pIoPortLocal->readBuf); --- 118,122 ---- KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! SetModemStatus(pDevExt->pIoPortRemote, 0, C0C_MSB_CTS | C0C_MSB_DSR, &queueToComplete); FreeBuffer(&pDevExt->pIoPortLocal->readBuf); Index: ioctl.c =================================================================== RCS file: /cvsroot/com0com/com0com/ioctl.c,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** ioctl.c 28 Nov 2005 12:57:16 -0000 1.9 --- ioctl.c 29 Nov 2005 12:33:21 -0000 1.10 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.10 2005/11/29 12:33:21 vfrolov + * Changed SetModemStatus() to ability set and clear bits simultaneously + * * Revision 1.9 2005/11/28 12:57:16 vfrolov * Moved some C0C_BUFFER code to bufutils.c *************** *** 89,94 **** SetModemStatus( pDevExt->pIoPortRemote, C0C_MSB_CTS, - (BOOLEAN)(code == IOCTL_SERIAL_SET_RTS), &queueToComplete); --- 92,97 ---- SetModemStatus( pDevExt->pIoPortRemote, + code == IOCTL_SERIAL_SET_RTS ? C0C_MSB_CTS : 0, C0C_MSB_CTS, &queueToComplete); *************** *** 113,118 **** SetModemStatus( pDevExt->pIoPortRemote, C0C_MSB_DSR, - (BOOLEAN)(code == IOCTL_SERIAL_SET_DTR), &queueToComplete); --- 116,121 ---- SetModemStatus( pDevExt->pIoPortRemote, + code == IOCTL_SERIAL_SET_DTR ? C0C_MSB_DSR : 0, C0C_MSB_DSR, &queueToComplete); Index: com0com.h =================================================================== RCS file: /cvsroot/com0com/com0com/com0com.h,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** com0com.h 29 Nov 2005 08:35:14 -0000 1.16 --- com0com.h 29 Nov 2005 12:33:21 -0000 1.17 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.17 2005/11/29 12:33:21 vfrolov + * Changed SetModemStatus() to ability set and clear bits simultaneously + * * Revision 1.16 2005/11/29 08:35:14 vfrolov * Implemented SERIAL_EV_RX80FULL *************** *** 329,333 **** IN PC0C_IO_PORT pIoPort, IN ULONG bits, ! IN BOOLEAN set, PLIST_ENTRY pQueueToComplete); --- 332,336 ---- IN PC0C_IO_PORT pIoPort, IN ULONG bits, ! IN ULONG mask, PLIST_ENTRY pQueueToComplete); |
From: Vyacheslav F. <vf...@us...> - 2005-11-29 08:35:22
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18940 Modified Files: io.c bufutils.c com0com.h Log Message: Implemented SERIAL_EV_RX80FULL Index: bufutils.c =================================================================== RCS file: /cvsroot/com0com/com0com/bufutils.c,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** bufutils.c 28 Nov 2005 12:57:16 -0000 1.3 --- bufutils.c 29 Nov 2005 08:35:14 -0000 1.4 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.4 2005/11/29 08:35:14 vfrolov + * Implemented SERIAL_EV_RX80FULL + * * Revision 1.3 2005/11/28 12:57:16 vfrolov * Moved some C0C_BUFFER code to bufutils.c *************** *** 338,341 **** --- 341,351 ---- } + VOID InitBufferBase(PC0C_BUFFER pBuf, PUCHAR pBase, SIZE_T size) + { + pBuf->pBase = pBase; + pBuf->pEnd = pBuf->pBase + size; + pBuf->size80 = (size*4 + 4)/5; + } + BOOLEAN SetNewBufferBase(PC0C_BUFFER pBuf, PUCHAR pBase, SIZE_T size) { *************** *** 347,352 **** } ! newBuf.pFree = newBuf.pBusy = newBuf.pBase = pBase; ! newBuf.pEnd = newBuf.pBase + size; newBuf.busy = 0; --- 357,363 ---- } ! InitBufferBase(&newBuf, pBase, size); ! ! newBuf.pFree = newBuf.pBusy = newBuf.pBase; newBuf.busy = 0; *************** *** 391,397 **** { RtlZeroMemory(pBuf, sizeof(*pBuf)); ! ! pBuf->pBase = pBase; ! pBuf->pEnd = pBuf->pBase + size; PurgeBuffer(pBuf); } --- 402,406 ---- { RtlZeroMemory(pBuf, sizeof(*pBuf)); ! InitBufferBase(pBuf, pBase, size); PurgeBuffer(pBuf); } Index: io.c =================================================================== RCS file: /cvsroot/com0com/com0com/io.c,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** io.c 25 Nov 2005 08:59:39 -0000 1.17 --- io.c 29 Nov 2005 08:35:13 -0000 1.18 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.18 2005/11/29 08:35:13 vfrolov + * Implemented SERIAL_EV_RX80FULL + * * Revision 1.17 2005/11/25 08:59:39 vfrolov * Implemented SERIAL_EV_RXFLAG *************** *** 352,356 **** } else ! if ((first && pState->flags & C0C_IRP_FLAG_INTERVAL_TIMEOUT) != 0) { SetIntervalTimeout(pIoPort); } --- 355,359 ---- } else ! if (first && (pState->flags & C0C_IRP_FLAG_INTERVAL_TIMEOUT) != 0) { SetIntervalTimeout(pIoPort); } *************** *** 463,466 **** --- 466,470 ---- { NTSTATUS status; + SIZE_T readBufBusyBeg, readBufBusyEnd; BOOLEAN firstRead; PC0C_ADAPTIVE_DELAY pWriteDelay; *************** *** 486,489 **** --- 490,495 ---- } + readBufBusyBeg = C0C_BUFFER_BUSY(&pIoPortRead->readBuf); + for (firstRead = TRUE ;; firstRead = FALSE) { NTSTATUS statusRead; *************** *** 604,607 **** --- 610,625 ---- } + readBufBusyEnd = C0C_BUFFER_BUSY(&pIoPortRead->readBuf); + + if (readBufBusyBeg != readBufBusyEnd) { + if ((pIoPortRead->waitMask & SERIAL_EV_RX80FULL) && + readBufBusyEnd > pIoPortRead->readBuf.size80 && + readBufBusyBeg <= pIoPortRead->readBuf.size80) + { + pIoPortRead->eventMask |= SERIAL_EV_RX80FULL; + WaitComplete(pIoPortRead, pQueueToComplete); + } + } + return status; } Index: com0com.h =================================================================== RCS file: /cvsroot/com0com/com0com/com0com.h,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** com0com.h 28 Nov 2005 12:57:16 -0000 1.15 --- com0com.h 29 Nov 2005 08:35:14 -0000 1.16 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.16 2005/11/29 08:35:14 vfrolov + * Implemented SERIAL_EV_RX80FULL + * * Revision 1.15 2005/11/28 12:57:16 vfrolov * Moved some C0C_BUFFER code to bufutils.c *************** *** 122,125 **** --- 125,129 ---- PUCHAR pEnd; SIZE_T busy; + SIZE_T size80; BOOLEAN escape; C0C_RAW_DATA insertData; |
From: Vyacheslav F. <vf...@us...> - 2005-11-28 12:57:27
|
Update of /cvsroot/com0com/com0com In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7079 Modified Files: bufutils.c bufutils.h com0com.h ioctl.c openclos.c Log Message: Moved some C0C_BUFFER code to bufutils.c Index: bufutils.c =================================================================== RCS file: /cvsroot/com0com/com0com/bufutils.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** bufutils.c 6 Sep 2005 07:23:44 -0000 1.2 --- bufutils.c 28 Nov 2005 12:57:16 -0000 1.3 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.3 2005/11/28 12:57:16 vfrolov + * Moved some C0C_BUFFER code to bufutils.c + * * Revision 1.2 2005/09/06 07:23:44 vfrolov * Implemented overrun emulation *************** *** 334,335 **** --- 337,405 ---- return length; } + + BOOLEAN SetNewBufferBase(PC0C_BUFFER pBuf, PUCHAR pBase, SIZE_T size) + { + C0C_BUFFER newBuf; + + if (size <= C0C_BUFFER_SIZE(pBuf)) { + ExFreePool(pBase); + return FALSE; + } + + newBuf.pFree = newBuf.pBusy = newBuf.pBase = pBase; + newBuf.pEnd = newBuf.pBase + size; + newBuf.busy = 0; + + if (pBuf->pBase) { + while (pBuf->busy) { + SIZE_T length; + + length = pBuf->pFree <= pBuf->pBusy ? + pBuf->pEnd - pBuf->pBusy : pBuf->busy; + + RtlCopyMemory(newBuf.pFree, pBuf->pBusy, length); + + pBuf->busy -= length; + pBuf->pBusy += length; + if (pBuf->pBusy == pBuf->pEnd) + pBuf->pBusy = pBuf->pBase; + + newBuf.busy += length; + newBuf.pFree += length; + } + + ExFreePool(pBuf->pBase); + } + + newBuf.escape = pBuf->escape; + newBuf.insertData = pBuf->insertData; + + *pBuf = newBuf; + + return TRUE; + } + + VOID PurgeBuffer(PC0C_BUFFER pBuf) + { + pBuf->pFree = pBuf->pBusy = pBuf->pBase; + pBuf->busy = 0; + pBuf->escape = FALSE; + pBuf->insertData.size = 0; + } + + VOID InitBuffer(PC0C_BUFFER pBuf, PUCHAR pBase, SIZE_T size) + { + RtlZeroMemory(pBuf, sizeof(*pBuf)); + + pBuf->pBase = pBase; + pBuf->pEnd = pBuf->pBase + size; + PurgeBuffer(pBuf); + } + + VOID FreeBuffer(PC0C_BUFFER pBuf) + { + if (pBuf->pBase) + ExFreePool(pBuf->pBase); + + RtlZeroMemory(pBuf, sizeof(*pBuf)); + } Index: bufutils.h =================================================================== RCS file: /cvsroot/com0com/com0com/bufutils.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** bufutils.h 6 Sep 2005 07:23:44 -0000 1.2 --- bufutils.h 28 Nov 2005 12:57:16 -0000 1.3 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.3 2005/11/28 12:57:16 vfrolov + * Moved some C0C_BUFFER code to bufutils.c + * * Revision 1.2 2005/09/06 07:23:44 vfrolov * Implemented overrun emulation *************** *** 43,46 **** --- 46,53 ---- NTSTATUS WriteRawDataToBuffer(PC0C_RAW_DATA pRawData, PC0C_BUFFER pBuf); SIZE_T WriteRawData(PC0C_RAW_DATA pRawData, PNTSTATUS pStatus, PVOID pReadBuf, SIZE_T readLength); + BOOLEAN SetNewBufferBase(PC0C_BUFFER pBuf, PUCHAR pBase, SIZE_T size); + VOID PurgeBuffer(PC0C_BUFFER pBuf); + VOID InitBuffer(PC0C_BUFFER pBuf, PUCHAR pBase, SIZE_T size); + VOID FreeBuffer(PC0C_BUFFER pBuf); #endif /* _C0C_BUFUTILS_H_ */ Index: openclos.c =================================================================== RCS file: /cvsroot/com0com/com0com/openclos.c,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** openclos.c 6 Sep 2005 07:23:44 -0000 1.6 --- openclos.c 28 Nov 2005 12:57:16 -0000 1.7 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.7 2005/11/28 12:57:16 vfrolov + * Moved some C0C_BUFFER code to bufutils.c + * * Revision 1.6 2005/09/06 07:23:44 vfrolov * Implemented overrun emulation *************** *** 41,49 **** #include "precomp.h" NTSTATUS FdoPortOpen(IN PC0C_FDOPORT_EXTENSION pDevExt) { LIST_ENTRY queueToComplete; ! C0C_BUFFER readBufNew; ULONG size; KIRQL oldIrql; --- 44,53 ---- #include "precomp.h" + #include "bufutils.h" NTSTATUS FdoPortOpen(IN PC0C_FDOPORT_EXTENSION pDevExt) { LIST_ENTRY queueToComplete; ! PUCHAR pBase; ULONG size; KIRQL oldIrql; *************** *** 54,87 **** } switch (MmQuerySystemSize()) { case MmLargeSystem: size = 4096; ! readBufNew.pBase = (PUCHAR)ExAllocatePool(NonPagedPool, size); ! if (readBufNew.pBase) break; case MmMediumSystem: size = 1024; ! readBufNew.pBase = (PUCHAR)ExAllocatePool(NonPagedPool, size); ! if (readBufNew.pBase) break; case MmSmallSystem: size = 128; ! readBufNew.pBase = (PUCHAR)ExAllocatePool(NonPagedPool, size); ! if (readBufNew.pBase) break; default: size = 0; ! readBufNew.pBase = NULL; } - readBufNew.pEnd = readBufNew.pBase + size; - - C0C_BUFFER_PURGE(readBufNew); - InitializeListHead(&queueToComplete); KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! pDevExt->pIoPortLocal->readBuf = readBufNew; pDevExt->pIoPortLocal->errors = 0; --- 58,92 ---- } + if (!pDevExt->pIoPortRemote->pDevExt) { + InterlockedDecrement(&pDevExt->openCount); + return STATUS_INSUFFICIENT_RESOURCES; + } + switch (MmQuerySystemSize()) { case MmLargeSystem: size = 4096; ! pBase = (PUCHAR)ExAllocatePool(NonPagedPool, size); ! if (pBase) break; case MmMediumSystem: size = 1024; ! pBase = (PUCHAR)ExAllocatePool(NonPagedPool, size); ! if (pBase) break; case MmSmallSystem: size = 128; ! pBase = (PUCHAR)ExAllocatePool(NonPagedPool, size); ! if (pBase) break; default: size = 0; ! pBase = NULL; } InitializeListHead(&queueToComplete); KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! InitBuffer(&pDevExt->pIoPortLocal->readBuf, pBase, size); pDevExt->pIoPortLocal->errors = 0; *************** *** 89,92 **** --- 94,99 ---- pDevExt->pIoPortLocal->eventMask = 0; pDevExt->pIoPortLocal->escapeChar = 0; + pDevExt->handFlow.XoffLimit = size >> 3; + pDevExt->handFlow.XonLimit = size >> 1; UpdateHandFlow(pDevExt, &queueToComplete); *************** *** 102,106 **** { LIST_ENTRY queueToComplete; - C0C_BUFFER readBuf; KIRQL oldIrql; --- 109,112 ---- *************** *** 110,116 **** SetModemStatus(pDevExt->pIoPortRemote, C0C_MSB_CTS | C0C_MSB_DSR, FALSE, &queueToComplete); ! ! readBuf = pDevExt->pIoPortLocal->readBuf; ! RtlZeroMemory(&pDevExt->pIoPortLocal->readBuf, sizeof(pDevExt->pIoPortLocal->readBuf)); KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); --- 116,120 ---- SetModemStatus(pDevExt->pIoPortRemote, C0C_MSB_CTS | C0C_MSB_DSR, FALSE, &queueToComplete); ! FreeBuffer(&pDevExt->pIoPortLocal->readBuf); KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); *************** *** 118,124 **** FdoPortCompleteQueue(&queueToComplete); - if (readBuf.pBase) - ExFreePool(readBuf.pBase); - InterlockedDecrement(&pDevExt->openCount); --- 122,125 ---- Index: ioctl.c =================================================================== RCS file: /cvsroot/com0com/com0com/ioctl.c,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** ioctl.c 6 Sep 2005 07:23:44 -0000 1.8 --- ioctl.c 28 Nov 2005 12:57:16 -0000 1.9 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.9 2005/11/28 12:57:16 vfrolov + * Moved some C0C_BUFFER code to bufutils.c + * * Revision 1.8 2005/09/06 07:23:44 vfrolov * Implemented overrun emulation *************** *** 49,52 **** --- 52,56 ---- #include "timeout.h" #include "delay.h" + #include "bufutils.h" NTSTATUS FdoPortIoCtl( *************** *** 168,172 **** if (*pSysBuf & SERIAL_PURGE_RXCLEAR) { KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! C0C_BUFFER_PURGE(pDevExt->pIoPortLocal->readBuf); KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); } --- 172,176 ---- if (*pSysBuf & SERIAL_PURGE_RXCLEAR) { KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! PurgeBuffer(&pDevExt->pIoPortLocal->readBuf); KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); } *************** *** 187,193 **** KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); RtlZeroMemory(pSysBuf, sizeof(*pSysBuf)); ! pSysBuf->AmountInInQueue = ! (ULONG)pDevExt->pIoPortLocal->readBuf.busy + ! (ULONG)pDevExt->pIoPortLocal->readBuf.insertData.size; pSysBuf->Errors = pDevExt->pIoPortLocal->errors; pDevExt->pIoPortLocal->errors = 0; --- 191,195 ---- KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); RtlZeroMemory(pSysBuf, sizeof(*pSysBuf)); ! pSysBuf->AmountInInQueue = (ULONG)C0C_BUFFER_BUSY(&pDevExt->pIoPortLocal->readBuf); pSysBuf->Errors = pDevExt->pIoPortLocal->errors; pDevExt->pIoPortLocal->errors = 0; *************** *** 212,217 **** if (pSysBuf->ControlHandShake & SERIAL_CONTROL_INVALID || pSysBuf->FlowReplace & SERIAL_FLOW_INVALID || ! (pSysBuf->ControlHandShake & SERIAL_DTR_MASK) == SERIAL_DTR_MASK ! ) { status = STATUS_INVALID_PARAMETER; break; --- 214,221 ---- if (pSysBuf->ControlHandShake & SERIAL_CONTROL_INVALID || pSysBuf->FlowReplace & SERIAL_FLOW_INVALID || ! (pSysBuf->ControlHandShake & SERIAL_DTR_MASK) == SERIAL_DTR_MASK || ! pSysBuf->XonLimit < 0 || ! pSysBuf->XoffLimit < 0) ! { status = STATUS_INVALID_PARAMETER; break; *************** *** 451,456 **** pSysBuf->CurrentTxQueue = 0; ! pSysBuf->CurrentRxQueue = ! (ULONG)(pDevExt->pIoPortLocal->readBuf.pEnd - pDevExt->pIoPortLocal->readBuf.pBase); pIrp->IoStatus.Information = sizeof(SERIAL_COMMPROP); --- 455,459 ---- pSysBuf->CurrentTxQueue = 0; ! pSysBuf->CurrentRxQueue = (ULONG)C0C_BUFFER_SIZE(&pDevExt->pIoPortLocal->readBuf); pIrp->IoStatus.Information = sizeof(SERIAL_COMMPROP); *************** *** 467,472 **** case IOCTL_SERIAL_SET_QUEUE_SIZE: { PSERIAL_QUEUE_SIZE pSysBuf = (PSERIAL_QUEUE_SIZE)pIrp->AssociatedIrp.SystemBuffer; - C0C_BUFFER readBufNew; PC0C_BUFFER pReadBuf; if (pIrpStack->Parameters.DeviceIoControl.InputBufferLength < sizeof(SERIAL_QUEUE_SIZE)) { --- 470,475 ---- case IOCTL_SERIAL_SET_QUEUE_SIZE: { PSERIAL_QUEUE_SIZE pSysBuf = (PSERIAL_QUEUE_SIZE)pIrp->AssociatedIrp.SystemBuffer; PC0C_BUFFER pReadBuf; + PUCHAR pBase; if (pIrpStack->Parameters.DeviceIoControl.InputBufferLength < sizeof(SERIAL_QUEUE_SIZE)) { *************** *** 475,531 **** } ! if (pSysBuf->InSize <= ! (ULONG)(pDevExt->pIoPortLocal->readBuf.pEnd - pDevExt->pIoPortLocal->readBuf.pBase)) { ! status = STATUS_SUCCESS; break; } try { ! readBufNew.pBase = ExAllocatePoolWithQuota(NonPagedPool, pSysBuf->InSize); } except (EXCEPTION_EXECUTE_HANDLER) { ! readBufNew.pBase = NULL; status = GetExceptionCode(); } ! if (!readBufNew.pBase) break; - readBufNew.pFree = readBufNew.pBusy = readBufNew.pBase; - readBufNew.pEnd = readBufNew.pBase + pSysBuf->InSize; - readBufNew.busy = 0; - - pReadBuf = &pDevExt->pIoPortLocal->readBuf; - KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! if (pReadBuf->pBase) { ! while (pReadBuf->busy) { ! SIZE_T length; ! ! length = pReadBuf->pFree <= pReadBuf->pBusy ? ! pReadBuf->pEnd - pReadBuf->pBusy : pReadBuf->busy; ! ! RtlCopyMemory(readBufNew.pFree, pReadBuf->pBusy, length); ! ! pReadBuf->busy -= length; ! pReadBuf->pBusy += length; ! if (pReadBuf->pBusy == pReadBuf->pEnd) ! pReadBuf->pBusy = pReadBuf->pBase; ! ! readBufNew.busy += length; ! readBufNew.pFree += length; ! } ! ! ExFreePool(pReadBuf->pBase); } - readBufNew.escape = pReadBuf->escape; - readBufNew.insertData = pReadBuf->insertData; - - *pReadBuf = readBufNew; - KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); - - status = STATUS_SUCCESS; break; } --- 478,508 ---- } ! pReadBuf = &pDevExt->pIoPortLocal->readBuf; ! ! KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! if (pSysBuf->InSize <= C0C_BUFFER_SIZE(pReadBuf)) { ! KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); break; } + KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); try { ! pBase = ExAllocatePoolWithQuota(NonPagedPool, pSysBuf->InSize); } except (EXCEPTION_EXECUTE_HANDLER) { ! pBase = NULL; status = GetExceptionCode(); } ! if (!pBase) break; KeAcquireSpinLock(pDevExt->pIoLock, &oldIrql); ! if (SetNewBufferBase(pReadBuf, pBase, pSysBuf->InSize)) { ! pDevExt->handFlow.XoffLimit = pSysBuf->InSize >> 3; ! pDevExt->handFlow.XonLimit = pSysBuf->InSize >> 1; } KeReleaseSpinLock(pDevExt->pIoLock, oldIrql); break; } Index: com0com.h =================================================================== RCS file: /cvsroot/com0com/com0com/com0com.h,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** com0com.h 28 Sep 2005 10:06:42 -0000 1.14 --- com0com.h 28 Nov 2005 12:57:16 -0000 1.15 *************** *** 20,23 **** --- 20,26 ---- * * $Log$ + * Revision 1.15 2005/11/28 12:57:16 vfrolov + * Moved some C0C_BUFFER code to bufutils.c + * * Revision 1.14 2005/09/28 10:06:42 vfrolov * Implemented IRP_MJ_QUERY_INFORMATION and IRP_MJ_SET_INFORMATION *************** *** 123,131 **** } C0C_BUFFER, *PC0C_BUFFER; ! #define C0C_BUFFER_PURGE(buf) \ ! (buf).pFree = (buf).pBusy = (buf).pBase; \ ! (buf).busy = 0; \ ! (buf).escape = FALSE; \ ! (buf).insertData.size = 0 struct _C0C_FDOPORT_EXTENSION; --- 126,134 ---- } C0C_BUFFER, *PC0C_BUFFER; ! #define C0C_BUFFER_BUSY(pBuf) \ ! ((SIZE_T)((pBuf)->busy + (pBuf)->insertData.size)) ! ! #define C0C_BUFFER_SIZE(pBuf) \ ! ((SIZE_T)((pBuf)->pEnd - (pBuf)->pBase)) struct _C0C_FDOPORT_EXTENSION; |