|
|
//-------------------------------------------------------------------
// This is abstract class for generic device
// Specific devices should use it as a parent device
// Author: Sergey Ivanov
// Log:
// 08/11/99 - implemented
//-------------------------------------------------------------------
#ifndef __GEMCORE__
#define __GEMCORE__
#include "interface.h"
#include "rdrconfig.h"
// Reader max buffer size
#define READER_DATA_BUFFER_SIZE 255
// Tells that power command was used
#define GEMCORE_CARD_POWER 1
//
// DEFAULT_POWER_TIMEOUT defines the default power timout in ms.
//
#define GEMCORE_DEFAULT_POWER_TIMEOUT 750
#define GEMCORE_CARD_POWER_DOWN 0x11
#define GEMCORE_CARD_POWER_UP 0x12
#define GEMCORE_CARD_READ 0x13
#define GEMCORE_CARD_WRITE 0x14
#define GEMCORE_CARD_EXCHANGE 0x15
#define GEMCORE_DEFINE_CARD_TYPE 0x17
#define GEMCORE_GET_CARD_STATUS 0x17// Commands differs only by parameter...
#define GEMCORE_GET_FIRMWARE_VERSION "\x22\x05\x3F\xE0\x10"
#define GEMCORE_READER_SET_MODE 0x01
// Card configuration
#define ISO_CARD 0x02
#define TRANSPARENT_MODE_CARD 0xEF
#define DEFAULT_PRESENCE_DETECTION 0x0D
#define CARD_DEFAULT_VPP 0
#define CARD_VOLTAGE_5V 0
#define CARD_VOLTAGE_3V 1
#define CARD_DEFAULT_VOLTAGE CARD_VOLTAGE_5V
// PTS mode parameters
#define PTS_MODE_DEFAULT 0
#define PTS_MODE_DISABLED 1
#define PTS_MODE_OPTIMAL 2
#define PTS_MODE_MANUALLY 3
#define PTS_NEGOTIATE_PTS1 0x10
#define PTS_NEGOTIATE_PTS2 0x20
#define PTS_NEGOTIATE_PTS3 0x40
#define PTS_NEGOTIATE_T0 0x00
#define PTS_NEGOTIATE_T1 0x01
// - ICC_DEFAULT_POWER_TIMOUT defines the default power timout in ms.
#define ICC_DEFAULT_POWER_TIMOUT 750
#pragma PAGEDCODE
class CIoPacket;
class CGemCore : public CReaderInterface { public: NTSTATUS m_Status; SAFE_DESTRUCTORS(); private: ReaderConfig configuration; protected: CGemCore(){}; public: CGemCore(CProtocol* protocol) : CReaderInterface(protocol) { TRACE("Gemcore Reader Interface was created with protocol %x \n",protocol); // These values went from Gemcore portocol
// Lets leave it for now, but eventually we could
// redefine them creating Gemcore independent
// reader configuration
configuration.Type = ISO_CARD;//ISO_CARD (02)
configuration.PresenceDetection = DEFAULT_PRESENCE_DETECTION;//DEFAULT_PRESENCE_DETECTION (0D)
configuration.Voltage = CARD_DEFAULT_VOLTAGE; //CARD_DEFAULT_VOLTAGE;
configuration.PTSMode = PTS_MODE_DISABLED; //PTS_MODE_DISABLED;
configuration.PTS0 = 0; configuration.PTS1 = 0; configuration.PTS2 = 0; configuration.PTS3 = 0; configuration.Vpp = 0; //CARD_DEFAULT_VPP;
configuration.ActiveProtocol = 0;// Undefined
configuration.PowerTimeOut = GEMCORE_DEFAULT_POWER_TIMEOUT; m_Status = STATUS_SUCCESS; };
virtual ~CGemCore() { TRACE("GemCore Reader Interface %8.8lX was destroied...\n",this); };
virtual VOID dispose() { self_delete(); };
static CReaderInterface* create(CProtocol* protocol) { CReaderInterface* interface = new (NonPagedPool) CGemCore(protocol); if(!ALLOCATED_OK(interface)) { DISPOSE_OBJECT(interface); interface = NULL; } return interface; };
virtual NTSTATUS translateStatus( const BYTE ReaderStatus, const ULONG IoctlType);
virtual ULONG getReaderState(); virtual NTSTATUS getReaderVersion(PUCHAR pVersion, PULONG pLength); virtual NTSTATUS setReaderMode(ULONG mode); virtual NTSTATUS initialize();
// Reader interface functions...
virtual ReaderConfig getConfiguration(); virtual NTSTATUS setConfiguration(ReaderConfig configuration); virtual NTSTATUS setTransparentConfig(PSCARD_CARD_CAPABILITIES cardCapabilities, BYTE NewWtx); virtual VOID RestoreISOsetting(VOID); virtual NTSTATUS read(CIoPacket* Irp); virtual NTSTATUS write(CIoPacket* Irp); virtual NTSTATUS readAndWait(BYTE * pRequest,ULONG RequestLength,BYTE * pReply,ULONG* pReplyLength); virtual NTSTATUS writeAndWait(BYTE * pRequest,ULONG RequestLength,BYTE * pReply,ULONG* pReplyLength); virtual NTSTATUS ioctl(ULONG ControlCode,BYTE* pRequest,ULONG RequestLength,BYTE* pReply,ULONG* pReplyLength); virtual NTSTATUS SwitchSpeed(ULONG ControlCode,BYTE* pRequest,ULONG RequestLength,BYTE* pReply,ULONG* pReplyLength); virtual NTSTATUS VendorAttribute(ULONG ControlCode,BYTE* pRequest,ULONG RequestLength,BYTE* pReply,ULONG* pReplyLength); virtual NTSTATUS power(ULONG ControlCode,BYTE* pReply,ULONG* pReplyLength, BOOLEAN Specific); virtual NTSTATUS powerUp(BYTE* pReply,ULONG* pReplyLength); virtual NTSTATUS setProtocol(ULONG ProtocolRequested); virtual VOID cancel(); // Process smartcard requests according to reader capabilities
virtual NTSTATUS translate_request(BYTE * pRequest,ULONG RequestLength,BYTE * pReply,ULONG* pReplyLength, PSCARD_CARD_CAPABILITIES cardCapabilities, BYTE NewWtx); virtual NTSTATUS translate_response(BYTE * pRequest,ULONG RequestLength,BYTE * pReply,ULONG* pReplyLength); };
#endif
|