[Com0com-cvs] com0com/sys adddev.c, 1.31, 1.32 com0com.h, 1.39, 1.40 delay.c, 1.9, 1.10 delay.h, 1.
The virtual serial port driver for Windows.
Brought to you by:
vfrolov
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); |