/*++ 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