基本的智能卡测试在Windows
Basic Smart Card testing in Windows
我正在尝试简单地测试在Windows中是否存在智能卡。目标是让一个"守护进程"运行,无论何时(以及持续时间)插入卡片,它都会执行一个操作。
我对这种性质的事情毫无经验。我已经阅读了SCardStatus等文档,但我不明白整个API是如何工作的,所以我有点迷路了。对我最有帮助的是,如果有人有一个非常简单的完整程序的例子,简单地测试卡的存在(最好是在c++中,但我会接受我能得到的!)。我会非常感激。除了它存在之外,我不需要任何卡状态。谢谢!
如果你在windows上工作,你需要使用WinSCard API,如果你使用unix,那么使用PCSC。由于标准不同,这两个API非常相似,但是WinSCard API更大,提供了更多的函数。这两个api是用C语言实现的,但您可以很容易地将它们封装在c++中。我只是想指出如果你想把这两个api包装到c++中在windows和unix上使用它看看智能卡协议数值,它们在这些平台上是不同的。
基础知识:
你需要建立上下文(就像创建智能卡管理器)
SCardEstablishContext
它需要4个参数,但是对于基本的使用,你只需要2个,作用域和指向上下文句柄的指针。
LPSCARDCONTEXT hSCardContext = NULL;
int ret = SCardEstablishContext(SCARD_SCOPE_USER, NULL, NULL, &hSCardContext);
if (ret != ERROR_SUCCES) ... // handle error
智能卡分为不同的组。因此,有一些函数可以处理组,创建组等等。
获取读者列表(对于基本应用程序,实际上不需要组)
SCardListReaders
它有4个参数,context,指向group的指针,指向reader的指针和指向reader count的指针
你可以这样使用
char *szGroups = NULL;
long readers = 0;
int res = SCardListReaders(hSCardContext, szGroups, NULL, &readers);
// handle errors
你先得到读者数。现在可以为实际的读取器分配内存了。
szReaders = (char *) malloc(sizeof(char) * readers);
int res = SCardListReaders(hSCardContext, szGroups, szReaders , &readers);
现在您已经连接了一个阅读器列表。
您可以像这样连接到阅读器
LPSCARDHANDLE hSCard = NULL;
long activeProtocols = 0;
int ret = SCardConnect(hSCardContext, myReader, SCARD_SHARE_EXCLUSIVE, SCARD_PROTOCOL_TX, &hSCard, &activeProtocols);
// .. handle errors
指定协议,共享模式,使用SCARD_SHARE_EXCLUSIVE为共享模式,如果你正在处理敏感的东西,需要保护操作系统不会与事务交互。
如果你再次包装windows和unix (unix没有SCARD_PROTOCOL_TX协议),但它是这两个SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1的表示。
myReader是连接的阅读器的名称。像(LPCTSTR)"Dermalog LF10"
你可以从SCardListReaders函数中获取这些阅读器的名称。
现在您已连接到一张卡片。使用SCARD_SHARE_EXCLUSIVE共享时,不要忘记释放智能卡上下文,因为它会死锁。使用SCardDisconnect
断开连接,它有2个参数,智能卡手柄和处置,对于基本应用SCARD_LEAVE_CARD处置应该ok。它指定你不想对卡片做任何特别的事情,你不想弹出或者其他什么
事务更复杂,因为您需要了解SCard标准等等。但是我讲了基本的。
请记住,这段代码可能无法编译,你需要改进类型,对于windows,你需要在WinAPI类型中强制转换这些类型,如LPCTSTR,它不会抱怨,unix没有这样的类型,所以你需要解决这些问题。
此示例代码假设在开始时插入读卡器,它不处理读卡器数量的变化。除此之外,它只是通过插入/未插入卡的状态向控制台发送垃圾信息。请不要在产品代码中使用此代码,大多数错误检查被省略,并且采取了一些快捷方式来保持代码的简短。
#pragma comment(lib, "winscard.lib")
#include <vector>
bool test()
{
DWORD dwReaders;
LPSTR szReaders = NULL;
SCARDCONTEXT hContext;
bool bRunning = true;
std::vector<const char*> cards;
LONG status = SCardEstablishContext(SCARD_SCOPE_USER, NULL, NULL, &hContext);
if( status != SCARD_S_SUCCESS ) {
return false;
}
dwReaders = SCARD_AUTOALLOCATE;
if( SCardListReadersA(hContext, NULL, (LPSTR)&szReaders, &dwReaders) == SCARD_S_SUCCESS ) {
LPSTR reader = szReaders;
while (reader != NULL && *reader != ' ') {
std::cout << "Reader name: '" << reader << "'" << std::endl;
cards.push_back( reader );
reader += strlen(reader)+1;
}
LPSCARD_READERSTATEA lpState = new SCARD_READERSTATEA[cards.size()];
for( size_t n = 0; n < cards.size(); ++n ) {
memset( lpState + n, 0, sizeof(SCARD_READERSTATEA) );
lpState[n].szReader = cards[n];
}
do {
status = SCardGetStatusChangeA( hContext, 500, lpState, cards.size() );
switch( status )
{
case SCARD_S_SUCCESS:
case SCARD_E_TIMEOUT:
for( size_t n = 0; n < cards.size(); ++n ) {
if( lpState[n].dwEventState & SCARD_STATE_PRESENT) {
std::cout << "'" << lpState[n].szReader << "' present" << std::endl;
} else {
std::cout << "'" << lpState[n].szReader << "' not present" << std::endl;
}
}
break;
default:
std::cout << "Other result: " << status << std::endl;
break;
}
Sleep( 1000 ); // do not spam too bad
} while( bRunning );
// only do this after being done with the strings, or handle the names another way!
SCardFreeMemory( hContext, szReaders );
}
SCardReleaseContext( hContext );
return true;
}
- GMock 测试夹具在 Windows 上崩溃
- 测试使用visual studio编写的C++android应用程序的最佳方法是什么.不升级到windows专业版
- Windows CMake 不会编译测试程序
- 使用MSVC 2015上的Windows上使用Google测试
- 如何测试 Windows 中的触摸输入是来自手指还是触笔?在 C/C++ 中
- 在Windows 7(Mingw,Code :: Blocks)下进行编译,以获取Botan Library测试程序
- 如何在MVVM Windows应用商店应用程序中为专用C++模型层编写Visual Studio单元测试
- 如何在多显示器设置中测试我的 Windows 应用
- 具有专有测试自动化功能的Windows代码覆盖率
- Windows 上的 Google 测试框架检查您是否以交互方式运行
- 在使用 CMake 构建 Windows DLL 期间运行单元测试
- 调试Windows Phone 8.1单元测试(Visual c++)
- 为什么PostgreSQL的SOCI回归测试在Windows上失败
- 如何为通过地址传递参数的Windows API调用编写测试双精度
- 如何在windows应用程序上使用基于消息队列的谷歌测试
- Windows的ThreadSanitizer日期竞争测试
- 基本的智能卡测试在Windows
- 如何在Windows中模拟注册表进行程序测试
- WACK测试在Windows运行时元数据验证上失败
- Google在Windows上用Eclipse进行测试