#ifndef CPCSCCALL_H #define CPCSCCALL_H #include "public.h" typedef LONG SCARDCONTEXT; typedef LONG SCARDHANDLE; #define MAX_ATR_SIZE 33 /**< Maximum ATR size */ #define SCARD_S_SUCCESS 0 /* 说明: * 静态加载pcsc会造成函数冲突,必须改成动态加载 * PCSC的DWORD定义为 unsigned long,实际为8字节,本系统定义的DWORD为标准4字节,定义不一致,必须更改函数声明的类型,原pcsc中DWORD相关定义均修改为ULONG */ #define DATA_IN_ERROR -3 #define STATE_ERROR -2 #define STATE_NO_READER -1 #define STATE_NO_CARD 0 #define STATE_HAVE_CARD 1 #define STATE_CONNECTED 2 typedef struct { const char *szReader; void *pvUserData; ULONG dwCurrentState; ULONG dwEventState; ULONG cbAtr; unsigned char rgbAtr[MAX_ATR_SIZE]; } SCARD_READERSTATE, *LPSCARD_READERSTATE; typedef struct { unsigned long dwProtocol; /**< Protocol identifier */ unsigned long cbPciLength; /**< Protocol Control Inf Length */ } SCARD_IO_REQUEST, *PSCARD_IO_REQUEST, *LPSCARD_IO_REQUEST; typedef LONG (*pSCardEstablishContext)(LONG, LPVOID, LPVOID, LONG*); typedef LONG (*pSCardListReaders)(LONG hContext, LPCSTR mszGroups, LPSTR mszReaders, ULONG* pcchReaders); typedef LONG (*pSCardCancel)(SCARDCONTEXT hContext); typedef LONG (*pSCardReleaseContext)(SCARDCONTEXT hContext); typedef LONG (*pSCardIsValidContext)(SCARDCONTEXT hContext); typedef LONG (*pSCardConnect)(SCARDCONTEXT hContext, LPCSTR szReader, ULONG dwShareMode, ULONG dwPreferredProtocols, SCARDHANDLE* phCard, ULONG* pdwActiveProtocol); typedef LONG (*pSCardDisconnect)(SCARDHANDLE hCard, ULONG dwDisposition); typedef LONG (*pSCardGetStatusChange)(SCARDCONTEXT hContext, ULONG dwTimeout, LPSCARD_READERSTATE rgReaderStates, ULONG cReaders); typedef LONG (*pSCardStatus)(SCARDHANDLE hCard, LPSTR mszReaderName, ULONG* pcchReaderLen, ULONG* pdwState, ULONG* pdwProtocol, LPBYTE pbAtr, ULONG* pcbAtrLen); typedef LONG (*pSCardTransmit)(SCARDHANDLE hCard, const SCARD_IO_REQUEST *pioSendPci, LPBYTE pbSendBuffer, ULONG cbSendLength, SCARD_IO_REQUEST *pioRecvPci, LPBYTE pbRecvBuffer, ULONG* pcbRecvLength); typedef LONG (*pSCardControl)(SCARDHANDLE hCard, ULONG dwControlCode, const VOID* pbSendBuffer, ULONG cbSendLength, VOID* pbRecvBuffer, ULONG cbRecvLength, ULONG* lpBytesReturned); class PcscCall { public: PcscCall(); bool Load(); bool Open(const char* sName); bool Close(); int GetState(); bool Connect(char* sATR, int& iLen); bool DicConnect(); int ChipIO(const char* sIn, char* sOut); int SendCMD(const char* sIn, char* sOut); const char* GetErrInfo(){return m_sErrInfo;}; protected: pSCardEstablishContext SCardEstablishContext; pSCardListReaders SCardListReaders; pSCardCancel SCardCancel; pSCardReleaseContext SCardReleaseContext; pSCardIsValidContext SCardIsValidContext; pSCardConnect SCardConnect; pSCardDisconnect SCardDisconnect; pSCardGetStatusChange SCardGetStatusChange; pSCardStatus SCardStatus; pSCardTransmit SCardTransmit; pSCardControl SCardControl; char m_sErrInfo[256]; char m_sReadName[64]; SCARDCONTEXT m_hContext; SCARDHANDLE m_hCurCard; ULONG m_APrtocol; }; #endif // CPCSCCALL_H