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

📄 test.cpp

📁 Skeleton for implementing a Windows PC/SC Smartcard Reader.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
            if (pmszReaders)
            {
               dwReturn = SCardListReaders(hSC, NULL, pmszReaders, &dwLength);
               //at least two first readers in the system will be shown
               VASSERT(dwReturn == SCARD_S_SUCCESS);
               switch (dwReturn)
               {
               case SCARD_E_NO_READERS_AVAILABLE:
                  {
                     printf("Reader is not in groups.\n");
                     break;
                  }
               case SCARD_S_SUCCESS:
                  {
                     printf("List of inroduced readers :\n");
                     pReader = pmszReaders;
                     VASSERT(pReader);
                     while ('\0' != *pReader)
                     {  // Display the value.
                        if (strstr(pReader,chWork_Reader) != NULL)
                        {
                           bOurReaderIsInstalled = true;
                        }
                        printf("\tReader: %s\n", pReader);
                        // Advance to the next value.
                        pReader = pReader + strlen(pReader) + 1;
                        VASSERT(pReader);
                     }
                     break;
                  }
               default:
                  printf("Failed SCardListReaders, error %#X\n",dwReturn);
                  break;
               }
               //let's check if our reader is in the list of installed readers
               if (bOurReaderIsInstalled == true)
               {
                  printf("Reader %s was found\n",chWork_Reader);
                  pmszCards = NULL;
                  // Retrieve the list of cards.
                  dwLength = 0; 
                  if (((dwReturn = SCardListCards(NULL, NULL, NULL, NULL, 
                     (LPTSTR)pmszCards, &dwLength)) == SCARD_S_SUCCESS) &&
                     (dwLength > 0))
                  {
                     if ((pmszCards =(LPTSTR)malloc(dwLength+2)) != NULL)
                     {
                        if ((dwReturn = SCardListCards(NULL, NULL, NULL, NULL, 
                           (LPTSTR)pmszCards, &dwLength)) == SCARD_S_SUCCESS)
                        {
                           VASSERT(pmszCards != NULL);
                           VASSERT(dwLength != 0);
                           pCard = pmszCards;
                           printf("List of inroduced Smartcards :\n");
                           while ('\0' != *pCard)
                           {
                              // Display the value.
                              printf("\t%s\n", pCard);
                              pCard = pCard + strlen(pCard) + 1;
                              VASSERT(pCard != NULL);
                           }
                           // Connect to the reader.  hSC is a SCARDCONTEXT, previously set by 
                           // a call to SCardEstablishContext.
                           // I will point our pseudo reader DIRECTLY
                           // Our card support T0 ISO 7816 protocol ONLY
                           VASSERT(hSC != NULL);
                           if ((dwReturn = SCardConnect(hSC, (LPCSTR)chWork_Reader, 
                              SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0, &hCardHandle, 
                              &dwAP)) == SCARD_S_SUCCESS)
                           {
                              VASSERT(hCardHandle != NULL);
                              if (dwAP == SCARD_PROTOCOL_T0)
                              { // Let's get SC attributes
                                 VAS_VERIFY(GetAttr(SCARD_ATTR_VENDOR_NAME, "SCARD_ATTR_VENDOR_NAME") == SCARD_S_SUCCESS);
                                 VAS_VERIFY(GetAttr(SCARD_ATTR_DEVICE_FRIENDLY_NAME, "SCARD_ATTR_DEVICE_FRIENDLY_NAME") == SCARD_S_SUCCESS);
                                 VAS_VERIFY(GetAttr(SCARD_ATTR_ICC_PRESENCE, "SCARD_ATTR_ICC_PRESENCE", false) == SCARD_S_SUCCESS);
                                 VAS_VERIFY(GetAttr(SCARD_ATTR_ICC_TYPE_PER_ATR, "SCARD_ATTR_ICC_TYPE_PER_ATR", false) == SCARD_S_SUCCESS);
                                 VAS_VERIFY(GetAttr(SCARD_ATTR_MAX_CLK, "SCARD_ATTR_MAX_CLK", false) == SCARD_S_SUCCESS);
                                 ZeroMemory(bRecv, sizeof(bRecv));
                                 // Let's prepare header accordingly to ISO 7816 for SELECT operation
                                 _CmdBytes.bCla = 0xA0;
                                 _CmdBytes.bIns = 0xA4;
                                 _CmdBytes.bP1 = 0;
                                 _CmdBytes.bP2 = 0;
                                 _CmdBytes.bP3 = 0;
                                 dwSend = sizeof(_CmdBytes) - 1;
                                 dwRecv = 2;
                                 if ((dwReturn = SCardTransmit(hCardHandle, SCARD_PCI_T0, (PUCHAR)&_CmdBytes, dwSend,
                                    NULL, bRecv, &dwRecv)) == SCARD_S_SUCCESS)
                                 {
                                    printf("Status of operation SELECT : %#X%02X\n",bRecv[0],bRecv[1]);
                                    // Let's prepare header accordingly to ISO 7816 for WRITE_BINARY operation
                                    ZeroMemory(bRecv, sizeof(bRecv));
                                    ZeroMemory(bSend, sizeof(bSend));
                                    _CmdBytes.bCla = 0x00;
                                    _CmdBytes.bIns = 0xD0;
                                    _CmdBytes.bP1 = 0;
                                    _CmdBytes.bP2 = 0;
                                    _CmdBytes.bP3 = LOBYTE(LOWORD(strlen(pmszTest_Data)));
                                    dwRecv = 2;
                                    dwSend = sizeof(_CmdBytes) + _CmdBytes.bP3;
                                    // Let's prepare output array         
                                    VAS_VERIFY(memcpy(bSend, &_CmdBytes, sizeof(_CmdBytes)) != NULL);
                                    VAS_VERIFY(memcpy((PCHAR)&bSend[5], pmszTest_Data, _CmdBytes.bP3));
                                    if ((dwReturn = SCardTransmit(hCardHandle, SCARD_PCI_T0, (PUCHAR)bSend,
                                       dwSend, NULL, bRecv, &dwRecv)) == SCARD_S_SUCCESS)
                                    {
                                       printf("Status of operation WRITE BINARY : %#X%02X\n",bRecv[0],bRecv[1]);
                                       // Let's prepare header accordingly to ISO 7816 for READ_BINARY operation
                                       ZeroMemory(bRecv, sizeof(bRecv));
                                       _CmdBytes.bCla = 0x00;
                                       _CmdBytes.bIns = 0xB0;
                                       _CmdBytes.bP1 = 0;
                                       _CmdBytes.bP2 = 0;
                                       _CmdBytes.bP3 = LOBYTE(LOWORD(strlen(pmszTest_Data)));
                                       dwRecv = _CmdBytes.bP3 + 2;
                                       dwSend = sizeof(_CmdBytes);
                                       if ((dwReturn = SCardTransmit(hCardHandle, SCARD_PCI_T0, (PUCHAR)&_CmdBytes, dwSend,
                                          NULL, bRecv, &dwRecv)) == SCARD_S_SUCCESS)
                                       {
                                          printf("Status of operation READ BINARY : %#X%02X\n",bRecv[dwRecv - 2],bRecv[dwRecv - 1]);                                 
                                          printf("\tReturned data  of operation READ BINARY as a string: %s\n", bRecv);
                                          if (dwRecv < 2) 
                                             printf(" UKNOWN !!!\n");
                                          else
                                          {
                                             printf("\tReturned data  of operation READ BINARY as a HEX: ");
                                             for (dwTemp = 0; dwTemp < dwRecv; dwTemp++)
                                             {
                                                printf("%02X", bRecv[dwTemp]);
                                             }
                                             printf("\n");
                                          }
                                       }
                                       else
                                          printf("Failed SCardTransmit, command : READ_BINARY, error %#X\n",dwReturn);
                                    }
                                    else
                                       printf("Failed SCardTransmit, command : WRITE_BINARY, error %#X\n",dwReturn);
                                 }
                                 else
                                    printf("Failed SCardTransmit, command : SELECT, error %#X\n",dwReturn);
                              }
                              else
                                 printf("Failed SCardConnect, unsupported protocol,error %#X\n",dwReturn);
                              SCardDisconnect(hSC, SCARD_LEAVE_CARD);
                           }
                           else
                           {
                              if (dwReturn == SCARD_W_REMOVED_CARD)
                                 printf("Failed SCardConnect, virtual smartcard was removed, error %#X\n",dwReturn);
                              else 
                                 printf("Failed SCardConnect, error %#X\n",dwReturn);
                           }
                        }
                        else
                           printf("Failed SCardListCards, error %#X\n",dwReturn);
                        if(pmszCards) free(pmszCards);
                     }
                     else
                        VASSERT(pmszCards != NULL);
                  }
                  else
                     printf("Failed SCardListCards, error %#X\n",dwReturn);
               }
               else
                  printf("Reader %s is not installed properly\n",chWork_Reader);
               if (pmszReaders) free(pmszReaders);    
            }
            else
               VASSERT(pmszReaders != NULL);
         }
         else
            printf("Failed SCardListReaders, error %#X\n",dwReturn);
      }
      else
         printf("Failed SCardListReaderGroups, error %#X\n",dwReturn);
      if (hSC != NULL) VAS_VERIFY(SCardReleaseContext(hSC) == SCARD_S_SUCCESS);
   }
   else
      printf("Failed SCardEstablishContext, error %#X\n",dwReturn);
#ifdef _CRT_DEBUG
      _CrtMemCheckpoint( &s2 );
      if ( _CrtMemDifference( &s3, &s1, &s2) ) 
         _CrtMemDumpStatistics( &s3 );
      //_CrtMemDumpAllObjectsSince( NULL );
      _CrtDumpMemoryLeaks( );
#endif
}   
#else
#error Modification required for this type of OS
#endif
//----------------------------------------------------------------------------------------------
#endif // TEST_SC_CPP

⌨️ 快捷键说明

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