PcscCall.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #ifndef CPCSCCALL_H
  2. #define CPCSCCALL_H
  3. #include "public.h"
  4. typedef LONG SCARDCONTEXT;
  5. typedef LONG SCARDHANDLE;
  6. #define MAX_ATR_SIZE 33 /**< Maximum ATR size */
  7. #define SCARD_S_SUCCESS 0
  8. /* 说明:
  9. * 静态加载pcsc会造成函数冲突,必须改成动态加载
  10. * PCSC的DWORD定义为 unsigned long,实际为8字节,本系统定义的DWORD为标准4字节,定义不一致,必须更改函数声明的类型,原pcsc中DWORD相关定义均修改为ULONG
  11. */
  12. #define DATA_IN_ERROR -3
  13. #define STATE_ERROR -2
  14. #define STATE_NO_READER -1
  15. #define STATE_NO_CARD 0
  16. #define STATE_HAVE_CARD 1
  17. #define STATE_CONNECTED 2
  18. typedef struct
  19. {
  20. const char *szReader;
  21. void *pvUserData;
  22. ULONG dwCurrentState;
  23. ULONG dwEventState;
  24. ULONG cbAtr;
  25. unsigned char rgbAtr[MAX_ATR_SIZE];
  26. }
  27. SCARD_READERSTATE, *LPSCARD_READERSTATE;
  28. typedef struct
  29. {
  30. unsigned long dwProtocol; /**< Protocol identifier */
  31. unsigned long cbPciLength; /**< Protocol Control Inf Length */
  32. }
  33. SCARD_IO_REQUEST, *PSCARD_IO_REQUEST, *LPSCARD_IO_REQUEST;
  34. typedef LONG (*pSCardEstablishContext)(LONG, LPVOID, LPVOID, LONG*);
  35. typedef LONG (*pSCardListReaders)(LONG hContext, LPCSTR mszGroups, LPSTR mszReaders, ULONG* pcchReaders);
  36. typedef LONG (*pSCardCancel)(SCARDCONTEXT hContext);
  37. typedef LONG (*pSCardReleaseContext)(SCARDCONTEXT hContext);
  38. typedef LONG (*pSCardIsValidContext)(SCARDCONTEXT hContext);
  39. typedef LONG (*pSCardConnect)(SCARDCONTEXT hContext, LPCSTR szReader, ULONG dwShareMode, ULONG dwPreferredProtocols, SCARDHANDLE* phCard, ULONG* pdwActiveProtocol);
  40. typedef LONG (*pSCardDisconnect)(SCARDHANDLE hCard, ULONG dwDisposition);
  41. typedef LONG (*pSCardGetStatusChange)(SCARDCONTEXT hContext, ULONG dwTimeout, LPSCARD_READERSTATE rgReaderStates, ULONG cReaders);
  42. typedef LONG (*pSCardStatus)(SCARDHANDLE hCard, LPSTR mszReaderName, ULONG* pcchReaderLen, ULONG* pdwState, ULONG* pdwProtocol, LPBYTE pbAtr, ULONG* pcbAtrLen);
  43. typedef LONG (*pSCardTransmit)(SCARDHANDLE hCard, const SCARD_IO_REQUEST *pioSendPci, LPBYTE pbSendBuffer, ULONG cbSendLength, SCARD_IO_REQUEST *pioRecvPci, LPBYTE pbRecvBuffer, ULONG* pcbRecvLength);
  44. typedef LONG (*pSCardControl)(SCARDHANDLE hCard, ULONG dwControlCode, const VOID* pbSendBuffer, ULONG cbSendLength, VOID* pbRecvBuffer, ULONG cbRecvLength, ULONG* lpBytesReturned);
  45. class PcscCall
  46. {
  47. public:
  48. PcscCall();
  49. bool Load();
  50. bool Open(const char* sName);
  51. bool Close();
  52. int GetState();
  53. bool Connect(char* sATR, int& iLen);
  54. bool DicConnect();
  55. int ChipIO(const char* sIn, char* sOut);
  56. int SendCMD(const char* sIn, char* sOut);
  57. const char* GetErrInfo(){return m_sErrInfo;};
  58. protected:
  59. pSCardEstablishContext SCardEstablishContext;
  60. pSCardListReaders SCardListReaders;
  61. pSCardCancel SCardCancel;
  62. pSCardReleaseContext SCardReleaseContext;
  63. pSCardIsValidContext SCardIsValidContext;
  64. pSCardConnect SCardConnect;
  65. pSCardDisconnect SCardDisconnect;
  66. pSCardGetStatusChange SCardGetStatusChange;
  67. pSCardStatus SCardStatus;
  68. pSCardTransmit SCardTransmit;
  69. pSCardControl SCardControl;
  70. char m_sErrInfo[256];
  71. char m_sReadName[64];
  72. SCARDCONTEXT m_hContext;
  73. SCARDHANDLE m_hCurCard;
  74. ULONG m_APrtocol;
  75. };
  76. #endif // CPCSCCALL_H