📄 sccardinfo.cpp
字号:
BYTE ResData[255];
RESAPDU resApdu;
resApdu.data = ResData;
resApdu.len = sizeof(ResData);
CPcScCtrl &ScReader = ((CAgsm2Dlg *)(AfxGetApp()->m_pMainWnd))->m_SCReader;
try{
ScReader.m_bGetRes = FALSE;
ScReader.Select(0x3f00,resApdu);
resApdu.len = sizeof(ResData);
ScReader.Select(0x7f20,resApdu);
resApdu.len = sizeof(ResData);
ScReader.Select(0x6f46,resApdu);
ScReader.m_bGetRes = TRUE;
resApdu.len = 17 + 2;
ScReader.ReadBinary(0,0,resApdu);
CString str = Helper::Gsm11EncStrToCStr(ResData+1,16);
TRACE(_T("SPN:%s\n"),str);
int nItem = m_listInfo.GetItemCount();
m_listInfo.AddItem(nItem,0,_T("SPN"));
m_listInfo.AddItem(nItem,1,str);
m_listInfo.AddItem(nItem,2,_T("Service Provider Name"));
}catch(LONG e)
{
if((e & 0xfffff000) == 0x6000 || (e & 0xfffff000) == 0x9000)
;//AfxMessageBox(ScReader.FormatErrMsg(e));
else
Helper::ShowLastError(e);
}
}
void CScCardInfo::UpdateMF()
{
static LPCTSTR const ClockStopStr[] = {
_T("Clock stop not allow"),
_T("Clock stop not allowed,unless at low level"),
_T("Clock stop not allowed,unless at high level"),
_T(""),
_T("Clock stop allowed,no preferred level"),
_T("Clock stop allowed,low level preferred"),
_T("Clock stop allowed,high level preferred")
};
BYTE m_MFData[255];
RESAPDU resApdu;
resApdu.data = m_MFData;
resApdu.len = sizeof(m_MFData);
CPcScCtrl &ScReader = ((CAgsm2Dlg *)(AfxGetApp()->m_pMainWnd))->m_SCReader;
try{
ScReader.m_bGetRes = TRUE;
ScReader.Select(0x3f00,resApdu);
int nClockStopMode = ( ((m_MFData[13]&0x01) << 2) |
((m_MFData[13]&0x04) >> 1) |
((m_MFData[13]&0x08) >> 3)
);
int nNumOfDFs = m_MFData[14];
int nNumOfEFs = m_MFData[15];
int nNumOfChvs = m_MFData[16];
BOOL bCHV1Disabled = ((m_MFData[13] & 0x80) == 0x80);
BOOL bCHV1Initialised = ((m_MFData[18] & 0x80) == 0x80);
int nCHV1FalseRemains = (m_MFData[18] & 0xf);
BOOL bUnblock1Initialised = ((m_MFData[19] & 0x80) == 0x80);
int nUnblock1FalseRemains = (m_MFData[19] & 0xf);
BOOL bCHV2Initialised = ((m_MFData[20] & 0x80) == 0x80);
int nCHV2FalseRemains = (m_MFData[20] & 0xf);
BOOL bUnblock2Initialised = ((m_MFData[21] & 0x80) == 0x80);
int nUnblock2FalseRemains = (m_MFData[21] & 0xf);
int nItem = m_listInfo.GetItemCount();
m_listInfo.AddItem(nItem,0,_T("MF"));
CString str;
str.Format(_T("CHV1 %s"),bCHV1Disabled ? _T("Disabled") : _T("Enabled"));
m_listInfo.AddItem(nItem,1,str);
nItem++;
m_listInfo.AddItem(nItem,0,_T(""));
m_listInfo.AddItem(nItem,1,ClockStopStr[nClockStopMode]);
nItem++;
str.Format(_T("Number of DFs %d"),nNumOfDFs);
m_listInfo.AddItem(nItem,0,_T(""));
m_listInfo.AddItem(nItem,1,str);
nItem++;
str.Format(_T("Number of EFs %d"),nNumOfEFs);
m_listInfo.AddItem(nItem,0,_T(""));
m_listInfo.AddItem(nItem,1,str);
nItem++;
str.Format(_T("CHVs UNBLOCK CHVs length %d"),nNumOfChvs);
m_listInfo.AddItem(nItem,0,_T(""));
m_listInfo.AddItem(nItem,1,str);
nItem++;
str.Format(_T("CHV1 secret code %s,False presentations remaining %d"),
bCHV1Initialised ? _T("initialised") : _T("not initialised"),
nCHV1FalseRemains);
m_listInfo.AddItem(nItem,0,_T(""));
m_listInfo.AddItem(nItem,1,str);
nItem++;
str.Format(_T("UNBLOCK CHV1 secret code %s,False presentations remaining %d"),
bUnblock1Initialised ? _T("initialised") : _T("not initialised"),
nUnblock1FalseRemains);
m_listInfo.AddItem(nItem,0,_T(""));
m_listInfo.AddItem(nItem,1,str);
nItem++;
str.Format(_T("CHV2 secret code %s,False presentations remaining %d"),
bCHV2Initialised ? _T("initialised") : _T("not initialised"),
nCHV2FalseRemains);
m_listInfo.AddItem(nItem,0,_T(""));
m_listInfo.AddItem(nItem,1,str);
nItem++;
str.Format(_T("UNBLOCK CHV2 secret code %s,False presentations remaining %d"),
bUnblock2Initialised ? _T("initialised") : _T("not initialised"),
nUnblock2FalseRemains);
m_listInfo.AddItem(nItem,0,_T(""));
m_listInfo.AddItem(nItem,1,str);
}catch(LONG e)
{
if((e & 0xfffff000) == 0x6000 || (e & 0xfffff000) == 0x9000)
AfxMessageBox(ScReader.FormatErrMsg(e));
else
Helper::ShowLastError(e);
}
}
void CScCardInfo::UpdateKc()
{
BYTE ResData[255];
RESAPDU resApdu;
resApdu.data = ResData;
resApdu.len = sizeof(ResData);
CPcScCtrl &ScReader = ((CAgsm2Dlg *)(AfxGetApp()->m_pMainWnd))->m_SCReader;
try{
ScReader.m_bGetRes = FALSE;
ScReader.Select(0x3f00,resApdu);
resApdu.len = sizeof(ResData);
ScReader.Select(0x7f20,resApdu);
resApdu.len = sizeof(ResData);
ScReader.Select(0x6f20,resApdu);
ScReader.m_bGetRes = TRUE;
resApdu.len = 9 + 2;
ScReader.ReadBinary(0,0,resApdu);
LPSTR pStr = Helper::BinToHex(ResData, 9);
TRACE(_T("Kc:%s\n"),pStr);
int nItem = m_listInfo.GetItemCount();
m_listInfo.AddItem(nItem,0,_T("Kc"));
m_listInfo.AddItem(nItem,1,pStr);
m_listInfo.AddItem(nItem,2,_T("ciphering key Kc"));
free(pStr);
}catch(LONG e)
{
if((e & 0xfffff000) == 0x6000 || (e & 0xfffff000) == 0x9000)
AfxMessageBox(ScReader.FormatErrMsg(e));
else
Helper::ShowLastError(e);
}
}
void CScCardInfo::UpdatePLMNsel()
{
BYTE ResData[255];
RESAPDU resApdu;
resApdu.data = ResData;
resApdu.len = sizeof(ResData);
CPcScCtrl &ScReader = ((CAgsm2Dlg *)(AfxGetApp()->m_pMainWnd))->m_SCReader;
try{
ScReader.m_bGetRes = FALSE;
ScReader.Select(0x3f00,resApdu);
resApdu.len = sizeof(ResData);
ScReader.Select(0x7f20,resApdu);
ScReader.m_bGetRes = TRUE;
resApdu.len = sizeof(ResData);
ScReader.Select(0x6f30,resApdu);
int FileSize = (ResData[2]<<8)|ResData[3];
resApdu.len = FileSize + 2;
ScReader.ReadBinary(0,0,resApdu);
LPSTR pStr = Helper::BinToHex(ResData, FileSize);
TRACE(_T("PLMNsel:%s\n"),pStr);
int nItem = m_listInfo.GetItemCount();
m_listInfo.AddItem(nItem,0,_T("PLMNsel"));
m_listInfo.AddItem(nItem,1,pStr);
m_listInfo.AddItem(nItem,2,_T("PLMN selector"));
free(pStr);
ScReader.m_bGetRes = FALSE;
resApdu.len = sizeof(ResData);
ScReader.Select(0x6f31,resApdu);
resApdu.len = 1 + 2;
ScReader.ReadBinary(0,0,resApdu);
CString str;
str.Format(_T("%d"),ResData[0]);
TRACE(_T("HPLMN:%s\n"),str);
nItem++;
m_listInfo.AddItem(nItem,0,_T("HPLMN"));
m_listInfo.AddItem(nItem,1,str);
m_listInfo.AddItem(nItem,2,_T("HPLMN search period"));
}catch(LONG e)
{
if((e & 0xfffff000) == 0x6000 || (e & 0xfffff000) == 0x9000)
AfxMessageBox(ScReader.FormatErrMsg(e));
else
Helper::ShowLastError(e);
}
}
void CScCardInfo::UpdateACMmax()
{
BYTE ResData[255];
RESAPDU resApdu;
resApdu.data = ResData;
resApdu.len = sizeof(ResData);
CPcScCtrl &ScReader = ((CAgsm2Dlg *)(AfxGetApp()->m_pMainWnd))->m_SCReader;
try{
ScReader.m_bGetRes = FALSE;
ScReader.Select(0x3f00,resApdu);
resApdu.len = sizeof(ResData);
ScReader.Select(0x7f20,resApdu);
resApdu.len = sizeof(ResData);
ScReader.Select(0x6f37,resApdu);
resApdu.len = 3 + 2;
ScReader.ReadBinary(0,0,resApdu);
CString str;
str.Format(_T("%d"),(ResData[0] << 16) | (ResData[1] << 8) | ResData[2]);
int nItem = m_listInfo.GetItemCount();
m_listInfo.AddItem(nItem,0,_T("ACMmax"));
m_listInfo.AddItem(nItem,1,str);
m_listInfo.AddItem(nItem,2,_T("Maximum value of accumulated call meter"));
resApdu.len = sizeof(ResData);
ScReader.m_bGetRes = TRUE;
ScReader.Select(0x6f39,resApdu);
int FileSize = (ResData[2]<<8)|ResData[3];
int RecordLen = ResData[14];
int NumOfRecs = FileSize/RecordLen;
nItem++;
m_listInfo.AddItem(nItem,0,_T("ACM"));
m_listInfo.AddItem(nItem,2,_T("Accumulated call meter"));
resApdu.len = RecordLen + 2;
ScReader.ReadRecord(0,RRM_NextRecord,resApdu);
CString sstr;
sstr.Format(_T("%d"),(ResData[0] << 16) | (ResData[1] << 8) | ResData[2]);
for(int i=1; i<NumOfRecs; i++)
{
resApdu.len = RecordLen + 2;
ScReader.ReadRecord(0,RRM_NextRecord,resApdu);
str.Format(_T("%d"),(ResData[0] << 16) | (ResData[1] << 8) | ResData[2]);
sstr += _T(",");
sstr += str;
}
m_listInfo.AddItem(nItem,1,sstr);
}catch(LONG e)
{
if((e & 0xfffff000) == 0x6000 || (e & 0xfffff000) == 0x9000)
AfxMessageBox(ScReader.FormatErrMsg(e));
else
Helper::ShowLastError(e);
}
}
void CScCardInfo::UpdateSST()
{
static LPCTSTR SST[] = {
_T("CHV1 disable function"),
_T("Abbreviated Dialling Numbers"),
_T("Fixed Dialling Numbers"),
_T("Short Message Storage"),
_T("Advice of Charge"),
_T("Capability Configuration Parameters"),
_T("PLMN selector"),
_T("RFU"),
_T("MSISDN"),
_T("Extension1"),
_T("Extension2"),
_T("SMS Parameters"),
_T("Last Number Dialled"),
_T("Cell Broadcast Message Identifer"),
_T("Group Identifier Level 1"),
_T("Group Identifier Level 2"),
_T("Service Provider Name")
};
static LPCTSTR MinusPlus[] = {
_T("-"),
_T("+")
};
BYTE ResData[255];
RESAPDU resApdu;
resApdu.data = ResData;
resApdu.len = sizeof(ResData);
CPcScCtrl &ScReader = ((CAgsm2Dlg *)(AfxGetApp()->m_pMainWnd))->m_SCReader;
try{
ScReader.m_bGetRes = FALSE;
ScReader.Select(0x3f00,resApdu);
resApdu.len = sizeof(ResData);
ScReader.Select(0x7f20,resApdu);
resApdu.len = sizeof(ResData);
ScReader.Select(0x6f38,resApdu);
resApdu.len = 5 + 2;
ScReader.ReadBinary(0,0,resApdu);
int nItem = m_listInfo.GetItemCount();
m_listInfo.AddItem(nItem,0,_T("SST"));
m_listInfo.AddItem(nItem,1,"++(allocated activated)");
m_listInfo.AddItem(nItem,2,_T("SIM service table"));
CString str;
UCHAR a,b,s;
for(int i=0; i<sizeof(SST)/sizeof(SST[0]); i++)
{
nItem++;
m_listInfo.AddItem(nItem,0,_T(""));
m_listInfo.AddItem(nItem,2,_T(""));
str = SST[i];
str += _T(" ");
a = ResData[i/4];
s = (i%4)*2;
b = a>>s;
str += MinusPlus[b&1];
str += MinusPlus[(b&2)>>1];
m_listInfo.AddItem(nItem,1,str);
}
}catch(LONG e)
{
if((e & 0xfffff000) == 0x6000 || (e & 0xfffff000) == 0x9000)
AfxMessageBox(ScReader.FormatErrMsg(e));
else
Helper::ShowLastError(e);
}
}
void CScCardInfo::UpdatePUCT()
{
BYTE ResData[255];
RESAPDU resApdu;
resApdu.data = ResData;
resApdu.len = sizeof(ResData);
CPcScCtrl &ScReader = ((CAgsm2Dlg *)(AfxGetApp()->m_pMainWnd))->m_SCReader;
try{
ScReader.m_bGetRes = FALSE;
ScReader.Select(0x3f00,resApdu);
resApdu.len = sizeof(ResData);
ScReader.Select(0x7f20,resApdu);
resApdu.len = sizeof(ResData);
ScReader.Select(0x6f41,resApdu);
resApdu.len = 5 + 2;
ScReader.ReadBinary(0,0,resApdu);
LPSTR pStr = Helper::BinToHex(ResData, 5);
TRACE(_T("PUCT:%s\n"),pStr);
int nItem = m_listInfo.GetItemCount();
m_listInfo.AddItem(nItem,0,_T("PUCT"));
m_listInfo.AddItem(nItem,1,pStr);
m_listInfo.AddItem(nItem,2,_T("Price per unit and currency table"));
free(pStr);
nItem++;
ScReader.m_bGetRes = TRUE;
resApdu.len = sizeof(ResData);
ScReader.Select(0x6f45,resApdu);
int FileSize = (ResData[2]<<8)|ResData[3];
resApdu.len = FileSize + 2;
ScReader.ReadBinary(0,0,resApdu);
pStr = Helper::BinToHex(ResData, FileSize);
TRACE(_T("CBMI:%s\n"),pStr);
m_listInfo.AddItem(nItem,0,_T("CBMI"));
m_listInfo.AddItem(nItem,1,pStr);
m_listInfo.AddItem(nItem,2,_T("Cell broadcast message identifier selection"));
free(pStr);
nItem++;
ScReader.m_bGetRes = TRUE;
resApdu.len = sizeof(ResData);
ScReader.Select(0x6f74,resApdu);
FileSize = (ResData[2]<<8)|ResData[3];
resApdu.len = FileSize + 2;
ScReader.ReadBinary(0,0,resApdu);
pStr = Helper::BinToHex(ResData, FileSize);
TRACE(_T("BCCH:%s\n"),pStr);
m_listInfo.AddItem(nItem,0,_T("BCCH"));
m_listInfo.AddItem(nItem,1,pStr);
m_listInfo.AddItem(nItem,2,_T("Broadcast control channels"));
free(pStr);
nItem++;
ScReader.m_bGetRes = TRUE;
resApdu.len = sizeof(ResData);
ScReader.Select(0x6f78,resApdu);
FileSize = (ResData[2]<<8)|ResData[3];
resApdu.len = FileSize + 2;
ScReader.ReadBinary(0,0,resApdu);
pStr = Helper::BinToHex(ResData, FileSize);
TRACE(_T("ACC:%s\n"),pStr);
m_listInfo.AddItem(nItem,0,_T("ACC"));
m_listInfo.AddItem(nItem,1,pStr);
m_listInfo.AddItem(nItem,2,_T("Access control class"));
free(pStr);
nItem++;
ScReader.m_bGetRes = TRUE;
resApdu.len = sizeof(ResData);
ScReader.Select(0x6f7b,resApdu);
FileSize = (ResData[2]<<8)|ResData[3];
resApdu.len = FileSize + 2;
ScReader.ReadBinary(0,0,resApdu);
pStr = Helper::BinToHex(ResData, FileSize);
TRACE(_T("FPLMN:%s\n"),pStr);
m_listInfo.AddItem(nItem,0,_T("FPLMN"));
m_listInfo.AddItem(nItem,1,pStr);
m_listInfo.AddItem(nItem,2,_T("Forbidden PLMNs"));
free(pStr);
nItem++;
ScReader.m_bGetRes = TRUE;
resApdu.len = sizeof(ResData);
ScReader.Select(0x6f7e,resApdu);
FileSize = (ResData[2]<<8)|ResData[3];
resApdu.len = FileSize + 2;
ScReader.ReadBinary(0,0,resApdu);
pStr = Helper::BinToHex(ResData, FileSize);
TRACE(_T("LOCI:%s\n"),pStr);
m_listInfo.AddItem(nItem,0,_T("LOCI"));
m_listInfo.AddItem(nItem,1,pStr);
m_listInfo.AddItem(nItem,2,_T("Location information"));
free(pStr);
nItem++;
ScReader.m_bGetRes = TRUE;
resApdu.len = sizeof(ResData);
ScReader.Select(0x6fad,resApdu);
FileSize = (ResData[2]<<8)|ResData[3];
resApdu.len = FileSize + 2;
ScReader.ReadBinary(0,0,resApdu);
pStr = Helper::BinToHex(ResData, FileSize);
TRACE(_T("AD:%s\n"),pStr);
m_listInfo.AddItem(nItem,0,_T("AD"));
m_listInfo.AddItem(nItem,1,pStr);
m_listInfo.AddItem(nItem,2,_T("Administrative data"));
free(pStr);
}catch(LONG e)
{
if((e & 0xfffff000) == 0x6000 || (e & 0xfffff000) == 0x9000)
AfxMessageBox(ScReader.FormatErrMsg(e));
else
Helper::ShowLastError(e);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -