00001
00002
00004
00005 #pragma warning( disable : 4290)
00006
00007 #if !defined(AFX_SCARDCONNECTION_H__E82E75E1_713F_4831_B8A1_ED8BDD7F5F32__INCLUDED_)
00008 #define AFX_SCARDCONNECTION_H__E82E75E1_713F_4831_B8A1_ED8BDD7F5F32__INCLUDED_
00009
00010 #if _MSC_VER > 1000
00011 #pragma once
00012 #endif // _MSC_VER > 1000
00013 #include "USCAPI.h"
00014 #include <winscard.h>
00015
00016 #define MAX_READER_NAME 256
00017
00018 #define ENCODE_SW1SW2(sw1, sw2) (sw1*256 + sw2)
00019 #define SW1(val) (HIBYTE(val))
00020 #define SW2(val) (LOBYTE(val))
00021
00022 #define PCSC_OK(val) (HIWORD(val) == 0xFFFF)
00023 #define APDU_OK(val) (((SW1(val) == 0x90) || (SW1(val) == 0x91) || (SW1(val) == 0x9F) || (SW1(val) == 0x61)))
00024
00025 namespace USCAPI
00026 {
00027
00029 class USCAPI_API CCommandAPDU
00030 {
00031 public:
00033 BYTE cla;
00035 BYTE ins;
00037 BYTE p1;
00039 BYTE p2;
00040
00041 union
00042 {
00044 BYTE lc;
00046 BYTE p3;
00047 };
00048
00049
00051 BYTE pbtData[1000];
00053 BYTE le;
00054
00056 CCommandAPDU();
00058 CCommandAPDU(BYTE _cla, BYTE _ins, BYTE _p1, BYTE _p2, BYTE _p3_le);
00060 CCommandAPDU(BYTE _cla, BYTE _ins, BYTE _p1, BYTE _p2, BYTE _p3_lc, BYTE* _pbtData);
00062 CCommandAPDU(BYTE _cla, BYTE _ins, BYTE _p1, BYTE _p2, BYTE _lc, BYTE* _pbtData, BYTE _le);
00064 CCommandAPDU(BYTE* _pbtData, BYTE len);
00065
00067 long getAPDU(BYTE* pbtAPDU, int* pLen) const;
00068
00070 void setData(BYTE* pbtData, int len);
00071 };
00072
00074 class USCAPI_API CResponseAPDU
00075 {
00076 public:
00078 BYTE sw1;
00080 BYTE sw2;
00082 BYTE pbData[256];
00084 BYTE dataLen;
00085
00087 CResponseAPDU(BYTE sw1, BYTE sw2, BYTE* data, BYTE datalen);
00089 CResponseAPDU(){};
00090
00092 BOOL success();
00093
00095 short SW1SW2();
00096 };
00097
00099 typedef struct USCAPI_API ATR
00100 {
00101 ATR()
00102 {
00103 nLen = 40;
00104 }
00105
00106 BYTE btATR[40];
00107 unsigned long nLen;
00108 };
00109
00111 class USCAPI_API CSmartCardConnection
00112 {
00113 friend class CSmartCardManager;
00114
00115 public:
00116
00117 virtual ~CSmartCardConnection();
00118
00120 long beginTransaction();
00121
00123 long endTransaction();
00124
00126 LPCSTR getReaderName();
00127
00129 long send(IN const CCommandAPDU& apdu, CResponseAPDU* pResponse);
00131 long send(IN const BYTE* pbtApdu, int nApduLen, CResponseAPDU* pResponse);
00132
00134 const ATR& getATR() const;
00135
00137 DWORD getProtocol();
00138
00140 bool isSmartCardPresent();
00141
00142 protected:
00143
00145 static CSmartCardConnection* openConnection(SCARDCONTEXT hContext, LPCSTR lpszReaderName, DWORD dwSharedMode, DWORD dwProtocol);
00147 static long closeConnection(IN CSmartCardConnection* connection, bool bReset = false);
00148
00149 private:
00150 CSmartCardConnection(SCARDCONTEXT hContext, SCARDHANDLE hCard, LPCSTR lpszReaderName, DWORD dwSharedMode, DWORD dwProtocol, ATR& atr);
00151
00152 char m_szReaderName[MAX_READER_NAME];
00153 SCARDHANDLE m_hCard;
00154 SCARDCONTEXT m_hContext;
00155 DWORD m_dwProtocol;
00156 DWORD m_dwSharedMode;
00157 ATR m_atr;
00158
00159 CSmartCardManager* m_pscMan;
00160 };
00161
00162 }
00163 #endif // !defined(AFX_SCARDCONNECTION_H__E82E75E1_713F_4831_B8A1_ED8BDD7F5F32__INCLUDED_)