Update of /cvsroot/com0com/com0com/sys
In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv15450/sys
Modified Files:
adddev.c com0com.h delay.c delay.h io.c ioctl.c openclos.c
timeout.c timeout.h trace.c wmi.c
Log Message:
Implemented ability to get paired port settings with
extended IOCTL_SERIAL_LSRMST_INSERT
Index: openclos.c
===================================================================
RCS file: /cvsroot/com0com/com0com/sys/openclos.c,v
retrieving revision 1.20
retrieving revision 1.21
diff -C2 -d -r1.20 -r1.21
*** openclos.c 17 Sep 2007 14:31:06 -0000 1.20
--- openclos.c 14 Mar 2008 15:28:39 -0000 1.21
***************
*** 2,6 ****
* $Id$
*
! * Copyright (c) 2004-2007 Vyacheslav Frolov
*
* This program is free software; you can redistribute it and/or modify
--- 2,6 ----
* $Id$
*
! * Copyright (c) 2004-2008 Vyacheslav Frolov
*
* This program is free software; you can redistribute it and/or modify
***************
*** 20,23 ****
--- 20,27 ----
*
* $Log$
+ * Revision 1.21 2008/03/14 15:28:39 vfrolov
+ * Implemented ability to get paired port settings with
+ * extended IOCTL_SERIAL_LSRMST_INSERT
+ *
* Revision 1.20 2007/09/17 14:31:06 vfrolov
* Implemented pseudo pin OPEN
***************
*** 165,169 ****
pIoPort->waitMask = 0;
pIoPort->eventMask = 0;
- pIoPort->escapeChar = 0;
RtlZeroMemory(&pIoPort->perfStats, sizeof(pIoPort->perfStats));
pIoPort->handFlow.XoffLimit = size >> 3;
--- 169,172 ----
***************
*** 224,227 ****
--- 227,231 ----
KeAcquireSpinLock(pIoPort->pIoLock, &oldIrql);
+ pIoPort->escapeChar = 0;
pIoPort->writeHoldingRemote = 0;
pIoPort->sendXonXoff = 0;
Index: ioctl.c
===================================================================
RCS file: /cvsroot/com0com/com0com/sys/ioctl.c,v
retrieving revision 1.33
retrieving revision 1.34
diff -C2 -d -r1.33 -r1.34
*** ioctl.c 17 Sep 2007 14:31:06 -0000 1.33
--- ioctl.c 14 Mar 2008 15:28:39 -0000 1.34
***************
*** 2,6 ****
* $Id$
*
! * Copyright (c) 2004-2007 Vyacheslav Frolov
*
* This program is free software; you can redistribute it and/or modify
--- 2,6 ----
* $Id$
*
! * Copyright (c) 2004-2008 Vyacheslav Frolov
*
* This program is free software; you can redistribute it and/or modify
***************
*** 20,23 ****
--- 20,27 ----
*
* $Log$
+ * Revision 1.34 2008/03/14 15:28:39 vfrolov
+ * Implemented ability to get paired port settings with
+ * extended IOCTL_SERIAL_LSRMST_INSERT
+ *
* Revision 1.33 2007/09/17 14:31:06 vfrolov
* Implemented pseudo pin OPEN
***************
*** 135,138 ****
--- 139,143 ----
#include "handflow.h"
#include "commprop.h"
+ #include "../include/cncext.h"
NTSTATUS FdoPortIoCtl(
***************
*** 177,181 ****
&queueToComplete);
! if (pIoPortLocal->pIoPortRemote->tryWrite) {
ReadWrite(
pIoPortLocal, FALSE,
--- 182,186 ----
&queueToComplete);
! if (pIoPortLocal->pIoPortRemote->tryWrite || pIoPortLocal->tryWrite) {
ReadWrite(
pIoPortLocal, FALSE,
***************
*** 184,194 ****
}
- if (pIoPortLocal->tryWrite) {
- ReadWrite(
- pIoPortLocal->pIoPortRemote, FALSE,
- pIoPortLocal, FALSE,
- &queueToComplete);
- }
-
KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql);
FdoPortCompleteQueue(&queueToComplete);
--- 189,192 ----
***************
*** 215,219 ****
&queueToComplete);
! if (pIoPortLocal->pIoPortRemote->tryWrite) {
ReadWrite(
pIoPortLocal, FALSE,
--- 213,217 ----
&queueToComplete);
! if (pIoPortLocal->pIoPortRemote->tryWrite || pIoPortLocal->tryWrite) {
ReadWrite(
pIoPortLocal, FALSE,
***************
*** 222,232 ****
}
- if (pIoPortLocal->tryWrite) {
- ReadWrite(
- pIoPortLocal->pIoPortRemote, FALSE,
- pIoPortLocal, FALSE,
- &queueToComplete);
- }
-
KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql);
FdoPortCompleteQueue(&queueToComplete);
--- 220,223 ----
***************
*** 251,255 ****
&queueToComplete);
! if (pIoPortLocal->pIoPortRemote->tryWrite) {
ReadWrite(
pIoPortLocal, FALSE,
--- 242,246 ----
&queueToComplete);
! if (pIoPortLocal->pIoPortRemote->tryWrite || pIoPortLocal->tryWrite) {
ReadWrite(
pIoPortLocal, FALSE,
***************
*** 258,268 ****
}
- if (pIoPortLocal->tryWrite) {
- ReadWrite(
- pIoPortLocal->pIoPortRemote, FALSE,
- pIoPortLocal, FALSE,
- &queueToComplete);
- }
-
KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql);
FdoPortCompleteQueue(&queueToComplete);
--- 249,252 ----
***************
*** 522,529 ****
break;
case IOCTL_SERIAL_SET_TIMEOUTS:
! status = FdoPortSetTimeouts(pDevExt, pIrp, pIrpStack);
break;
case IOCTL_SERIAL_GET_TIMEOUTS:
! status = FdoPortGetTimeouts(pDevExt, pIrp, pIrpStack);
TraceIrp("FdoPortIoCtl", pIrp, &status, TRACE_FLAG_RESULTS);
break;
--- 506,513 ----
break;
case IOCTL_SERIAL_SET_TIMEOUTS:
! status = FdoPortSetTimeouts(pIoPortLocal, pIrp, pIrpStack);
break;
case IOCTL_SERIAL_GET_TIMEOUTS:
! status = FdoPortGetTimeouts(pIoPortLocal, pIrp, pIrpStack);
TraceIrp("FdoPortIoCtl", pIrp, &status, TRACE_FLAG_RESULTS);
break;
***************
*** 568,579 ****
break;
case IOCTL_SERIAL_LSRMST_INSERT: {
UCHAR escapeChar;
! if (pIrpStack->Parameters.DeviceIoControl.InputBufferLength < sizeof(UCHAR)) {
status = STATUS_BUFFER_TOO_SMALL;
break;
}
! escapeChar = *(PUCHAR)pIrp->AssociatedIrp.SystemBuffer;
KeAcquireSpinLock(pIoPortLocal->pIoLock, &oldIrql);
--- 552,630 ----
break;
case IOCTL_SERIAL_LSRMST_INSERT: {
+ ULONG Information;
+ ULONG optsAndBits;
UCHAR escapeChar;
+ PUCHAR pSysBuf;
+ ULONG InputBufferLength;
+ BOOLEAN extended;
! InputBufferLength = pIrpStack->Parameters.DeviceIoControl.InputBufferLength;
!
! if (InputBufferLength < sizeof(UCHAR)) {
status = STATUS_BUFFER_TOO_SMALL;
break;
}
! Information = 0;
! pSysBuf = (PUCHAR)pIrp->AssociatedIrp.SystemBuffer;
! escapeChar = *pSysBuf;
!
! if (InputBufferLength >= (sizeof(UCHAR) + C0CE_SIGNATURE_SIZE + sizeof(ULONG)) &&
! RtlEqualMemory(pSysBuf + 1, C0CE_SIGNATURE, C0CE_SIGNATURE_SIZE))
! {
! extended = TRUE;
! optsAndBits = *(ULONG *)(pSysBuf + 1 + C0CE_SIGNATURE_SIZE);
!
! #define C0CE_INSERT_OPTS ( \
! C0CE_INSERT_IOCTL_GET| \
! C0CE_INSERT_IOCTL_RXCLEAR)
!
! #define C0CE_INSERT_BITS ( \
! C0CE_INSERT_ENABLE_LSR| \
! C0CE_INSERT_ENABLE_MST| \
! C0CE_INSERT_ENABLE_RBR| \
! C0CE_INSERT_ENABLE_RLC)
!
! #define C0CE_INSERT_CAPS (C0CE_INSERT_OPTS|C0CE_INSERT_BITS)
!
! if (optsAndBits == C0CE_INSERT_IOCTL_CAPS) {
! optsAndBits = (C0CE_INSERT_ENABLE_LSR|C0CE_INSERT_ENABLE_MST);
! optsAndBits = 0;
!
! Information += C0CE_SIGNATURE_SIZE + sizeof(ULONG);
!
! if (pIrpStack->Parameters.DeviceIoControl.OutputBufferLength < Information) {
! status = STATUS_BUFFER_TOO_SMALL;
! break;
! }
!
! RtlCopyMemory(pSysBuf, C0CE_SIGNATURE, C0CE_SIGNATURE_SIZE);
! *(ULONG *)(pSysBuf + C0CE_SIGNATURE_SIZE) = C0CE_INSERT_CAPS;
! } else {
! if (optsAndBits & ~C0CE_INSERT_CAPS) {
! status = STATUS_INVALID_PARAMETER;
! break;
! }
!
! if (optsAndBits & C0CE_INSERT_IOCTL_GET) {
! if (optsAndBits & C0CE_INSERT_ENABLE_LSR)
! Information += sizeof(UCHAR)*2 + sizeof(UCHAR);
! if (optsAndBits & C0CE_INSERT_ENABLE_MST)
! Information += sizeof(UCHAR)*2 + sizeof(UCHAR);
! if (optsAndBits & C0CE_INSERT_ENABLE_RBR)
! Information += sizeof(UCHAR)*2 + sizeof(ULONG);
! if (optsAndBits & C0CE_INSERT_ENABLE_RLC)
! Information += sizeof(UCHAR)*2 + sizeof(UCHAR)*3;
! }
!
! if (pIrpStack->Parameters.DeviceIoControl.OutputBufferLength < Information) {
! status = STATUS_BUFFER_TOO_SMALL;
! break;
! }
! }
! } else {
! extended = FALSE;
! optsAndBits = (C0CE_INSERT_ENABLE_LSR|C0CE_INSERT_ENABLE_MST);
! }
KeAcquireSpinLock(pIoPortLocal->pIoLock, &oldIrql);
***************
*** 584,596 ****
{
status = STATUS_INVALID_PARAMETER;
}
! if (status == STATUS_SUCCESS)
! pIoPortLocal->escapeChar = escapeChar;
KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql);
break;
}
! case IOCTL_SERIAL_SET_LINE_CONTROL:
if (pIrpStack->Parameters.DeviceIoControl.InputBufferLength < sizeof(SERIAL_LINE_CONTROL)) {
status = STATUS_BUFFER_TOO_SMALL;
--- 635,710 ----
{
status = STATUS_INVALID_PARAMETER;
+ KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql);
+ break;
}
! pIoPortLocal->insertMask = optsAndBits & C0CE_INSERT_BITS;
! pIoPortLocal->escapeChar = escapeChar;
!
! if (extended) {
! LIST_ENTRY queueToComplete;
!
! InitializeListHead(&queueToComplete);
!
! if (optsAndBits & C0CE_INSERT_IOCTL_GET) {
! if (optsAndBits & C0CE_INSERT_ENABLE_LSR) {
! UCHAR lsr = 0x10; /* break interrupt indicator */
!
! if (!pIoPortLocal->amountInWriteQueue || pIoPortLocal->writeHolding)
! lsr |= 0x60; /* transmit holding register empty and transmitter empty indicators */
!
! *pSysBuf++ = escapeChar;
! *pSysBuf++ = SERIAL_LSRMST_LSR_NODATA;
! *pSysBuf++ = lsr;
! }
!
! if (optsAndBits & C0CE_INSERT_ENABLE_MST) {
! *pSysBuf++ = escapeChar;
! *pSysBuf++ = SERIAL_LSRMST_MST;
! *pSysBuf++ = pIoPortLocal->modemStatus;
! }
!
! if (optsAndBits & C0CE_INSERT_ENABLE_RBR) {
! *pSysBuf++ = escapeChar;
! *pSysBuf++ = C0CE_INSERT_RBR;
! *(ULONG *)pSysBuf = pIoPortLocal->pIoPortRemote->baudRate.BaudRate;
! pSysBuf += sizeof(ULONG);
! }
!
! if (optsAndBits & C0CE_INSERT_ENABLE_RLC) {
! *pSysBuf++ = escapeChar;
! *pSysBuf++ = C0CE_INSERT_RLC;
! *pSysBuf++ = pIoPortLocal->pIoPortRemote->lineControl.WordLength;
! *pSysBuf++ = pIoPortLocal->pIoPortRemote->lineControl.Parity;
! *pSysBuf++ = pIoPortLocal->pIoPortRemote->lineControl.StopBits;
! }
! }
!
! pIrp->IoStatus.Information = Information;
!
! if (optsAndBits & C0CE_INSERT_IOCTL_RXCLEAR) {
! PurgeBuffer(&pIoPortLocal->readBuf);
! UpdateHandFlow(pIoPortLocal, TRUE, &queueToComplete);
! if (pIoPortLocal->tryWrite || pIoPortLocal->pIoPortRemote->tryWrite) {
! ReadWrite(
! pIoPortLocal, FALSE,
! pIoPortLocal->pIoPortRemote, FALSE,
! &queueToComplete);
! }
! }
!
! KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql);
! FdoPortCompleteQueue(&queueToComplete);
!
! TraceIrp("FdoPortIoCtl", pIrp, &status, TRACE_FLAG_RESULTS);
! break;
! }
KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql);
break;
}
! case IOCTL_SERIAL_SET_LINE_CONTROL: {
! PSERIAL_LINE_CONTROL pLineControl;
!
if (pIrpStack->Parameters.DeviceIoControl.InputBufferLength < sizeof(SERIAL_LINE_CONTROL)) {
status = STATUS_BUFFER_TOO_SMALL;
***************
*** 598,607 ****
}
! KeAcquireSpinLock(&pDevExt->controlLock, &oldIrql);
! pDevExt->lineControl = *(PSERIAL_LINE_CONTROL)pIrp->AssociatedIrp.SystemBuffer;
! KeReleaseSpinLock(&pDevExt->controlLock, oldIrql);
! SetWriteDelay(pDevExt);
break;
case IOCTL_SERIAL_GET_LINE_CONTROL:
if (pIrpStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(SERIAL_LINE_CONTROL)) {
--- 712,751 ----
}
! pLineControl = (PSERIAL_LINE_CONTROL)pIrp->AssociatedIrp.SystemBuffer;
! KeAcquireSpinLock(pIoPortLocal->pIoLock, &oldIrql);
! if (pIoPortLocal->lineControl.StopBits != pLineControl->StopBits ||
! pIoPortLocal->lineControl.Parity != pLineControl->Parity ||
! pIoPortLocal->lineControl.WordLength != pLineControl->WordLength)
! {
! PC0C_IO_PORT pIoPortRemote;
!
! pIoPortLocal->lineControl = *pLineControl;
! SetWriteDelay(pIoPortLocal);
!
! pIoPortRemote = pIoPortLocal->pIoPortRemote;
!
! if (pIoPortRemote->escapeChar && (pIoPortRemote->insertMask & C0CE_INSERT_ENABLE_RLC)) {
! LIST_ENTRY queueToComplete;
!
! InitializeListHead(&queueToComplete);
!
! InsertRemoteLc(pIoPortRemote, &queueToComplete);
!
! if (pIoPortLocal->pIoPortRemote->tryWrite || pIoPortLocal->tryWrite) {
! ReadWrite(
! pIoPortLocal, FALSE,
! pIoPortLocal->pIoPortRemote, FALSE,
! &queueToComplete);
! }
!
! KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql);
! FdoPortCompleteQueue(&queueToComplete);
! break;
! }
! }
! KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql);
break;
+ }
case IOCTL_SERIAL_GET_LINE_CONTROL:
if (pIrpStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(SERIAL_LINE_CONTROL)) {
***************
*** 610,621 ****
}
! KeAcquireSpinLock(&pDevExt->controlLock, &oldIrql);
! *(PSERIAL_LINE_CONTROL)pIrp->AssociatedIrp.SystemBuffer = pDevExt->lineControl;
! KeReleaseSpinLock(&pDevExt->controlLock, oldIrql);
pIrp->IoStatus.Information = sizeof(SERIAL_LINE_CONTROL);
TraceIrp("FdoPortIoCtl", pIrp, &status, TRACE_FLAG_RESULTS);
break;
! case IOCTL_SERIAL_SET_BAUD_RATE:
if (pIrpStack->Parameters.DeviceIoControl.InputBufferLength < sizeof(SERIAL_BAUD_RATE)) {
status = STATUS_BUFFER_TOO_SMALL;
--- 754,767 ----
}
! KeAcquireSpinLock(pIoPortLocal->pIoLock, &oldIrql);
! *(PSERIAL_LINE_CONTROL)pIrp->AssociatedIrp.SystemBuffer = pIoPortLocal->lineControl;
! KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql);
pIrp->IoStatus.Information = sizeof(SERIAL_LINE_CONTROL);
TraceIrp("FdoPortIoCtl", pIrp, &status, TRACE_FLAG_RESULTS);
break;
! case IOCTL_SERIAL_SET_BAUD_RATE: {
! PSERIAL_BAUD_RATE pBaudRate;
!
if (pIrpStack->Parameters.DeviceIoControl.InputBufferLength < sizeof(SERIAL_BAUD_RATE)) {
status = STATUS_BUFFER_TOO_SMALL;
***************
*** 623,632 ****
}
! KeAcquireSpinLock(&pDevExt->controlLock, &oldIrql);
! pDevExt->baudRate = *(PSERIAL_BAUD_RATE)pIrp->AssociatedIrp.SystemBuffer;
! KeReleaseSpinLock(&pDevExt->controlLock, oldIrql);
! SetWriteDelay(pDevExt);
break;
case IOCTL_SERIAL_GET_BAUD_RATE:
if (pIrpStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(SERIAL_BAUD_RATE)) {
--- 769,805 ----
}
! pBaudRate = (PSERIAL_BAUD_RATE)pIrp->AssociatedIrp.SystemBuffer;
! KeAcquireSpinLock(pIoPortLocal->pIoLock, &oldIrql);
! if (pIoPortLocal->baudRate.BaudRate != pBaudRate->BaudRate) {
! PC0C_IO_PORT pIoPortRemote;
!
! pIoPortLocal->baudRate = *pBaudRate;
! SetWriteDelay(pIoPortLocal);
!
! pIoPortRemote = pIoPortLocal->pIoPortRemote;
!
! if (pIoPortRemote->escapeChar && (pIoPortRemote->insertMask & C0CE_INSERT_ENABLE_RBR)) {
! LIST_ENTRY queueToComplete;
!
! InitializeListHead(&queueToComplete);
!
! InsertRemoteBr(pIoPortRemote, &queueToComplete);
!
! if (pIoPortLocal->pIoPortRemote->tryWrite || pIoPortLocal->tryWrite) {
! ReadWrite(
! pIoPortLocal, FALSE,
! pIoPortLocal->pIoPortRemote, FALSE,
! &queueToComplete);
! }
!
! KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql);
! FdoPortCompleteQueue(&queueToComplete);
! break;
! }
! }
! KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql);
break;
+ }
case IOCTL_SERIAL_GET_BAUD_RATE:
if (pIrpStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(SERIAL_BAUD_RATE)) {
***************
*** 635,641 ****
}
! KeAcquireSpinLock(&pDevExt->controlLock, &oldIrql);
! *(PSERIAL_BAUD_RATE)pIrp->AssociatedIrp.SystemBuffer = pDevExt->baudRate;
! KeReleaseSpinLock(&pDevExt->controlLock, oldIrql);
pIrp->IoStatus.Information = sizeof(SERIAL_BAUD_RATE);
--- 808,814 ----
}
! KeAcquireSpinLock(pIoPortLocal->pIoLock, &oldIrql);
! *(PSERIAL_BAUD_RATE)pIrp->AssociatedIrp.SystemBuffer = pIoPortLocal->baudRate;
! KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql);
pIrp->IoStatus.Information = sizeof(SERIAL_BAUD_RATE);
***************
*** 719,725 ****
}
! KeAcquireSpinLock(&pDevExt->controlLock, &oldIrql);
*(PSERIALPERF_STATS)pIrp->AssociatedIrp.SystemBuffer = pIoPortLocal->perfStats;
! KeReleaseSpinLock(&pDevExt->controlLock, oldIrql);
pIrp->IoStatus.Information = sizeof(SERIALPERF_STATS);
--- 892,898 ----
}
! KeAcquireSpinLock(pIoPortLocal->pIoLock, &oldIrql);
*(PSERIALPERF_STATS)pIrp->AssociatedIrp.SystemBuffer = pIoPortLocal->perfStats;
! KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql);
pIrp->IoStatus.Information = sizeof(SERIALPERF_STATS);
***************
*** 727,733 ****
break;
case IOCTL_SERIAL_CLEAR_STATS:
! KeAcquireSpinLock(&pDevExt->controlLock, &oldIrql);
RtlZeroMemory(&pIoPortLocal->perfStats, sizeof(pIoPortLocal->perfStats));
! KeReleaseSpinLock(&pDevExt->controlLock, oldIrql);
break;
default:
--- 900,906 ----
break;
case IOCTL_SERIAL_CLEAR_STATS:
! KeAcquireSpinLock(pIoPortLocal->pIoLock, &oldIrql);
RtlZeroMemory(&pIoPortLocal->perfStats, sizeof(pIoPortLocal->perfStats));
! KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql);
break;
default:
Index: trace.c
===================================================================
RCS file: /cvsroot/com0com/com0com/sys/trace.c,v
retrieving revision 1.28
retrieving revision 1.29
diff -C2 -d -r1.28 -r1.29
*** trace.c 20 Jun 2007 10:32:44 -0000 1.28
--- trace.c 14 Mar 2008 15:28:39 -0000 1.29
***************
*** 2,6 ****
* $Id$
*
! * Copyright (c) 2004-2007 Vyacheslav Frolov
*
* This program is free software; you can redistribute it and/or modify
--- 2,6 ----
* $Id$
*
! * Copyright (c) 2004-2008 Vyacheslav Frolov
*
* This program is free software; you can redistribute it and/or modify
***************
*** 20,23 ****
--- 20,27 ----
*
* $Log$
+ * Revision 1.29 2008/03/14 15:28:39 vfrolov
+ * Implemented ability to get paired port settings with
+ * extended IOCTL_SERIAL_LSRMST_INSERT
+ *
* Revision 1.28 2007/06/20 10:32:44 vfrolov
* Added PID tracing on IRP_MJ_CREATE
***************
*** 1509,1514 ****
break;
case IOCTL_SERIAL_LSRMST_INSERT:
! if ((flags & TRACE_FLAG_PARAMS) && inLength >= sizeof(UCHAR))
! pDestStr = AnsiStrFormat(pDestStr, &size, " escapeChar=0x%02X", (int)(*(PUCHAR)pSysBuf & 0xFF));
break;
case IOCTL_SERIAL_GET_STATS:
--- 1513,1524 ----
break;
case IOCTL_SERIAL_LSRMST_INSERT:
! if (flags & TRACE_FLAG_PARAMS) {
! pDestStr = AnsiStrCopyStr(pDestStr, &size, " ");
! pDestStr = AnsiStrCopyDump(pDestStr, &size, pSysBuf, inLength);
! }
! if (flags & TRACE_FLAG_RESULTS) {
! pDestStr = AnsiStrCopyStr(pDestStr, &size, " ");
! pDestStr = AnsiStrCopyDump(pDestStr, &size, pSysBuf, inform);
! }
break;
case IOCTL_SERIAL_GET_STATS:
Index: com0com.h
===================================================================
RCS file: /cvsroot/com0com/com0com/sys/com0com.h,v
retrieving revision 1.39
retrieving revision 1.40
diff -C2 -d -r1.39 -r1.40
*** com0com.h 23 Nov 2007 08:30:50 -0000 1.39
--- com0com.h 14 Mar 2008 15:28:39 -0000 1.40
***************
*** 2,6 ****
* $Id$
*
! * Copyright (c) 2004-2007 Vyacheslav Frolov
*
* This program is free software; you can redistribute it and/or modify
--- 2,6 ----
* $Id$
*
! * Copyright (c) 2004-2008 Vyacheslav Frolov
*
* This program is free software; you can redistribute it and/or modify
***************
*** 20,23 ****
--- 20,27 ----
*
* $Log$
+ * Revision 1.40 2008/03/14 15:28:39 vfrolov
+ * Implemented ability to get paired port settings with
+ * extended IOCTL_SERIAL_LSRMST_INSERT
+ *
* Revision 1.39 2007/11/23 08:30:50 vfrolov
* Increased size of TX buffer to typical default for Windows
***************
*** 194,198 ****
typedef struct _C0C_RAW_DATA {
UCHAR size;
! UCHAR data[7];
} C0C_RAW_DATA, *PC0C_RAW_DATA;
--- 198,202 ----
typedef struct _C0C_RAW_DATA {
UCHAR size;
! UCHAR data[3 + sizeof(ULONG)];
} C0C_RAW_DATA, *PC0C_RAW_DATA;
***************
*** 273,276 ****
--- 277,284 ----
KDPC timerCloseDpc;
+ SERIAL_BAUD_RATE baudRate;
+ SERIAL_LINE_CONTROL lineControl;
+ SERIAL_TIMEOUTS timeouts;
+
struct _C0C_ADAPTIVE_DELAY *pWriteDelay;
***************
*** 290,293 ****
--- 298,302 ----
ULONG waitMask;
ULONG eventMask;
+ ULONG insertMask;
UCHAR escapeChar;
SERIALPERF_STATS perfStats;
***************
*** 348,357 ****
LONG openCount;
- KSPIN_LOCK controlLock;
-
- SERIAL_BAUD_RATE baudRate;
- SERIAL_LINE_CONTROL lineControl;
- SERIAL_TIMEOUTS timeouts;
-
} C0C_FDOPORT_EXTENSION, *PC0C_FDOPORT_EXTENSION;
--- 357,360 ----
***************
*** 498,501 ****
--- 501,512 ----
IN ULONG pinRI);
+ VOID InsertRemoteBr(
+ PC0C_IO_PORT pIoPortRead,
+ PLIST_ENTRY pQueueToComplete);
+
+ VOID InsertRemoteLc(
+ PC0C_IO_PORT pIoPortRead,
+ PLIST_ENTRY pQueueToComplete);
+
#define C0C_TAG 'c0c'
#define C0C_ALLOCATE_POOL(PoolType, NumberOfBytes) \
Index: io.c
===================================================================
RCS file: /cvsroot/com0com/com0com/sys/io.c,v
retrieving revision 1.36
retrieving revision 1.37
diff -C2 -d -r1.36 -r1.37
*** io.c 12 Sep 2007 12:32:53 -0000 1.36
--- io.c 14 Mar 2008 15:28:39 -0000 1.37
***************
*** 2,6 ****
* $Id$
*
! * Copyright (c) 2004-2007 Vyacheslav Frolov
*
* This program is free software; you can redistribute it and/or modify
--- 2,6 ----
* $Id$
*
! * Copyright (c) 2004-2008 Vyacheslav Frolov
*
* This program is free software; you can redistribute it and/or modify
***************
*** 20,23 ****
--- 20,27 ----
*
* $Log$
+ * Revision 1.37 2008/03/14 15:28:39 vfrolov
+ * Implemented ability to get paired port settings with
+ * extended IOCTL_SERIAL_LSRMST_INSERT
+ *
* Revision 1.36 2007/09/12 12:32:53 vfrolov
* Fixed TX buffer
***************
*** 141,144 ****
--- 145,149 ----
#include "bufutils.h"
#include "handflow.h"
+ #include "../include/cncext.h"
/*
***************
*** 846,849 ****
--- 851,902 ----
}
+ VOID InsertRemoteBr(
+ PC0C_IO_PORT pIoPortRead,
+ PLIST_ENTRY pQueueToComplete)
+ {
+ C0C_RAW_DATA insertData;
+
+ insertData.size = 2 + sizeof(ULONG);
+ insertData.data[0] = pIoPortRead->escapeChar;
+ insertData.data[1] = C0CE_INSERT_RBR;
+ *(ULONG *)&insertData.data[2] = pIoPortRead->pIoPortRemote->baudRate.BaudRate;
+
+ 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 C0CE_INSERT_RBR");
+ }
+ }
+
+ VOID InsertRemoteLc(
+ PC0C_IO_PORT pIoPortRead,
+ PLIST_ENTRY pQueueToComplete)
+ {
+ C0C_RAW_DATA insertData;
+
+ insertData.size = 5;
+ insertData.data[0] = pIoPortRead->escapeChar;
+ insertData.data[1] = C0CE_INSERT_RLC;
+ insertData.data[2] = pIoPortRead->pIoPortRemote->lineControl.WordLength;
+ insertData.data[3] = pIoPortRead->pIoPortRemote->lineControl.Parity;
+ insertData.data[4] = pIoPortRead->pIoPortRemote->lineControl.StopBits;
+
+ 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 C0CE_INSERT_RLC");
+ }
+ }
+
NTSTATUS TryReadWrite(
PC0C_IO_PORT pIoPortRead,
***************
*** 1203,1207 ****
WaitComplete(pIoPortRead, pQueueToComplete);
! if (pIoPortRead->escapeChar) {
UCHAR lsr = 0x10; /* break interrupt indicator */
--- 1256,1260 ----
WaitComplete(pIoPortRead, pQueueToComplete);
! if (pIoPortRead->escapeChar && (pIoPortRead->insertMask & C0CE_INSERT_ENABLE_LSR)) {
UCHAR lsr = 0x10; /* break interrupt indicator */
***************
*** 1376,1380 ****
SetModemStatusHolding(pIoPort);
! if (pIoPort->escapeChar)
InsertLsrMst(pIoPort, TRUE,
(UCHAR)(pIoPort->modemStatus | (modemStatusChanged >> 4)), pQueueToComplete);
--- 1429,1433 ----
SetModemStatusHolding(pIoPort);
! if (pIoPort->escapeChar && (pIoPort->insertMask & C0CE_INSERT_ENABLE_MST))
InsertLsrMst(pIoPort, TRUE,
(UCHAR)(pIoPort->modemStatus | (modemStatusChanged >> 4)), pQueueToComplete);
Index: adddev.c
===================================================================
RCS file: /cvsroot/com0com/com0com/sys/adddev.c,v
retrieving revision 1.31
retrieving revision 1.32
diff -C2 -d -r1.31 -r1.32
*** adddev.c 19 Oct 2007 16:03:41 -0000 1.31
--- adddev.c 14 Mar 2008 15:28:39 -0000 1.32
***************
*** 2,6 ****
* $Id$
*
! * Copyright (c) 2004-2007 Vyacheslav Frolov
*
* This program is free software; you can redistribute it and/or modify
--- 2,6 ----
* $Id$
*
! * Copyright (c) 2004-2008 Vyacheslav Frolov
*
* This program is free software; you can redistribute it and/or modify
***************
*** 20,23 ****
--- 20,27 ----
*
* $Log$
+ * Revision 1.32 2008/03/14 15:28:39 vfrolov
+ * Implemented ability to get paired port settings with
+ * extended IOCTL_SERIAL_LSRMST_INSERT
+ *
* Revision 1.31 2007/10/19 16:03:41 vfrolov
* Added default values
***************
*** 389,394 ****
AllocTimeouts(pDevExt->pIoPortLocal);
- KeInitializeSpinLock(&pDevExt->controlLock);
-
RtlZeroMemory(&pDevExt->pIoPortLocal->specialChars, sizeof(pDevExt->pIoPortLocal->specialChars));
pDevExt->pIoPortLocal->specialChars.XonChar = 0x11;
--- 393,396 ----
***************
*** 399,408 ****
pDevExt->pIoPortLocal->handFlow.FlowReplace = SERIAL_RTS_CONTROL;
! pDevExt->lineControl.WordLength = 7;
! pDevExt->lineControl.Parity = EVEN_PARITY;
! pDevExt->lineControl.StopBits = STOP_BIT_1;
! pDevExt->baudRate.BaudRate = 1200;
! SetWriteDelay(pDevExt);
SetTxBuffer(&pDevExt->pIoPortLocal->txBuf, 1, TRUE);
--- 401,410 ----
pDevExt->pIoPortLocal->handFlow.FlowReplace = SERIAL_RTS_CONTROL;
! pDevExt->pIoPortLocal->lineControl.WordLength = 7;
! pDevExt->pIoPortLocal->lineControl.Parity = EVEN_PARITY;
! pDevExt->pIoPortLocal->lineControl.StopBits = STOP_BIT_1;
! pDevExt->pIoPortLocal->baudRate.BaudRate = 1200;
! SetWriteDelay(pDevExt->pIoPortLocal);
SetTxBuffer(&pDevExt->pIoPortLocal->txBuf, 1, TRUE);
Index: wmi.c
===================================================================
RCS file: /cvsroot/com0com/com0com/sys/wmi.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** wmi.c 1 Jun 2007 16:22:40 -0000 1.4
--- wmi.c 14 Mar 2008 15:28:39 -0000 1.5
***************
*** 2,6 ****
* $Id$
*
! * Copyright (c) 2006-2007 Vyacheslav Frolov
*
* This program is free software; you can redistribute it and/or modify
--- 2,6 ----
* $Id$
*
! * Copyright (c) 2006-2008 Vyacheslav Frolov
*
* This program is free software; you can redistribute it and/or modify
***************
*** 20,23 ****
--- 20,27 ----
*
* $Log$
+ * Revision 1.5 2008/03/14 15:28:39 vfrolov
+ * Implemented ability to get paired port settings with
+ * extended IOCTL_SERIAL_LSRMST_INSERT
+ *
* Revision 1.4 2007/06/01 16:22:40 vfrolov
* Implemented plug-in and exclusive modes
***************
*** 116,119 ****
--- 120,124 ----
KIRQL oldIrql;
PC0C_FDOPORT_EXTENSION pDevExt = (PC0C_FDOPORT_EXTENSION)pDevObj->DeviceExtension;
+ PC0C_IO_PORT pIoPort = pDevExt->pIoPortLocal;
UNREFERENCED_PARAMETER(instanceIndex);
***************
*** 148,159 ****
}
! KeAcquireSpinLock(&pDevExt->controlLock, &oldIrql);
! ((PSERIAL_WMI_COMM_DATA)pBuf)->BaudRate = pDevExt->baudRate.BaudRate;
! ((PSERIAL_WMI_COMM_DATA)pBuf)->BitsPerByte = pDevExt->lineControl.WordLength;
((PSERIAL_WMI_COMM_DATA)pBuf)->ParityCheckEnable = TRUE;
! switch (pDevExt->lineControl.Parity) {
default:
case NO_PARITY:
--- 153,164 ----
}
! KeAcquireSpinLock(pIoPort->pIoLock, &oldIrql);
! ((PSERIAL_WMI_COMM_DATA)pBuf)->BaudRate = pIoPort->baudRate.BaudRate;
! ((PSERIAL_WMI_COMM_DATA)pBuf)->BitsPerByte = pIoPort->lineControl.WordLength;
((PSERIAL_WMI_COMM_DATA)pBuf)->ParityCheckEnable = TRUE;
! switch (pIoPort->lineControl.Parity) {
default:
case NO_PARITY:
***************
*** 175,179 ****
}
! switch (pDevExt->lineControl.StopBits) {
default:
case STOP_BIT_1:
--- 180,184 ----
}
! switch (pIoPort->lineControl.StopBits) {
default:
case STOP_BIT_1:
***************
*** 188,201 ****
}
! KeReleaseSpinLock(&pDevExt->controlLock, oldIrql);
!
! KeAcquireSpinLock(pDevExt->pIoPortLocal->pIoLock, &oldIrql);
!
! ((PSERIAL_WMI_COMM_DATA)pBuf)->XoffCharacter = pDevExt->pIoPortLocal->specialChars.XoffChar;
! ((PSERIAL_WMI_COMM_DATA)pBuf)->XoffXmitThreshold = pDevExt->pIoPortLocal->handFlow.XoffLimit;
! ((PSERIAL_WMI_COMM_DATA)pBuf)->XonCharacter = pDevExt->pIoPortLocal->specialChars.XonChar;
! ((PSERIAL_WMI_COMM_DATA)pBuf)->XonXmitThreshold = pDevExt->pIoPortLocal->handFlow.XonLimit;
! KeReleaseSpinLock(pDevExt->pIoPortLocal->pIoLock, oldIrql);
((PSERIAL_WMI_COMM_DATA)pBuf)->MaximumBaudRate = 128L * 1024L;
--- 193,202 ----
}
! ((PSERIAL_WMI_COMM_DATA)pBuf)->XoffCharacter = pIoPort->specialChars.XoffChar;
! ((PSERIAL_WMI_COMM_DATA)pBuf)->XoffXmitThreshold = pIoPort->handFlow.XoffLimit;
! ((PSERIAL_WMI_COMM_DATA)pBuf)->XonCharacter = pIoPort->specialChars.XonChar;
! ((PSERIAL_WMI_COMM_DATA)pBuf)->XonXmitThreshold = pIoPort->handFlow.XonLimit;
! KeReleaseSpinLock(pIoPort->pIoLock, oldIrql);
((PSERIAL_WMI_COMM_DATA)pBuf)->MaximumBaudRate = 128L * 1024L;
***************
*** 250,263 ****
}
! KeAcquireSpinLock(pDevExt->pIoPortLocal->pIoLock, &oldIrql);
! ((PSERIAL_WMI_PERF_DATA)pBuf)->ReceivedCount = pDevExt->pIoPortLocal->perfStats.ReceivedCount;
! ((PSERIAL_WMI_PERF_DATA)pBuf)->TransmittedCount = pDevExt->pIoPortLocal->perfStats.TransmittedCount;
! ((PSERIAL_WMI_PERF_DATA)pBuf)->FrameErrorCount = pDevExt->pIoPortLocal->perfStats.FrameErrorCount;
! ((PSERIAL_WMI_PERF_DATA)pBuf)->SerialOverrunErrorCount = pDevExt->pIoPortLocal->perfStats.SerialOverrunErrorCount;
! ((PSERIAL_WMI_PERF_DATA)pBuf)->BufferOverrunErrorCount = pDevExt->pIoPortLocal->perfStats.BufferOverrunErrorCount;
! ((PSERIAL_WMI_PERF_DATA)pBuf)->ParityErrorCount = pDevExt->pIoPortLocal->perfStats.ParityErrorCount;
! KeReleaseSpinLock(pDevExt->pIoPortLocal->pIoLock, oldIrql);
status = STATUS_SUCCESS;
--- 251,264 ----
}
! KeAcquireSpinLock(pIoPort->pIoLock, &oldIrql);
! ((PSERIAL_WMI_PERF_DATA)pBuf)->ReceivedCount = pIoPort->perfStats.ReceivedCount;
! ((PSERIAL_WMI_PERF_DATA)pBuf)->TransmittedCount = pIoPort->perfStats.TransmittedCount;
! ((PSERIAL_WMI_PERF_DATA)pBuf)->FrameErrorCount = pIoPort->perfStats.FrameErrorCount;
! ((PSERIAL_WMI_PERF_DATA)pBuf)->SerialOverrunErrorCount = pIoPort->perfStats.SerialOverrunErrorCount;
! ((PSERIAL_WMI_PERF_DATA)pBuf)->BufferOverrunErrorCount = pIoPort->perfStats.BufferOverrunErrorCount;
! ((PSERIAL_WMI_PERF_DATA)pBuf)->ParityErrorCount = pIoPort->perfStats.ParityErrorCount;
! KeReleaseSpinLock(pIoPort->pIoLock, oldIrql);
status = STATUS_SUCCESS;
Index: timeout.h
===================================================================
RCS file: /cvsroot/com0com/com0com/sys/timeout.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** timeout.h 4 Jun 2007 15:24:33 -0000 1.6
--- timeout.h 14 Mar 2008 15:28:39 -0000 1.7
***************
*** 2,6 ****
* $Id$
*
! * Copyright (c) 2004-2007 Vyacheslav Frolov
*
* This program is free software; you can redistribute it and/or modify
--- 2,6 ----
* $Id$
*
! * Copyright (c) 2004-2008 Vyacheslav Frolov
*
* This program is free software; you can redistribute it and/or modify
***************
*** 20,23 ****
--- 20,27 ----
*
* $Log$
+ * Revision 1.7 2008/03/14 15:28:39 vfrolov
+ * Implemented ability to get paired port settings with
+ * extended IOCTL_SERIAL_LSRMST_INSERT
+ *
* Revision 1.6 2007/06/04 15:24:33 vfrolov
* Fixed open reject just after close in exclusiveMode
***************
*** 61,72 ****
NTSTATUS FdoPortSetTimeouts(
! IN PC0C_FDOPORT_EXTENSION pDevExt,
! IN PIRP pIrp,
! IN PIO_STACK_LOCATION pIrpStack);
NTSTATUS FdoPortGetTimeouts(
! IN PC0C_FDOPORT_EXTENSION pDevExt,
! IN PIRP pIrp,
! IN PIO_STACK_LOCATION pIrpStack);
#endif /* _C0C_TIMEOUT_H_ */
--- 65,76 ----
NTSTATUS FdoPortSetTimeouts(
! PC0C_IO_PORT pIoPort,
! PIRP pIrp,
! PIO_STACK_LOCATION pIrpStack);
NTSTATUS FdoPortGetTimeouts(
! PC0C_IO_PORT pIoPort,
! PIRP pIrp,
! PIO_STACK_LOCATION pIrpStack);
#endif /* _C0C_TIMEOUT_H_ */
Index: delay.c
===================================================================
RCS file: /cvsroot/com0com/com0com/sys/delay.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -C2 -d -r1.9 -r1.10
*** delay.c 20 Jul 2007 07:59:20 -0000 1.9
--- delay.c 14 Mar 2008 15:28:39 -0000 1.10
***************
*** 2,6 ****
* $Id$
*
! * Copyright (c) 2005-2007 Vyacheslav Frolov
*
* This program is free software; you can redistribute it and/or modify
--- 2,6 ----
* $Id$
*
! * Copyright (c) 2005-2008 Vyacheslav Frolov
*
* This program is free software; you can redistribute it and/or modify
***************
*** 20,23 ****
--- 20,27 ----
*
* $Log$
+ * Revision 1.10 2008/03/14 15:28:39 vfrolov
+ * Implemented ability to get paired port settings with
+ * extended IOCTL_SERIAL_LSRMST_INSERT
+ *
* Revision 1.9 2007/07/20 07:59:20 vfrolov
* Fixed idleCount
***************
*** 158,184 ****
}
! VOID SetWriteDelay(PC0C_FDOPORT_EXTENSION pDevExt)
{
PC0C_ADAPTIVE_DELAY pWriteDelay;
- KIRQL oldIrql;
C0C_DELAY_PARAMS params;
- SERIAL_LINE_CONTROL lineControl;
! pWriteDelay = pDevExt->pIoPortLocal->pWriteDelay;
if (!pWriteDelay)
return;
! KeAcquireSpinLock(pDevExt->pIoPortLocal->pIoLock, &oldIrql);
!
! KeAcquireSpinLockAtDpcLevel(&pDevExt->controlLock);
! lineControl = pDevExt->lineControl;
! params.baudRate = pDevExt->baudRate.BaudRate;
! KeReleaseSpinLockFromDpcLevel(&pDevExt->controlLock);
/* Startbit + WordLength */
! params.decibits_per_frame = (1 + lineControl.WordLength) * 10;
! switch (lineControl.Parity) {
case NO_PARITY:
break;
--- 162,181 ----
}
! VOID SetWriteDelay(PC0C_IO_PORT pIoPort)
{
PC0C_ADAPTIVE_DELAY pWriteDelay;
C0C_DELAY_PARAMS params;
! pWriteDelay = pIoPort->pWriteDelay;
if (!pWriteDelay)
return;
! params.baudRate = pIoPort->baudRate.BaudRate;
/* Startbit + WordLength */
! params.decibits_per_frame = (1 + pIoPort->lineControl.WordLength) * 10;
! switch (pIoPort->lineControl.Parity) {
case NO_PARITY:
break;
***************
*** 192,196 ****
}
! switch (lineControl.StopBits) {
default:
case STOP_BIT_1:
--- 189,193 ----
}
! switch (pIoPort->lineControl.StopBits) {
default:
case STOP_BIT_1:
***************
*** 214,219 ****
}
}
-
- KeReleaseSpinLock(pDevExt->pIoPortLocal->pIoLock, oldIrql);
}
--- 211,214 ----
Index: delay.h
===================================================================
RCS file: /cvsroot/com0com/com0com/sys/delay.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** delay.h 9 Jun 2007 08:49:47 -0000 1.5
--- delay.h 14 Mar 2008 15:28:39 -0000 1.6
***************
*** 2,6 ****
* $Id$
*
! * Copyright (c) 2005-2007 Vyacheslav Frolov
*
* This program is free software; you can redistribute it and/or modify
--- 2,6 ----
* $Id$
*
! * Copyright (c) 2005-2008 Vyacheslav Frolov
*
* This program is free software; you can redistribute it and/or modify
***************
*** 20,23 ****
--- 20,27 ----
*
* $Log$
+ * Revision 1.6 2008/03/14 15:28:39 vfrolov
+ * Implemented ability to get paired port settings with
+ * extended IOCTL_SERIAL_LSRMST_INSERT
+ *
* Revision 1.5 2007/06/09 08:49:47 vfrolov
* Improved baudrate emulation
***************
*** 61,65 ****
VOID FreeWriteDelay(PC0C_IO_PORT pIoPort);
SIZE_T GetWriteLimit(PC0C_ADAPTIVE_DELAY pWriteDelay);
! VOID SetWriteDelay(PC0C_FDOPORT_EXTENSION pDevExt);
VOID StartWriteDelayTimer(PC0C_ADAPTIVE_DELAY pWriteDelay);
VOID StopWriteDelayTimer(PC0C_ADAPTIVE_DELAY pWriteDelay);
--- 65,69 ----
VOID FreeWriteDelay(PC0C_IO_PORT pIoPort);
SIZE_T GetWriteLimit(PC0C_ADAPTIVE_DELAY pWriteDelay);
! VOID SetWriteDelay(PC0C_IO_PORT pIoPort);
VOID StartWriteDelayTimer(PC0C_ADAPTIVE_DELAY pWriteDelay);
VOID StopWriteDelayTimer(PC0C_ADAPTIVE_DELAY pWriteDelay);
Index: timeout.c
===================================================================
RCS file: /cvsroot/com0com/com0com/sys/timeout.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -C2 -d -r1.9 -r1.10
*** timeout.c 4 Jun 2007 15:24:33 -0000 1.9
--- timeout.c 14 Mar 2008 15:28:39 -0000 1.10
***************
*** 2,6 ****
* $Id$
*
! * Copyright (c) 2004-2007 Vyacheslav Frolov
*
* This program is free software; you can redistribute it and/or modify
--- 2,6 ----
* $Id$
*
! * Copyright (c) 2004-2008 Vyacheslav Frolov
*
* This program is free software; you can redistribute it and/or modify
***************
*** 20,23 ****
--- 20,27 ----
*
* $Log$
+ * Revision 1.10 2008/03/14 15:28:39 vfrolov
+ * Implemented ability to get paired port settings with
+ * extended IOCTL_SERIAL_LSRMST_INSERT
+ *
* Revision 1.9 2007/06/04 15:24:33 vfrolov
* Fixed open reject just after close in exclusiveMode
***************
*** 107,111 ****
ULONG constant;
PC0C_IRP_STATE pState;
- PC0C_FDOPORT_EXTENSION pDevExt;
KeCancelTimer(&pIoPort->timerReadTotal);
--- 111,114 ----
***************
*** 115,124 ****
HALT_UNLESS(pState);
! pDevExt = pIoPort->pDevExt;
! HALT_UNLESS(pDevExt);
!
! KeAcquireSpinLockAtDpcLevel(&pDevExt->controlLock);
! timeouts = pDevExt->timeouts;
! KeReleaseSpinLockFromDpcLevel(&pDevExt->controlLock);
if (timeouts.ReadIntervalTimeout == MAXULONG &&
--- 118,122 ----
HALT_UNLESS(pState);
! timeouts = pIoPort->timeouts;
if (timeouts.ReadIntervalTimeout == MAXULONG &&
***************
*** 187,200 ****
ULONG multiplier;
ULONG constant;
- PC0C_FDOPORT_EXTENSION pDevExt;
KeCancelTimer(&pIoPort->timerWriteTotal);
! pDevExt = pIoPort->pDevExt;
! HALT_UNLESS(pDevExt);
!
! KeAcquireSpinLockAtDpcLevel(&pDevExt->controlLock);
! timeouts = pDevExt->timeouts;
! KeReleaseSpinLockFromDpcLevel(&pDevExt->controlLock);
setTotal = FALSE;
--- 185,192 ----
ULONG multiplier;
ULONG constant;
KeCancelTimer(&pIoPort->timerWriteTotal);
! timeouts = pIoPort->timeouts;
setTotal = FALSE;
***************
*** 370,376 ****
NTSTATUS FdoPortSetTimeouts(
! IN PC0C_FDOPORT_EXTENSION pDevExt,
! IN PIRP pIrp,
! IN PIO_STACK_LOCATION pIrpStack)
{
KIRQL oldIrql;
--- 362,368 ----
NTSTATUS FdoPortSetTimeouts(
! PC0C_IO_PORT pIoPort,
! PIRP pIrp,
! PIO_STACK_LOCATION pIrpStack)
{
KIRQL oldIrql;
***************
*** 387,393 ****
return STATUS_INVALID_PARAMETER;
! KeAcquireSpinLock(&pDevExt->controlLock, &oldIrql);
! pDevExt->timeouts = *pSysBuf;
! KeReleaseSpinLock(&pDevExt->controlLock, oldIrql);
return STATUS_SUCCESS;
--- 379,385 ----
return STATUS_INVALID_PARAMETER;
! KeAcquireSpinLock(pIoPort->pIoLock, &oldIrql);
! pIoPort->timeouts = *pSysBuf;
! KeReleaseSpinLock(pIoPort->pIoLock, oldIrql);
return STATUS_SUCCESS;
***************
*** 395,401 ****
NTSTATUS FdoPortGetTimeouts(
! IN PC0C_FDOPORT_EXTENSION pDevExt,
! IN PIRP pIrp,
! IN PIO_STACK_LOCATION pIrpStack)
{
KIRQL oldIrql;
--- 387,393 ----
NTSTATUS FdoPortGetTimeouts(
! PC0C_IO_PORT pIoPort,
! PIRP pIrp,
! PIO_STACK_LOCATION pIrpStack)
{
KIRQL oldIrql;
***************
*** 407,413 ****
pSysBuf = (PSERIAL_TIMEOUTS)pIrp->AssociatedIrp.SystemBuffer;
! KeAcquireSpinLock(&pDevExt->controlLock, &oldIrql);
! *pSysBuf = pDevExt->timeouts;
! KeReleaseSpinLock(&pDevExt->controlLock, oldIrql);
pIrp->IoStatus.Information = sizeof(SERIAL_TIMEOUTS);
--- 399,405 ----
pSysBuf = (PSERIAL_TIMEOUTS)pIrp->AssociatedIrp.SystemBuffer;
! KeAcquireSpinLock(pIoPort->pIoLock, &oldIrql);
! *pSysBuf = pIoPort->timeouts;
! KeReleaseSpinLock(pIoPort->pIoLock, oldIrql);
pIrp->IoStatus.Information = sizeof(SERIAL_TIMEOUTS);
|