419 lines
9.0 KiB
419 lines
9.0 KiB
/*++
|
|
|
|
Copyright (c) 1990, 1991, 1992, 1993 Microsoft Corporation
|
|
|
|
Module Name :
|
|
|
|
serialp.h
|
|
|
|
Abstract:
|
|
|
|
Prototypes and macros that are used throughout the driver.
|
|
|
|
Author:
|
|
|
|
Anthony V. Ercolano September 26, 1991
|
|
|
|
Revision History:
|
|
--*/
|
|
#if !defined(SERIALP_H)
|
|
#define SERIALP_H
|
|
|
|
typedef NTSTATUS(*PSERIAL_START_ROUTINE) (IN PPORT_DEVICE_EXTENSION);
|
|
|
|
typedef VOID(*PSERIAL_GET_NEXT_ROUTINE)(IN PPORT_DEVICE_EXTENSION pPort,
|
|
IN PIRP *CurrentOpIrp,
|
|
IN PLIST_ENTRY QueueToProcess,
|
|
OUT PIRP *NewIrp,
|
|
IN BOOLEAN CompleteCurrent);
|
|
|
|
NTSTATUS SerialRead(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
|
|
|
|
NTSTATUS SerialStartRead(IN PPORT_DEVICE_EXTENSION pPort);
|
|
|
|
VOID SerialCompleteRead(IN PKDPC Dpc,
|
|
IN PVOID DeferredContext,
|
|
IN PVOID SystemContext1,
|
|
IN PVOID SystemContext2);
|
|
|
|
VOID SerialReadTimeout(IN PKDPC Dpc,
|
|
IN PVOID DeferredContext,
|
|
IN PVOID SystemContext1,
|
|
IN PVOID SystemContext2);
|
|
|
|
VOID SerialIntervalReadTimeout(IN PKDPC Dpc,
|
|
IN PVOID DeferredContext,
|
|
IN PVOID SystemContext1,
|
|
IN PVOID SystemContext2);
|
|
|
|
NTSTATUS SerialFlush(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
|
|
|
|
NTSTATUS SerialWrite(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
|
|
|
|
NTSTATUS SerialStartWrite(IN PPORT_DEVICE_EXTENSION pPort);
|
|
|
|
VOID SerialGetNextWrite(IN PPORT_DEVICE_EXTENSION pPort,
|
|
IN PIRP *CurrentOpIrp,
|
|
IN PLIST_ENTRY QueueToProcess,
|
|
IN PIRP *NewIrp,
|
|
IN BOOLEAN CompleteCurrent);
|
|
|
|
VOID SerialCompleteWrite(IN PKDPC Dpc,
|
|
IN PVOID DeferredContext,
|
|
IN PVOID SystemContext1,
|
|
IN PVOID SystemContext2);
|
|
|
|
BOOLEAN SerialProcessEmptyTransmit(IN PVOID Context);
|
|
|
|
VOID SerialWriteTimeout(IN PKDPC Dpc,
|
|
IN PVOID DeferredContext,
|
|
IN PVOID SystemContext1,
|
|
IN PVOID SystemContext2);
|
|
|
|
VOID SerialCommError(IN PKDPC Dpc,
|
|
IN PVOID DeferredContext,
|
|
IN PVOID SystemContext1,
|
|
IN PVOID SystemContext2);
|
|
|
|
NTSTATUS SerialCleanup(IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp);
|
|
|
|
NTSTATUS SerialCreateOpen(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
|
|
|
|
NTSTATUS SerialClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
|
|
|
|
BOOLEAN SerialSetDTR(IN PVOID Context);
|
|
|
|
BOOLEAN SerialClrDTR(IN PVOID Context);
|
|
|
|
BOOLEAN SerialSetRTS(IN PVOID Context);
|
|
|
|
BOOLEAN SerialClrRTS(IN PVOID Context);
|
|
|
|
BOOLEAN SerialSetChars(IN PVOID Context);
|
|
|
|
BOOLEAN SerialSetBaud(IN PVOID Context);
|
|
|
|
BOOLEAN SerialSetLineControl(IN PVOID Context);
|
|
|
|
|
|
|
|
BOOLEAN
|
|
SerialSetupNewHandFlow(
|
|
IN PPORT_DEVICE_EXTENSION pPort,
|
|
IN PSERIAL_HANDFLOW NewHandFlow
|
|
);
|
|
|
|
BOOLEAN SerialSetHandFlow(IN PVOID Context);
|
|
|
|
BOOLEAN SerialTurnOnBreak(IN PVOID Context);
|
|
|
|
BOOLEAN SerialTurnOffBreak(IN PVOID Context);
|
|
|
|
BOOLEAN SerialPretendXoff(IN PVOID Context);
|
|
|
|
BOOLEAN SerialPretendXon(IN PVOID Context);
|
|
|
|
|
|
|
|
|
|
VOID
|
|
SerialHandleReducedIntBuffer(
|
|
IN PPORT_DEVICE_EXTENSION pPort
|
|
);
|
|
|
|
VOID
|
|
SerialProdXonXoff(
|
|
IN PPORT_DEVICE_EXTENSION pPort,
|
|
IN BOOLEAN SendXon
|
|
);
|
|
|
|
NTSTATUS
|
|
SerialIoControl(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp
|
|
);
|
|
|
|
NTSTATUS
|
|
SerialStartMask(
|
|
IN PPORT_DEVICE_EXTENSION pPort
|
|
);
|
|
|
|
VOID
|
|
SerialCancelWait(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp
|
|
);
|
|
|
|
VOID
|
|
SerialCompleteWait(
|
|
IN PKDPC Dpc,
|
|
IN PVOID DeferredContext,
|
|
IN PVOID SystemContext1,
|
|
IN PVOID SystemContext2
|
|
);
|
|
|
|
VOID
|
|
SerialStartImmediate(
|
|
IN PPORT_DEVICE_EXTENSION pPort
|
|
);
|
|
|
|
VOID
|
|
SerialCompleteImmediate(
|
|
IN PKDPC Dpc,
|
|
IN PVOID DeferredContext,
|
|
IN PVOID SystemContext1,
|
|
IN PVOID SystemContext2
|
|
);
|
|
|
|
VOID
|
|
SerialTimeoutImmediate(
|
|
IN PKDPC Dpc,
|
|
IN PVOID DeferredContext,
|
|
IN PVOID SystemContext1,
|
|
IN PVOID SystemContext2
|
|
);
|
|
|
|
VOID
|
|
SerialTimeoutXoff(
|
|
IN PKDPC Dpc,
|
|
IN PVOID DeferredContext,
|
|
IN PVOID SystemContext1,
|
|
IN PVOID SystemContext2
|
|
);
|
|
|
|
VOID
|
|
SerialCompleteXoff(
|
|
IN PKDPC Dpc,
|
|
IN PVOID DeferredContext,
|
|
IN PVOID SystemContext1,
|
|
IN PVOID SystemContext2
|
|
);
|
|
|
|
NTSTATUS
|
|
SerialStartPurge(
|
|
IN PPORT_DEVICE_EXTENSION pPort
|
|
);
|
|
|
|
BOOLEAN
|
|
SerialPurgeInterruptBuff(
|
|
IN PVOID Context
|
|
);
|
|
|
|
NTSTATUS
|
|
SerialQueryInformationFile(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp
|
|
);
|
|
|
|
NTSTATUS
|
|
SerialSetInformationFile(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp
|
|
);
|
|
|
|
VOID
|
|
SerialKillAllReadsOrWrites(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PLIST_ENTRY QueueToClean,
|
|
IN PIRP *CurrentOpIrp
|
|
);
|
|
|
|
VOID
|
|
SerialGetNextIrp(
|
|
IN PPORT_DEVICE_EXTENSION pPort,
|
|
IN PIRP *CurrentOpIrp,
|
|
IN PLIST_ENTRY QueueToProcess,
|
|
OUT PIRP *NextIrp,
|
|
IN BOOLEAN CompleteCurrent
|
|
);
|
|
|
|
VOID
|
|
SerialTryToCompleteCurrent(
|
|
IN PPORT_DEVICE_EXTENSION pPort,
|
|
IN PKSYNCHRONIZE_ROUTINE SynchRoutine OPTIONAL,
|
|
IN KIRQL IrqlForRelease,
|
|
IN NTSTATUS StatusToUse,
|
|
IN PIRP *CurrentOpIrp,
|
|
IN PLIST_ENTRY QueueToProcess,
|
|
IN PKTIMER IntervalTimer,
|
|
IN PKTIMER TotalTimer,
|
|
IN PSERIAL_START_ROUTINE Starter,
|
|
IN PSERIAL_GET_NEXT_ROUTINE GetNextIrp,
|
|
IN LONG RefType
|
|
);
|
|
|
|
NTSTATUS
|
|
SerialStartOrQueue(
|
|
IN PPORT_DEVICE_EXTENSION pPort,
|
|
IN PIRP Irp,
|
|
IN PLIST_ENTRY QueueToExamine,
|
|
IN PIRP *CurrentOpIrp,
|
|
IN PSERIAL_START_ROUTINE Starter
|
|
);
|
|
|
|
VOID
|
|
SerialCancelQueued(
|
|
PDEVICE_OBJECT DeviceObject,
|
|
PIRP Irp
|
|
);
|
|
|
|
NTSTATUS
|
|
SerialCompleteIfError(
|
|
PDEVICE_OBJECT DeviceObject,
|
|
PIRP Irp
|
|
);
|
|
|
|
ULONG
|
|
SerialHandleModemUpdate(
|
|
IN PPORT_DEVICE_EXTENSION pPort,
|
|
IN BOOLEAN DoingTX
|
|
);
|
|
|
|
BOOLEAN
|
|
SerialISR(
|
|
IN PKINTERRUPT InterruptObject,
|
|
IN PVOID Context
|
|
);
|
|
|
|
BOOLEAN
|
|
SerialDispatchISR(
|
|
IN PKINTERRUPT InterruptObject,
|
|
IN PVOID Context
|
|
);
|
|
|
|
NTSTATUS
|
|
SerialGetDivisorFromBaud(
|
|
IN ULONG ClockRate,
|
|
IN LONG DesiredBaud,
|
|
OUT PSHORT AppropriateDivisor
|
|
);
|
|
|
|
|
|
VOID SerialUnload(IN PDRIVER_OBJECT DriverObject);
|
|
|
|
BOOLEAN SerialReset(IN PVOID Context);
|
|
|
|
BOOLEAN ApplyInitialPortSettings(IN PVOID Context);
|
|
|
|
|
|
BOOLEAN SerialPerhapsLowerRTS(IN PVOID Context);
|
|
|
|
|
|
|
|
VOID
|
|
SerialStartTimerLowerRTS(
|
|
IN PKDPC Dpc,
|
|
IN PVOID DeferredContext,
|
|
IN PVOID SystemContext1,
|
|
IN PVOID SystemContext2
|
|
);
|
|
|
|
VOID
|
|
SerialInvokePerhapsLowerRTS(
|
|
IN PKDPC Dpc,
|
|
IN PVOID DeferredContext,
|
|
IN PVOID SystemContext1,
|
|
IN PVOID SystemContext2
|
|
);
|
|
|
|
|
|
VOID SerialCleanupDevice(IN PPORT_DEVICE_EXTENSION pPort);
|
|
|
|
UCHAR SerialProcessLSR(IN PPORT_DEVICE_EXTENSION pPort);
|
|
|
|
LARGE_INTEGER SerialGetCharTime(IN PPORT_DEVICE_EXTENSION pPort);
|
|
|
|
|
|
BOOLEAN
|
|
SerialSharerIsr(
|
|
IN PKINTERRUPT InterruptObject,
|
|
IN PVOID Context
|
|
);
|
|
|
|
BOOLEAN
|
|
SerialMarkClose(
|
|
IN PVOID Context
|
|
);
|
|
|
|
VOID
|
|
SerialPutChar(
|
|
IN PPORT_DEVICE_EXTENSION pPort,
|
|
IN UCHAR CharToPut
|
|
);
|
|
|
|
VOID SerialGetProperties(
|
|
IN PPORT_DEVICE_EXTENSION pPort,
|
|
IN PSERIAL_COMMPROP Properties
|
|
);
|
|
|
|
|
|
BOOLEAN SerialGetStats(IN PVOID Context);
|
|
|
|
BOOLEAN SerialClearStats(IN PVOID Context);
|
|
|
|
|
|
|
|
typedef struct _SERIAL_UPDATE_CHAR
|
|
{
|
|
PPORT_DEVICE_EXTENSION pPort;
|
|
ULONG CharsCopied;
|
|
BOOLEAN Completed;
|
|
|
|
} SERIAL_UPDATE_CHAR,*PSERIAL_UPDATE_CHAR;
|
|
|
|
//
|
|
// The following simple structure is used to send a pointer
|
|
// the device extension and an ioctl specific pointer
|
|
// to data.
|
|
//
|
|
typedef struct _SERIAL_IOCTL_SYNC
|
|
{
|
|
PPORT_DEVICE_EXTENSION pPort;
|
|
PVOID Data;
|
|
|
|
} SERIAL_IOCTL_SYNC,*PSERIAL_IOCTL_SYNC;
|
|
|
|
//
|
|
// The following three macros are used to initialize, set
|
|
// and clear references in IRPs that are used by
|
|
// this driver. The reference is stored in the fourth
|
|
// argument of the irp, which is never used by any operation
|
|
// accepted by this driver.
|
|
//
|
|
|
|
#define SERIAL_REF_ISR (0x00000001)
|
|
#define SERIAL_REF_CANCEL (0x00000002)
|
|
#define SERIAL_REF_TOTAL_TIMER (0x00000004)
|
|
#define SERIAL_REF_INT_TIMER (0x00000008)
|
|
#define SERIAL_REF_XOFF_REF (0x00000010)
|
|
#define SERIAL_REF_COMPLETING (0x00000020)
|
|
|
|
|
|
|
|
#define SERIAL_INIT_REFERENCE(Irp) { \
|
|
ASSERT(sizeof(LONG) <= sizeof(PVOID)); \
|
|
IoGetCurrentIrpStackLocation((Irp))->Parameters.Others.Argument4 = NULL; \
|
|
}
|
|
|
|
#define SERIAL_SET_REFERENCE(Irp,RefType) \
|
|
do { \
|
|
LONG _refType = (RefType); \
|
|
PLONG _arg4 = (PVOID)&IoGetCurrentIrpStackLocation((Irp))->Parameters.Others.Argument4; \
|
|
ASSERT(!(*_arg4 & _refType)); \
|
|
*_arg4 |= _refType; \
|
|
} while (0)
|
|
|
|
#define SERIAL_CLEAR_REFERENCE(Irp,RefType) \
|
|
do { \
|
|
LONG _refType = (RefType); \
|
|
PLONG _arg4 = (PVOID)&IoGetCurrentIrpStackLocation((Irp))->Parameters.Others.Argument4; \
|
|
ASSERT(*_arg4 & _refType); \
|
|
*_arg4 &= ~_refType; \
|
|
} while (0)
|
|
|
|
#define SERIAL_REFERENCE_COUNT(Irp) \
|
|
((LONG)((IoGetCurrentIrpStackLocation((Irp))->Parameters.Others.Argument4)))
|
|
|
|
|
|
#endif // End SERIALP_H
|