📄 pcscctrl.cpp
字号:
cmdApdu.p2 = 0;
cmdApdu.p3 = (BYTE)(resApdu.len-2);
return DoAPDU((LPBYTE)&cmdApdu,5,resApdu.data,resApdu.len);
}
LONG CPcScCtrl::ReadBinary(UCHAR OffHi, UCHAR OffLo, RESAPDU &resApdu)
{
CMDAPDU cmdApdu;
cmdApdu.klass = SimCmd.Klass;
cmdApdu.inc = SimCmd.ReadBinary;
cmdApdu.p1 = OffHi;
cmdApdu.p2 = OffLo;
cmdApdu.p3 = (BYTE)(resApdu.len-2);
return DoAPDU((LPBYTE)&cmdApdu,5,resApdu.data,resApdu.len);
}
LONG CPcScCtrl::UpdateBinary(UCHAR OffHi, UCHAR OffLo, LPBYTE data, UCHAR len)
{
CMDAPDU cmdApdu;
cmdApdu.klass = SimCmd.Klass;
cmdApdu.inc = SimCmd.UpdateBinary;
cmdApdu.p1 = OffHi;
cmdApdu.p2 = OffLo;
cmdApdu.p3 = len;
memcpy(cmdApdu.data,data,len);
BYTE sw[2];
RESAPDU resApdu;
resApdu.data = sw;
resApdu.len = 2;
return DoAPDU((LPBYTE)&cmdApdu,5+len,resApdu.data,resApdu.len);
}
LONG CPcScCtrl::ReadRecord(UCHAR RecNo, UCHAR mode, RESAPDU &resApdu)
{
CMDAPDU cmdApdu;
cmdApdu.klass = SimCmd.Klass;
cmdApdu.inc = SimCmd.ReadRecord;
cmdApdu.p1 = RecNo;
cmdApdu.p2 = mode;
cmdApdu.p3 = (BYTE)(resApdu.len-2);
return DoAPDU((LPBYTE)&cmdApdu,5,resApdu.data,resApdu.len);
}
LONG CPcScCtrl::UpdateRecord(UCHAR RecNo, UCHAR mode, LPBYTE Rec, UCHAR len)
{
CMDAPDU cmdApdu;
cmdApdu.klass = SimCmd.Klass;
cmdApdu.inc = SimCmd.UpdateRecord;
cmdApdu.p1 = RecNo;
cmdApdu.p2 = mode;
cmdApdu.p3 = len;
memcpy(cmdApdu.data,Rec,len);
BYTE sw[2];
RESAPDU resApdu;
resApdu.data = sw;
resApdu.len = 2;
return DoAPDU((LPBYTE)&cmdApdu,5+len,resApdu.data,resApdu.len);
}
LONG CPcScCtrl::Seek(UCHAR mode, LPBYTE patten, UCHAR len,RESAPDU &resApdu)
{
CMDAPDU cmdApdu;
cmdApdu.klass = SimCmd.Klass;
cmdApdu.inc = SimCmd.Seek;
cmdApdu.p1 = 0;
cmdApdu.p2 = mode;
cmdApdu.p3 = len;
memcpy(cmdApdu.data,patten,len);
return DoAPDU((LPBYTE)&cmdApdu,5+len,resApdu.data,resApdu.len);
}
LONG CPcScCtrl::Increase(LPBYTE data, UCHAR len,RESAPDU &resApdu)
{
CMDAPDU cmdApdu;
cmdApdu.klass = SimCmd.Klass;
cmdApdu.inc = SimCmd.Increase;
cmdApdu.p1 = 0;
cmdApdu.p2 = 0;
cmdApdu.p3 = len;
memcpy(cmdApdu.data,data,len);
return DoAPDU((LPBYTE)&cmdApdu,5+len,resApdu.data,resApdu.len);
}
LONG CPcScCtrl::VerifyChv(UCHAR ChvNo, LPBYTE data, UCHAR len)
{
ASSERT(len == 8);
return DoChv(SimCmd.VerifyChv,ChvNo,data,len);
}
LONG CPcScCtrl::ChangeChv(UCHAR ChvNo, LPBYTE data, UCHAR len)
{
ASSERT(len == 16);
return DoChv(SimCmd.ChangeChv,ChvNo,data,len);
}
LONG CPcScCtrl::UnblockChv(UCHAR ChvNo, LPBYTE data, UCHAR len)
{
ASSERT(len == 16);
return DoChv(SimCmd.UnblockChv,ChvNo,data,len);
}
LONG CPcScCtrl::DisableChv(UCHAR ChvNo, LPBYTE data, UCHAR len)
{
ASSERT(len == 8);
return DoChv(SimCmd.DisableChv,ChvNo,data,len);
}
LONG CPcScCtrl::EnableChv(UCHAR ChvNo, LPBYTE data, UCHAR len)
{
ASSERT(len == 8);
return DoChv(SimCmd.EnableChv,ChvNo,data,len);
}
LONG CPcScCtrl::Invalidate()
{
CMDAPDU cmdApdu;
cmdApdu.klass = SimCmd.Klass;
cmdApdu.inc = SimCmd.Invalidate;
cmdApdu.p1 = 0;
cmdApdu.p2 = 0;
cmdApdu.p3 = 0;
BYTE sw[2];
RESAPDU resApdu;
resApdu.data = sw;
resApdu.len = 2;
return DoAPDU((LPBYTE)&cmdApdu,5,resApdu.data,resApdu.len);
}
LONG CPcScCtrl::Rehabilitate()
{
CMDAPDU cmdApdu;
cmdApdu.klass = SimCmd.Klass;
cmdApdu.inc = SimCmd.Rehabilitate;
cmdApdu.p1 = 0;
cmdApdu.p2 = 0;
cmdApdu.p3 = 0;
BYTE sw[2];
RESAPDU resApdu;
resApdu.data = sw;
resApdu.len = 2;
return DoAPDU((LPBYTE)&cmdApdu,5,resApdu.data,resApdu.len);
}
LONG CPcScCtrl::RunGsmAlgorithm(LPBYTE rnd, UCHAR len,RESAPDU &resApdu)
{
ASSERT(len == 16);
CMDAPDU cmdApdu;
cmdApdu.klass = SimCmd.Klass;
cmdApdu.inc = SimCmd.RunGsmAlgorithm;
cmdApdu.p1 = 0;
cmdApdu.p2 = 0;
cmdApdu.p3 = 16;
memcpy(cmdApdu.data,rnd,len);
return DoAPDU((LPBYTE)&cmdApdu,5+len,resApdu.data,resApdu.len);
}
LONG CPcScCtrl::GetResponse(RESAPDU &resApdu)
{
CMDAPDU cmdApdu;
cmdApdu.klass = SimCmd.Klass;
cmdApdu.inc = SimCmd.GetResponse;
cmdApdu.p1 = 0;
cmdApdu.p2 = 0;
cmdApdu.p3 = (BYTE)(resApdu.len - 2);
return DoAPDU((LPBYTE)&cmdApdu,5,resApdu.data,resApdu.len);
}
LONG CPcScCtrl::DoChv(UCHAR cmd, UCHAR ChvNo, LPBYTE data, UCHAR len)
{
CMDAPDU cmdApdu;
cmdApdu.klass = SimCmd.Klass;
cmdApdu.inc = cmd;
cmdApdu.p1 = 0;
cmdApdu.p2 = ChvNo;
cmdApdu.p3 = len;
memcpy(cmdApdu.data,data,len);
BYTE sw[2];
RESAPDU resApdu;
resApdu.data = sw;
resApdu.len = 2;
return DoAPDU((LPBYTE)&cmdApdu,5+len,resApdu.data,resApdu.len);
}
LONG CPcScCtrl::SCardControl(DWORD dwControlCode, LPCVOID lpInBuffer, DWORD nInBufferSize, LPVOID lpOutBuffer, DWORD nOutBufferSize, LPDWORD lpBytesReturned)
{
ULONG lReturn = ::SCardControl( hCard,
dwControlCode,
lpInBuffer,
nInBufferSize,
lpOutBuffer,
nOutBufferSize,
lpBytesReturned );
if ( SCARD_S_SUCCESS != lReturn )
TRACE("Failed SCardControl\n");
return lReturn;
}
LONG CPcScCtrl::SCardStatus(LPTSTR szReaderName, LPDWORD pcchReaderLen, LPDWORD pdwState, LPDWORD pdwProtocol, LPBYTE pbAtr, LPDWORD pcbAtrLen)
{
ULONG lReturn = ::SCardStatus(hCard,
szReaderName,
pcchReaderLen,
pdwState,
pdwProtocol,
pbAtr,
pcbAtrLen);
if ( SCARD_S_SUCCESS != lReturn )
{
TRACE("Failed SCardStatus\n");
}
return lReturn;
}
LONG CPcScCtrl::SCardGetAttrib(DWORD dwAttrId, LPBYTE pbAttr, LPDWORD pcbAttrLen)
{
LONG lReturn;
// Retrieve an attribute.
// hCardHandle was set by a previous call to SCardConnect.
lReturn = ::SCardGetAttrib(hCard,
dwAttrId,
pbAttr,
pcbAttrLen);
if ( SCARD_S_SUCCESS != lReturn )
{
TRACE("Failed SCardGetAttrib\n");
}
return lReturn;
}
LONG CPcScCtrl::SCardSetAttrib(DWORD dwAttrId, LPCBYTE pbAttr, DWORD cbAttrLen)
{
LONG lReturn;
// Retrieve an attribute.
// hCardHandle was set by a previous call to SCardConnect.
lReturn = ::SCardSetAttrib(hCard,
dwAttrId,
pbAttr,
cbAttrLen);
if ( SCARD_S_SUCCESS != lReturn )
{
TRACE("Failed SCardSetAttrib\n");
}
return lReturn;
}
CString CPcScCtrl::GetCardState()
{
if(hCard == NULL || m_asReaderNames.GetSize() == 0)
return _T("智能卡:不存在");
TCHAR szReader[200];
DWORD cch = 200;
BYTE bAttr[32];
DWORD cByte = 32;
DWORD dwState, dwProtocol;
LONG lReturn;
// Determine the status.
// hCardHandle was set by an earlier call to SCardConnect.
lReturn = ::SCardStatus(hCard,
szReader,
&cch,
&dwState,
&dwProtocol,
(LPBYTE)&bAttr,
&cByte);
if ( SCARD_S_SUCCESS != lReturn )
{
Helper::ShowLastError(lReturn);
return _T("智能卡:不存在");
}
// Examine retrieved status elements.
// Here, we'll look at the reader name and card state.
switch ( dwState )
{
case SCARD_ABSENT:
return _T("智能卡:不存在");
case SCARD_PRESENT:
return _T("智能卡:在读卡器中");
case SCARD_SWALLOWED:
return _T("智能卡:被吞吃");
case SCARD_POWERED:
return _T("智能卡:已加电");
case SCARD_NEGOTIABLE:
return _T("智能卡:协议未选定");
case SCARD_SPECIFIC:
{
CString str;
switch(dwProtocol)
{
case SCARD_PROTOCOL_UNDEFINED:
str = _T("(未定义)");
break;
case SCARD_PROTOCOL_T0:
str = _T("(T0)");
break;
case SCARD_PROTOCOL_T1:
str = _T("(T1)");
break;
case SCARD_PROTOCOL_RAW:
str = _T("(RAW)");
break;
}
return _T("智能卡:协议")+str;
}
}
return _T("智能卡:未知状态");
}
CString CPcScCtrl::FormatErrMsg(LONG errcode)
{
BYTE errseq[2] = { ((errcode >> 8) & 0xff), (errcode & 0xff) };
return FormatErrMsg(errseq);
}
CString CPcScCtrl::FormatErrMsg(BYTE errseq[])
{
for(int j=0; j< sizeof(C_response)/sizeof(C_response[0]); j++)
{
for(int i=sizeof(C_response[j].MASK)-1; i>=0; i--)
if (C_response[j].SW[i] != (C_response[j].MASK[i] & errseq[i]))
break;
if (i==-1)
{
CString str;
CString strsw;
strsw.Format("(%02x%02x)",errseq[0],errseq[1]);
str.Format(C_response[j].text, (int)errseq[1]);
return str+strsw;
}
}
return _T("Unknow error.");
}
LONG CPcScCtrl::EstablishContext()
{
LONG lResult = SCARD_S_SUCCESS;
if(hContext == NULL)
{
lResult = SCardEstablishContext(SCARD_SCOPE_USER,
NULL,
NULL,
&hContext);
}
return lResult;
}
LONG CPcScCtrl::ConnectCurCard()
{
if (m_asReaderNames.GetSize() == 0 || m_asReaderNames.GetSize() < m_nCurReader)
return -1;
if(hCard == NULL)
{
DWORD dwActiveProtocol;
//
// Connect to the card
//
LONG lResult = SCardConnect(hContext,
m_asReaderNames[m_nCurReader],
SCARD_SHARE_SHARED,
SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1,
&hCard,
&dwActiveProtocol);
if(lResult != SCARD_S_SUCCESS)
Helper::ShowLastError(lResult);
return lResult;
}
return 0;
}
LONG CPcScCtrl::DisconnectCurCard()
{
LONG lResult;
if(hCard)
{
lResult = SCardDisconnect(hCard, SCARD_LEAVE_CARD);
if(lResult != SCARD_S_SUCCESS)
Helper::ShowLastError(lResult);
hCard = NULL;
}
return lResult;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -