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

📄 257-262.html

📁 Smart Card Developer s Kit, a smart card manual for development, English
💻 HTML
字号:
<!-- Edit EirGrabber 3.01 -->
<HTML>
<HEAD>
<TITLE>Smart Card Developer's Kit:The FlexCash Card: An E-commerce Smart Card Application</TITLE>



<CENTER>
<TABLE BORDER>
<TR>
<TD><A HREF="255-257.html">Previous</A></TD>
<TD><A HREF="../ewtoc.html">Table of Contents</A></TD>
<TD><A HREF="262-265.html">Next</A></TD>
</TR>
</TABLE>
</CENTER>
<P><BR></P>
</P>
<P><B>Listing 11.2.</B> The FlexCash card browser and editor program.</P>
<PRE>
BYTE data[100], reply[100];
char string[100];
HRESULT hresult;
WORD wSW;
CString cString;
void UpdatePurseDisplay();
DWORD ApplicationFlag = 0;

void CFlexCashDlg::OnGetvalues()
&#123;
    UpdatePurseDisplay();
&#125;

void CFlexCashDlg::OnCashloyalty()
&#123;
        DWORD amount;
        BYTE bpDecLoyalty[] = &#123;0xE1, 0x02, 0x00, 0x03&#125;;

        m_LoyaltyCash.GetWindowText(cString);
        sscanf((LPCTSTR)cString, "%2d", &#38;amount);
        bpDecLoyalty[3] = (BYTE)amount;

        hresult = SendCardMessage(bpDecLoyalty, (BYTE)0x04);
        GetSW(&#38;wSW);
        sprintf(string, "[%04x]", wSW);
        m_editScardStatus.SetWindowText(string);
&#125;

void CFlexCashDlg::UpdatePurseDisplay()
&#123;
    BYTE bpGetValues[]    = &#123;0xE1, 0x00, 0x00, 0x00&#125;;

    hresult =
        ExchangeCardMessage(bpGetValues, (BYTE)0x04, reply, 0x04);

    if (FAILED(hresult))
        throw (hresult);
    else &#123;
        sprintf(string, "%3d", reply[1]);
        m_PStatus.SetWindowText(string);
        sprintf(string, "%3d", reply[2]);
        m_BStatus.SetWindowText(string);
        sprintf(string, "%3d", reply[3]);
        m_VStatus.SetWindowText(string);
        sprintf(string, "%3d", reply[0]);
        m_SStatus.SetWindowText(string);

        GetSW(&#38;wSW);
        sprintf(string, "[%04x] %02x %02x %02x %02x %02x",
        wSW, reply[0], reply[1], reply[2], reply[3], reply[4]);
        m_editScardStatus.SetWindowText(string);
    &#125;
&#125;

void CFlexCashDlg::OnPerformcommand()
&#123;
    int iCurrentSelection = m_CommandList.GetCurSel();
    WORD wSW, wOffset;
    DWORD dwFileId, dwBytes;
    BYTE key[8] = &#123;0xad, 0x9f, 0x61, 0xfe, 0xfa, 0x20, 0xce, 0x63&#125;;

    try &#123;
        switch (iCurrentSelection) &#123;
        case 0: // Create File
            m_editScardStatus.SetWindowText(
                    "[xxxx] Create File not supported.");
            break;
        case 1: // Execute
            hresult = Execute((WORD)0x2222, (BYTE)0x08);

            if (FAILED(hresult))
                throw (hresult);
            else &#123;
                GetSW(&#38;wSW);
                sprintf(string,
                         "[%04x] Boot File Set to 0x2222.");
                m_editScardStatus.SetWindowText(string);
            &#125;
            break;
        case 2: // Exchange Message
            m_CommandArg.GetWindowText(cString);
            sscanf((LPCTSTR)cString, "%2x%2x%2x%2x%2x",
                &#38;data[0],&#38;data[1],&#38;data[2],&#38;data[3],&#38;data[4]);
            hresult =
                  ExchangeCardMessage(data, (BYTE)0x04, reply, data[4]);

            if (FAILED(hresult))
                throw (hresult);
            else &#123;
                GetSW(&#38;wSW);
                sprintf(string, "[%04x] %02x %02x %02x %02x",
                wSW, reply[0], reply[1], reply[2], reply[3]);
                m_editScardStatus.SetWindowText(string);
            &#125;

            break;
        case 3: // Read Binary
            m_CommandArg.GetWindowText(cString);
            sscanf((LPCTSTR)cString, "%d", &#38;wOffset);
            hresult = ReadBinary(reply, wOffset, (BYTE)0x08);

            if (FAILED(hresult))
                throw (hresult);
            else &#123;
                GetSW(&#38;wSW);
                sprintf(string, "[%04x] %02x %02x %02x
%02x %02x %02x %02x %02x",
                wSW, reply[0], reply[1], reply[2], reply[3],
                    reply[4], reply[5], reply[6], reply[7]);
                m_editScardStatus.SetWindowText(string);
            &#125;
            break;
        case 4: // Select Master File (3F00)
            hresult = SelectFile((WORD)0x3F00);

            if (FAILED(hresult))
                throw (hresult);
            else &#123;
                GetSW(&#38;wSW);
                sprintf(string,
                          "[%04x] Master File Selected", wSW);
                m_editScardStatus.SetWindowText(string);
            &#125;
            break;
        case 5: // Select File
            m_CommandArg.GetWindowText(cString);
            sscanf((LPCTSTR)cString, "%x", &#38;dwFileId);
            hresult = SelectFile((WORD)dwFileId);

            if (FAILED(hresult))
                throw (hresult);
            else &#123;
                GetSW(&#38;wSW);
                sprintf(string, "[%04x] File Selected", wSW);
                m_editScardStatus.SetWindowText(string);
            &#125;
            break;
        case 6: // Set Default ATR
            m_CommandArg.GetWindowText(cString);
            dwBytes = cString.GetLength();
            CopyMemory(data, (LPCSTR)cString, dwBytes);

            hresult = SetDefaultATR(data, (BYTE)dwBytes);

            if (FAILED(hresult))
                throw (hresult);
            else &#123;
                GetSW(&#38;wSW);
                sprintf(string, "[%04x] ATR Set.", wSW);
                m_editScardStatus.SetWindowText(string);
            &#125;
            break;
        case 7: // Verify Key

            hresult = VerifyKey((BYTE)0x00, key, (BYTE)0x08);

            if (FAILED(hresult))
                throw (hresult);
            else &#123;
                GetSW(&#38;wSW);
                sprintf(string, "[%04x] Key Verified.", wSW);
                m_editScardStatus.SetWindowText(string);
            &#125;
            break;
        case 8: // Write Binary
            m_CommandArg.GetWindowText(cString);
            dwBytes = sscanf((LPCTSTR)cString,
                          "%2x%2x%2x%2x%2x%2x%2x%2x",
               &#38;data[0],&#38;data[1],&#38;data[2],&#38;data[3],
               &#38;data[4],&#38;data[5],&#38;data[6],&#38;data[7]);

            hresult = WriteBinary(data, (WORD)0, (BYTE)dwBytes);

            if (FAILED(hresult))
                throw (hresult);
            else &#123;
                GetSW(&#38;wSW);
                sprintf(string, "[%04x] Data Written.", wSW);
                m_editScardStatus.SetWindowText(string);
            &#125;
            break;
        default:
            break;
        &#125;;
    &#125;

    catch (HRESULT) &#123;
        GetSW(&#38;wSW);
        sprintf(string, "[%02x/%08x]", wSW, hresult);
        FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, hresult,
                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                &#38;string[strlen(string)], 100, NULL);
        m_editScardStatus.SetWindowText(string);
    &#125;
&#125;

void CFlexCashDlg::OnBecomeFlexCash()
&#123;
    BYTE key[8] = &#123;0xad, 0x9f, 0x61, 0xfe, 0xfa, 0x20, 0xce, 0x63&#125;;

       DO(VerifyKey((BYTE)0x00, key, (BYTE)0x08))
    &#38;&#38; DO(Execute((WORD)0x2222, (BYTE)0x08))
    &#38;&#38; DO(ResetCard());

    sprintf(string, "[%08x] FlexCash Card Activated.", hresult);
    m_editScardStatus.SetWindowText(string);
&#125;

void CFlexCashDlg::OnBecomeJavaCard()
&#123;
    BYTE bpBecomeJavaCard[] = &#123;0xE0, 0x00, 0x00, 0x00&#125;;

       DO(SendCardMessage(bpBecomeJavaCard, (BYTE)0x04))
    &#38;&#38; DO(ResetCard());

    sprintf(string, "[%08x] Java Card Activated.", hresult);
    m_editScardStatus.SetWindowText(string);
&#125;

void CFlexCashDlg::OnReset()
&#123;
    hresult = ResetCard();
    sprintf(string, "[%08x] Card Reset.", hresult);
    m_editScardStatus.SetWindowText(string);
&#125;
void CFlexCashDlg::OnChangecard()
&#123;

    BYTE bpSetApplication[] = &#123;0xE1, 0x04, 0x00, 0x00&#125;;
    char *ecash[] = &#123;"Monitor", "E-Coins", "E-Bucks", "E-Money"&#125;;

    bpSetApplication[3] = (BYTE)m_CardType.GetCurSel();
    hresult = SendCardMessage(bpSetApplication, (BYTE)0x04);

    m_CurrentApp.SetWindowText(ecash[bpSetApplication[3]]);

    GetSW(&#38;wSW);
    sprintf(string, "[%04x] Card Set to App %d", wSW,
             (DWORD)bpSetApplication[3]);
    m_editScardStatus.SetWindowText(string);
&#125;

void CFlexCashDlg::OnSpendecash()
&#123;
        DWORD amount;
        BYTE bpSpendECash[] = &#123;0xE2, 0x00, 0x00, 0x00&#125;;

        m_ECashAmount.GetWindowText(cString);
        sscanf((LPCTSTR)cString, "%2d", &#38;amount);
        bpSpendECash[2] = (BYTE)ApplicationFlag;
        bpSpendECash[3] = (BYTE)amount;

        hresult = SendCardMessage(bpSpendECash, (BYTE)0x04);

        GetSW(&#38;wSW);
        sprintf(string, "[%04x]", wSW);
        m_editScardStatus.SetWindowText(string);
&#125;
</PRE>
<P><BR></P>
<CENTER>
<TABLE BORDER>
<TR>
<TD><A HREF="255-257.html">Previous</A></TD>
<TD><A HREF="../ewtoc.html">Table of Contents</A></TD>
<TD><A HREF="262-265.html">Next</A></TD>
</TR>
</TABLE>
</CENTER>



</BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -