// требует установки diCurr bool BreakConnect(void) { bool fAlt = ((diLast.ibPort != diCurr.ibPort) || (diLast.ibPhone != diCurr.ibPhone)); if (fAlt == 1) { SaveDisplay(); ShowPort(diCurr.ibPort); ShowLo(szBreakConnect); DelayInf(); LoadDisplay(); } // QueResult(bRES_BREAKCONNECT, (uchar)fAlt); return(fAlt); }
NTSTATUS FdoPortPnp( IN PC0C_FDOPORT_EXTENSION pDevExt, IN PIRP pIrp) { NTSTATUS status; PIO_STACK_LOCATION pIrpStack = IoGetCurrentIrpStackLocation(pIrp); ULONG minorFunction = pIrpStack->MinorFunction; PDEVICE_OBJECT pLowDevObj = pDevExt->pLowDevObj; // IRP_MN_REMOVE_DEVICE deletes *pDevExt! status = STATUS_SUCCESS; switch (minorFunction) { case IRP_MN_QUERY_DEVICE_RELATIONS: { LIST_ENTRY queueToComplete; KIRQL oldIrql; PC0C_IO_PORT pIoPort = pDevExt->pIoPortLocal; if ((pIoPort->exclusiveMode && pIoPort->isOpen) || (pIoPort->plugInMode && !pIoPort->pIoPortRemote->isOpen)) { HidePort(pDevExt); } else { ShowPort(pDevExt); } /* complete pending CLOSE IRPs */ InitializeListHead(&queueToComplete); KeAcquireSpinLock(pIoPort->pIoLock, &oldIrql); FdoPortIo(C0C_IO_TYPE_CLOSE_COMPLETE, NULL, pIoPort, &pIoPort->irpQueues[C0C_QUEUE_CLOSE], &queueToComplete); KeReleaseSpinLock(pIoPort->pIoLock, oldIrql); FdoPortCompleteQueue(&queueToComplete); break; } case IRP_MN_QUERY_REMOVE_DEVICE: if (pDevExt->openCount) status = STATUS_DEVICE_BUSY; else pIrp->IoStatus.Status = STATUS_SUCCESS; break; case IRP_MN_REMOVE_DEVICE: RemoveFdoPort(pDevExt); pDevExt = NULL; pIrp->IoStatus.Status = STATUS_SUCCESS; break; case IRP_MN_START_DEVICE: case IRP_MN_STOP_DEVICE: case IRP_MN_QUERY_STOP_DEVICE: case IRP_MN_CANCEL_STOP_DEVICE: case IRP_MN_SURPRISE_REMOVAL: pIrp->IoStatus.Status = STATUS_SUCCESS; break; } if (status == STATUS_SUCCESS) { IoSkipCurrentIrpStackLocation(pIrp); status = IoCallDriver(pLowDevObj, pIrp); TraceCode((PC0C_COMMON_EXTENSION)pDevExt, "PNP ", codeNameTablePnp, minorFunction, &status); } else { TraceIrp("PNP", pIrp, &status, TRACE_FLAG_RESULTS); pIrp->IoStatus.Status = status; IoCompleteRequest(pIrp, IO_NO_INCREMENT); } return status; }
// разъединение с каналом (требует установки diCurr) bool Disconnect(void) { uchar i; bool fResult; fResult = 0; ibPort = diCurr.ibPort; ShowPort(diCurr.ibPort); ShowLo(szDisconnect); DelayInf(); for (i=0; i<MaxRepeatsFixed(); i++) { // переход из состояния hook on // QueResult(bRES_MODEMESCAPE, i); DelayOff(); QueryModemEscape(); if (ModInputOK(3) == 1) break; if (fKey == true) return(0); // переход из состояния hook off // QueResult(bRES_MODEMHOOKOFF, i); DelayOff(); QueryModemHookOff(); if (ModInputOK(1) == 1) break; if (fKey == true) return(0); } if (i == MaxRepeatsFixed()) ; else { ShowLo(szEscapeOK); DelayInf(); mpcwEscape[diCurr.ibPort]++; } for (i=0; i<MaxRepeatsFixed(); i++) { // QueResult(bRES_MODEMHOOKOFF, i); DelayOff(); QueryModemHookOff(); if (ModInputOK(1) == 1) break; if (fKey == true) return(0); } if (i == MaxRepeatsFixed()) ; else { fResult = 1; ShowLo(szHookOffOK); DelayInf(); mpcwHookOff[diCurr.ibPort]++; } ModemDTROff(); mpcwDTROff[diCurr.ibPort]++; fConnect = 0; return(fResult); }
// соединение с каналом (требует установки diCurr) bool Connect(void) { uchar i; fConnect = 0; ibPort = diCurr.ibPort; if (StreamPort(diCurr.ibPort) == 0) return(0); if (diCurr.ibPhone == 0) return(1); if (mpboEnblCan[ibDig] == false) { ShowLo(szBlockingAll); DelayInf(); return(1); } ShowPort(diCurr.ibPort); ShowLo(szConnect); DelayInf(); for (i=0; i<MaxRepeatsFixed(); i++) { // QueResult(bRES_MODEMBAUD, i); DelayOff(); QueryModemBaud(1); if (ModInputOK(1) == 1) break; if (fKey == true) return(0); } if (i == MaxRepeatsFixed()) ; else { ShowLo(szBaudOK); DelayInf(); mpcwBaud[diCurr.ibPort]++; } for (i=0; i<MaxRepeatsFixed(); i++) { // QueResult(bRES_MODEMCOMMON, i); DelayOff(); QueryModemCommon(1); if (ModInputOK(1) == 1) break; if (fKey == true) return(0); if (i > 0) // переход из состояния hook on { DelayOff(); QueryModemEscape(); if (ModInputOK(3) == 1) ; if (fKey == true) return(0); DelayOff(); QueryModemHookOff(); if (ModInputOK(1) == 1) ; if (fKey == true) return(0); } } if (i == MaxRepeatsFixed()) return(0); ShowLo(szCommonOK); DelayInf(); mpcwCommon[diCurr.ibPort]++; if (boCustomModem == true) { for (i=0; i<MaxRepeatsFixed(); i++) { // QueResult(bRES_MODEMCUSTOM, i); DelayOff(); QueryModemCustom(); if (ModInputOK(1) == 1) break; if (fKey == true) return(0); } if (i == MaxRepeatsFixed()) return(0); ShowLo(szCustomOK); DelayInf(); mpcwCustom[diCurr.ibPort]++; } for (i=0; i<MaxRepeatsFixed(); i++) { // QueResult(bRES_MODEMCONNECT, i); DelayOff(); fConnect = 1; QueryModemConnect(); if ((ModInput(bMaxConnect,1) == SER_POSTANSWER_MODEM) && (ShowModemConnect() == 1)) break; if (fKey == true) return(0); } if (i == MaxRepeatsFixed()) return(0); cbWaitOnline = 0; mpcwConnect[diCurr.ibPort]++; return(1); }