175 lines
3.9 KiB
C
175 lines
3.9 KiB
C
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
//
|
||
|
// Copyright (C) SCM Microsystems, 1998 - 1999
|
||
|
//
|
||
|
// File: serialnt.h
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
#if !defined( __SERIAL_NT_H__ )
|
||
|
#define __SERIAL_NT_H__
|
||
|
|
||
|
#include "DriverNT.h"
|
||
|
#include <ntddser.h>
|
||
|
|
||
|
#include "SerialIF.h"
|
||
|
|
||
|
#define STC_BUFFER_SIZE 32
|
||
|
#define TPDU_STACK_SIZE 2048
|
||
|
|
||
|
typedef struct _SERIAL_PORT_CONFIG
|
||
|
{
|
||
|
SERIAL_HANDFLOW HandFlow; // flow control
|
||
|
SERIAL_CHARS SerialChars; // special characters
|
||
|
SERIAL_TIMEOUTS Timeouts; // read/write timeouts
|
||
|
SERIAL_BAUD_RATE BaudRate; // Baudrate for reader
|
||
|
SERIAL_LINE_CONTROL LineControl; // Stop bits, parity configuration
|
||
|
ULONG WaitMask, // notification events
|
||
|
Purge;
|
||
|
} SERIAL_PORT_CONFIG, *PSERIAL_PORT_CONFIG;
|
||
|
|
||
|
typedef struct _READER_EXTENSION
|
||
|
{
|
||
|
//
|
||
|
// serial port driver data
|
||
|
//
|
||
|
ULONG SerialPortNumber;
|
||
|
PDEVICE_OBJECT SerialDeviceObject;
|
||
|
PFILE_OBJECT SerialFileObject;
|
||
|
PIO_WORKITEM CloseSerial; // worker thread that closes the serial driver
|
||
|
|
||
|
// back pointer to smart card extension
|
||
|
PSMARTCARD_EXTENSION SmartcardExtension;
|
||
|
|
||
|
// read thread data
|
||
|
UCHAR IOData[ 2 * STC_BUFFER_SIZE ];
|
||
|
UCHAR TPDUStack[ TPDU_STACK_SIZE ];
|
||
|
ULONG Available;
|
||
|
ULONG Expected;
|
||
|
|
||
|
ULONG EventMask;
|
||
|
ULONG ReadTimeout; // read timeout in ms
|
||
|
|
||
|
IO_STATUS_BLOCK IoStatus;
|
||
|
KEVENT IoEvent;
|
||
|
KEVENT DataAvailable;
|
||
|
|
||
|
PIO_WORKITEM ReadWorkItem;
|
||
|
KSPIN_LOCK ReadSpinLock;
|
||
|
|
||
|
// miscellaneous
|
||
|
ULONG ReaderPowerState;
|
||
|
BOOLEAN PowerRequest;
|
||
|
UCHAR FirmwareMajor,
|
||
|
FirmwareMinor;
|
||
|
|
||
|
BOOLEAN CardPresent;
|
||
|
|
||
|
KEVENT SerialCloseDone; // signaled if the connection to the serial driver has been closed
|
||
|
|
||
|
} READER_EXTENSION, *PREADER_EXTENSION;
|
||
|
|
||
|
typedef enum _READER_POWER_STATE
|
||
|
{
|
||
|
PowerReaderUnspecified = 0,
|
||
|
PowerReaderWorking,
|
||
|
PowerReaderOff
|
||
|
} READER_POWER_STATE, *PREADER_POWER_STATE;
|
||
|
|
||
|
//
|
||
|
// CONSTANTS
|
||
|
//
|
||
|
#define SR_VENDOR_NAME "STCS"
|
||
|
#define SR_PRODUCT_NAME "Serial Reader"
|
||
|
//
|
||
|
// serial communication defines
|
||
|
//
|
||
|
#define SR_BAUD_RATE 115200
|
||
|
#define SR_STOP_BITS STOP_BIT_1
|
||
|
#define SR_PARITY NO_PARITY
|
||
|
#define SR_DATA_LENGTH SERIAL_DATABITS_8
|
||
|
//
|
||
|
// COM timeout values in ms
|
||
|
//
|
||
|
#define SR_READ_TOTAL_TIMEOUT_CONSTANT 2000
|
||
|
#define SR_READ_INTERVAL_TIMEOUT 2000
|
||
|
|
||
|
#define SR_WRITE_TOTAL_TIMEOUT_CONSTANT 2000
|
||
|
#define SR_WRITE_TOTAL_TIMEOUT_MULTIPLIER 0
|
||
|
|
||
|
#define SR_FLOW_REPLACE 0
|
||
|
#define SR_HAND_SHAKE 0
|
||
|
#define SR_XON_LIMIT 0
|
||
|
#define SR_XOFF_LIMIT 0
|
||
|
|
||
|
#define SR_ON_CHAR 0x11
|
||
|
#define SR_OFF_CHAR 0x13
|
||
|
|
||
|
#define SR_NOTIFICATION_EVENT ( SERIAL_EV_RXCHAR | SERIAL_EV_DSR )
|
||
|
|
||
|
#define SR_PURGE ( SERIAL_PURGE_RXCLEAR | SERIAL_PURGE_TXCLEAR )
|
||
|
|
||
|
//
|
||
|
// not clear, how these ctl codes are interpreted; the actual command is passed by the IrpStack.MajorFunction
|
||
|
//
|
||
|
#define SERIAL_READ SCARD_CTL_CODE( 0x1000 )
|
||
|
#define SERIAL_WRITE SCARD_CTL_CODE( 0x2000 )
|
||
|
|
||
|
//
|
||
|
// READ THREAD
|
||
|
//
|
||
|
#define RT_FINISH 0x00
|
||
|
#define RT_READ_HEAD 0x01
|
||
|
#define RT_READ_TAIL 0x02
|
||
|
#define RT_READ_MORE 0x03
|
||
|
#define RT_GET_MODEM_STATUS 0x04
|
||
|
#define RT_WAIT_EMPTY 0x05
|
||
|
#define RT_WAIT_DATA 0x06
|
||
|
|
||
|
NTSTATUS
|
||
|
IFReadThreadCallback(
|
||
|
PDEVICE_OBJECT DeviceObject,
|
||
|
PIRP Irp,
|
||
|
PREADER_EXTENSION ReaderExtension
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// LOCAL PROTOTYPES
|
||
|
//
|
||
|
NTSTATUS
|
||
|
IFSerialIoctl(
|
||
|
PREADER_EXTENSION ReaderExtension,
|
||
|
ULONG IoctlCode,
|
||
|
PVOID OutData,
|
||
|
ULONG OutDataLen,
|
||
|
PVOID InData,
|
||
|
ULONG InDataLen
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
IFSerialRead(
|
||
|
PREADER_EXTENSION ReaderExtension,
|
||
|
PUCHAR InData,
|
||
|
ULONG InDataLen
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
IFSerialWaitOnMask(
|
||
|
PREADER_EXTENSION ReaderExtension
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
IFReadWorkRoutine(
|
||
|
IN PDEVICE_OBJECT DeviceObject,
|
||
|
IN PREADER_EXTENSION ReaderExtension
|
||
|
);
|
||
|
|
||
|
|
||
|
#endif // !__SERIAL_NT_H__
|
||
|
|
||
|
|
||
|
//---------------------------------------- END OF FILE ----------------------------------------
|
||
|
|