--- /dev/null
+// BcasCard.h: CBcasCard \83N\83\89\83X\82Ì\83C\83\93\83^\81[\83t\83F\83C\83X\r
+//\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+#pragma once\r
+\r
+
+#include <memory>\r
+#include <vector>\r
+#include <string>\r
+#include <winscard.h>\r
+\r
+\r
+using std::vector;\r
+using std::wstring;\r
+using std::string;\r
+\r
+\r
+// \83G\83\89\81[\83R\81[\83h\r
+#define BCEC_NOERROR 0x00000000UL // \83G\83\89\81[\82È\82µ\r
+#define BCEC_INTERNALERROR 0x00000001UL // \93à\95\94\83G\83\89\81[\r
+#define BCEC_NOTESTABLISHED 0x00000002UL // \83R\83\93\83e\83L\83X\83g\8am\97§\8e¸\94s\r
+#define BCEC_NOCARDREADERS 0x00000003UL // \83J\81[\83h\83\8a\81[\83_\82ª\82È\82¢\r
+#define BCEC_ALREADYOPEN 0x00000004UL // \8aù\82É\83I\81[\83v\83\93\8dÏ\82Ý\r
+#define BCEC_CARDOPENERROR 0x00000005UL // \83J\81[\83h\83I\81[\83v\83\93\8e¸\94s\r
+#define BCEC_CARDNOTOPEN 0x00000006UL // \83J\81[\83h\96¢\83I\81[\83v\83\93\r
+#define BCEC_TRANSMITERROR 0x00000007UL // \92Ê\90M\83G\83\89\81[\r
+#define BCEC_BADARGUMENT 0x00000008UL // \88ø\90\94\82ª\95s\90³\r
+#define BCEC_ECMREFUSED 0x00000009UL // ECM\8eó\95t\8b\91\94Û\r
+\r
+\r
+class CBcasCard\r
+{\r
+public:\r
+ CBcasCard();\r
+ ~CBcasCard();\r
+\r
+ const DWORD GetCardReaderNum(void) const;\r
+ LPCTSTR GetCardReaderName(const DWORD dwIndex = 0UL) const;\r
+\r
+ const bool OpenCard(LPCTSTR lpszReader = NULL);\r
+ void CloseCard(void);\r
+\r
+ const BYTE * GetBcasCardID(void);\r
+ const BYTE * GetInitialCbc(void);\r
+ const BYTE * GetSystemKey(void);\r
+ const BYTE * GetKsFromEcm(const BYTE *pEcmData, const DWORD dwEcmSize);\r
+\r
+ const DWORD GetLastError(void) const;\r
+\r
+protected:\r
+ const bool EnumCardReader(void);\r
+ const bool TransmitCommand(const BYTE *pSendData, const DWORD dwSendSize, BYTE *pRecvData, const DWORD dwMaxRecv, DWORD *pdwRecvSize = NULL);\r
+ const bool InitialSetting(void);\r
+\r
+ SCARDCONTEXT m_ScardContext;\r
+ SCARDHANDLE m_hBcasCard;\r
+\r
+ bool m_bIsEstablish;\r
+\r
+#ifdef _UNICODE \r
+ vector<wstring> m_CardReaderArray;\r
+#else\r
+ vector<string> m_CardReaderArray;\r
+#endif\r
+\r
+ struct TAG_BCASCARDINFO\r
+ {\r
+ BYTE BcasCardID[6]; // Card ID\r
+ BYTE SystemKey[32]; // Descrambling system key\r
+ BYTE InitialCbc[8]; // Descrambler CBC initial value\r
+ } m_BcasCardInfo;\r
+ \r
+ struct TAG_ECMSTATUS\r
+ {\r
+ DWORD dwLastEcmSize; // \8dÅ\8cã\82É\96â\82¢\8d\87\82í\82¹\82Ì\82 \82Á\82½ECM\83T\83C\83Y\r
+ BYTE LastEcmData[256]; // \8dÅ\8cã\82É\96â\82¢\8d\87\82í\82¹\82Ì\82 \82Á\82½ECM\83f\81[\83^\r
+ BYTE KsData[16]; // Ks Odd + Even \r
+ } m_EcmStatus;\r
+ \r
+ DWORD m_dwLastError;\r
+\r
+private:\r
+ const bool StoreEcmData(const BYTE *pEcmData, const DWORD dwEcmSize);\r
+};\r