[Com0com-cvs] com0com/sys ioctl.c,1.34,1.35
The virtual serial port driver for Windows.
Brought to you by:
vfrolov
From: Vyacheslav F. <vf...@us...> - 2008-04-08 10:36:22
|
Update of /cvsroot/com0com/com0com/sys In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv9944 Modified Files: ioctl.c Log Message: Implemented ability to set individual pins with extended IOCTL_SERIAL_SET_MODEM_CONTROL and IOCTL_SERIAL_GET_MODEM_CONTROL Index: ioctl.c =================================================================== RCS file: /cvsroot/com0com/com0com/sys/ioctl.c,v retrieving revision 1.34 retrieving revision 1.35 diff -C2 -d -r1.34 -r1.35 *** ioctl.c 14 Mar 2008 15:28:39 -0000 1.34 --- ioctl.c 8 Apr 2008 10:36:16 -0000 1.35 *************** *** 20,23 **** --- 20,27 ---- * * $Log$ + * Revision 1.35 2008/04/08 10:36:16 vfrolov + * Implemented ability to set individual pins with extended + * IOCTL_SERIAL_SET_MODEM_CONTROL and IOCTL_SERIAL_GET_MODEM_CONTROL + * * Revision 1.34 2008/03/14 15:28:39 vfrolov * Implemented ability to get paired port settings with *************** *** 227,244 **** case IOCTL_SERIAL_SET_MODEM_CONTROL: { LIST_ENTRY queueToComplete; ! if (pIrpStack->Parameters.DeviceIoControl.InputBufferLength < sizeof(ULONG)) { status = STATUS_BUFFER_TOO_SMALL; break; } InitializeListHead(&queueToComplete); KeAcquireSpinLock(pIoPortLocal->pIoLock, &oldIrql); ! SetModemControl( ! pIoPortLocal, ! (UCHAR)*(PULONG)pIrp->AssociatedIrp.SystemBuffer, ! (UCHAR)C0C_MCR_MASK, ! &queueToComplete); if (pIoPortLocal->pIoPortRemote->tryWrite || pIoPortLocal->tryWrite) { --- 231,260 ---- case IOCTL_SERIAL_SET_MODEM_CONTROL: { LIST_ENTRY queueToComplete; + UCHAR mask; + PUCHAR pSysBuf; + ULONG InputBufferLength; ! InputBufferLength = pIrpStack->Parameters.DeviceIoControl.InputBufferLength; ! ! if (InputBufferLength < sizeof(ULONG)) { status = STATUS_BUFFER_TOO_SMALL; break; } + pSysBuf = (PUCHAR)pIrp->AssociatedIrp.SystemBuffer; + + if (InputBufferLength >= (sizeof(ULONG) + sizeof(ULONG) + C0CE_SIGNATURE_SIZE) && + RtlEqualMemory(pSysBuf + sizeof(ULONG) + sizeof(ULONG), C0CE_SIGNATURE, C0CE_SIGNATURE_SIZE)) + { + mask = C0C_MCR_MASK & (UCHAR)*((PULONG)pSysBuf + 1); + } else { + mask = C0C_MCR_MASK; + } + InitializeListHead(&queueToComplete); + KeAcquireSpinLock(pIoPortLocal->pIoLock, &oldIrql); ! SetModemControl(pIoPortLocal, (UCHAR)*(PULONG)pSysBuf, mask, &queueToComplete); if (pIoPortLocal->pIoPortRemote->tryWrite || pIoPortLocal->tryWrite) { *************** *** 256,261 **** case IOCTL_SERIAL_GET_DTRRTS: { ULONG modemControl; ! if (pIrpStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(ULONG)) { status = STATUS_BUFFER_TOO_SMALL; break; --- 272,281 ---- case IOCTL_SERIAL_GET_DTRRTS: { ULONG modemControl; + PUCHAR pSysBuf; + ULONG OutputBufferLength; ! OutputBufferLength = pIrpStack->Parameters.DeviceIoControl.OutputBufferLength; ! ! if (OutputBufferLength < sizeof(ULONG)) { status = STATUS_BUFFER_TOO_SMALL; break; *************** *** 263,274 **** KeAcquireSpinLock(pIoPortLocal->pIoLock, &oldIrql); ! modemControl = pIoPortLocal->modemControl & C0C_MCR_MASK; KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql); ! if (code == IOCTL_SERIAL_GET_DTRRTS) modemControl &= SERIAL_DTR_STATE | SERIAL_RTS_STATE; ! *(PULONG)pIrp->AssociatedIrp.SystemBuffer = modemControl; ! pIrp->IoStatus.Information = sizeof(ULONG); TraceIrp("FdoPortIoCtl", pIrp, &status, TRACE_FLAG_RESULTS); --- 283,318 ---- KeAcquireSpinLock(pIoPortLocal->pIoLock, &oldIrql); ! modemControl = pIoPortLocal->modemControl; KeReleaseSpinLock(pIoPortLocal->pIoLock, oldIrql); ! pSysBuf = (PUCHAR)pIrp->AssociatedIrp.SystemBuffer; ! ! if (code == IOCTL_SERIAL_GET_DTRRTS) { modemControl &= SERIAL_DTR_STATE | SERIAL_RTS_STATE; + } else { + ULONG InputBufferLength; ! InputBufferLength = pIrpStack->Parameters.DeviceIoControl.InputBufferLength; ! ! if (OutputBufferLength >= (sizeof(ULONG) + C0CE_SIGNATURE_SIZE) && ! InputBufferLength >= C0CE_SIGNATURE_SIZE && ! RtlEqualMemory(pSysBuf, C0CE_SIGNATURE, C0CE_SIGNATURE_SIZE)) ! { ! RtlCopyMemory(pSysBuf + sizeof(PULONG), C0CE_SIGNATURE, C0CE_SIGNATURE_SIZE); ! ! if (OutputBufferLength > (sizeof(ULONG) + C0CE_SIGNATURE_SIZE)) { ! RtlZeroMemory(pSysBuf + sizeof(ULONG) + C0CE_SIGNATURE_SIZE, ! OutputBufferLength - (sizeof(ULONG) + C0CE_SIGNATURE_SIZE)); ! } ! ! pIrp->IoStatus.Information = OutputBufferLength; ! } else { ! pIrp->IoStatus.Information = sizeof(ULONG); ! } ! ! modemControl &= C0C_MCR_MASK; ! } ! ! *(PULONG)pSysBuf = modemControl; TraceIrp("FdoPortIoCtl", pIrp, &status, TRACE_FLAG_RESULTS); |