Leaked source code of windows server 2003
 
 
 
 
 
 

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