⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pcscctrl.cpp

📁 usblsccid-0.9.2: ED1x Smart Card Reader Driver
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -