windows-nt/Source/XPSP1/NT/net/irda/comm/ircomm/internal.h
2020-09-26 16:20:57 +08:00

323 lines
5.3 KiB
C

#define INITGUID
#include <wdm.h>
#include <ntddser.h>
#include <irenum.h>
#include "queue.h"
#include <ircommdbg.h>
#include <vuart.h>
#define INPUT_BUFFER_SIZE (8092)
typedef struct _READ_STATE {
PACKET_QUEUE Queue;
PIRP CurrentIrp;
ULONG IrpRefCount;
BOOLEAN IrpShouldBeCompleted;
BOOLEAN IrpShouldBeCompletedWithAnyData;
BOOLEAN RefusedDataIndication;
KTIMER IntervalTimer;
KDPC IntervalTimerDpc;
BOOLEAN IntervalTimerSet;
KTIMER TotalTimer;
KDPC TotalTimerDpc;
BOOLEAN TotalTimerSet;
BOOLEAN DtrState;
KSPIN_LOCK ReadLock;
ULONG BytesInBuffer;
PUCHAR NextFilledByte;
PUCHAR NextEmptyByte;
LONG BytesRead;
ULONG IntervalTimeOut;
UCHAR InputBuffer[INPUT_BUFFER_SIZE];
} READ_STATE, *PREAD_STATE;
typedef struct _WRITE_STATE {
PACKET_QUEUE Queue;
LONG BytesWritten;
} WRITE_STATE, *PWRITE_STATE;
typedef struct _MASK_STATE {
PACKET_QUEUE Queue;
ULONG CurrentMask;
ULONG HistoryMask;
PIRP CurrentWaitMaskIrp;
KSPIN_LOCK Lock;
} MASK_STATE, *PMASK_STATE;
typedef struct _UART_STATE {
PACKET_QUEUE Queue;
} UART_STATE, *PUART_STATE;
typedef struct _FDO_DEVICE_EXTENSION {
PDEVICE_OBJECT DeviceObject;
PDEVICE_OBJECT Pdo;
PDEVICE_OBJECT LowerDevice;
BOOLEAN Removing;
BOOLEAN Removed;
LONG OpenCount;
IRDA_HANDLE ConnectionHandle;
UNICODE_STRING InterfaceName;
ULONG DeviceAddress;
KSPIN_LOCK SpinLock;
SERIAL_TIMEOUTS TimeOuts;
SERIAL_QUEUE_SIZE QueueSizes;
SERIAL_CHARS SerialChars;
SERIAL_HANDFLOW HandFlow;
ULONG MaxSendSize;
WRITE_STATE Write;
MASK_STATE Mask;
UART_STATE Uart;
READ_STATE Read;
} FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION;
#define READ_PURGE_CLEAR_BUFFER 0
#define READ_PURGE_ABORT_IRP 1
VOID
WriteStartRoutine(
PVOID Context,
PIRP Irp
);
VOID
MaskStartRoutine(
PVOID Context,
PIRP Irp
);
VOID
UartStartRoutine(
PVOID Context,
PIRP Irp
);
NTSTATUS
IrCommAddDevice(
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT Pdo
);
NTSTATUS
IrCommPnP(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
IrCommPower(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
IrCommWmi(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
//
// util fucntions
//
#define LEAVE_NEXT_AS_IS FALSE
#define COPY_CURRENT_TO_NEXT TRUE
NTSTATUS
WaitForLowerDriverToCompleteIrp(
PDEVICE_OBJECT TargetDeviceObject,
PIRP Irp,
BOOLEAN CopyCurrentToNext
);
NTSTATUS
ForwardIrp(
PDEVICE_OBJECT NextDevice,
PIRP Irp
);
NTSTATUS
GetRegistryKeyValue (
IN PDEVICE_OBJECT Pdo,
IN ULONG DevInstKeyType,
IN PWCHAR KeyNameString,
IN PVOID Data,
IN ULONG DataLength
);
NTSTATUS
IrCommHandleSymbolicLink(
PDEVICE_OBJECT Pdo,
PUNICODE_STRING InterfaceName,
BOOLEAN Create
);
NTSTATUS
QueryPdoInformation(
PDEVICE_OBJECT Pdo,
ULONG InformationType,
PVOID Buffer,
ULONG BufferLength
);
VOID
DumpBuffer(
PUCHAR Data,
ULONG Length
);
//
// io dispatch
//
NTSTATUS
IrCommCreate(
PDEVICE_OBJECT DeviceObject,
PIRP Irp
);
NTSTATUS
IrCommClose(
PDEVICE_OBJECT DeviceObject,
PIRP Irp
);
NTSTATUS
IrCommWrite(
PDEVICE_OBJECT DeviceObject,
PIRP Irp
);
NTSTATUS
IrCommCleanup(
PDEVICE_OBJECT DeviceObject,
PIRP Irp
);
NTSTATUS
IrCommQueryInformation(
PDEVICE_OBJECT DeviceObject,
PIRP Irp
);
NTSTATUS
IrCommRead(
PDEVICE_OBJECT DeviceObject,
PIRP Irp
);
NTSTATUS
IrCommDeviceControl(
PDEVICE_OBJECT DeviceObject,
PIRP Irp
);
NTSTATUS
DataAvailibleHandler(
PVOID Context,
PUCHAR Buffer,
ULONG BytesAvailible,
PULONG BytesUsed
);
VOID
ReadStartRoutine(
PVOID Context,
PIRP Irp
);
VOID
IntervalTimeProc(
PKDPC Dpc,
PVOID Context,
PVOID SystemParam1,
PVOID SystemParam2
);
VOID
TotalTimerProc(
PKDPC Dpc,
PVOID Context,
PVOID SystemParam1,
PVOID SystemParam2
);
VOID
EventHandler(
PVOID Context,
UCHAR PI,
UCHAR PL,
PUCHAR PV
);
VOID
ReadPurge(
PFDO_DEVICE_EXTENSION DeviceExtension,
ULONG Flags
);
VOID
EventNotification(
PFDO_DEVICE_EXTENSION DeviceExtension,
ULONG SerialEvent
);
VOID
CleanupIoRequests(
PFDO_DEVICE_EXTENSION DeviceExtension
);