#include #include #include #include #include #define EXEC(msg, func) {\ std::wcout << msg << L": ";\ auto res = func;\ if(res){\ std::wcout << L"Failed" << std::endl;\ throw res; \ }\ std::wcout << L"OK" << std::endl;\ } int main(void){ SCARDCONTEXT scContext = NULL; SCARDHANDLE scard = NULL; int result = 0; try{ EXEC(L"SCardEstablishContext", SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &scContext)); DWORD size = 0; EXEC(L"SCardEstablishContext", SCardListReaders(scContext, NULL, NULL, &size)); std::vector readers(size + 1, L'\0'); EXEC(L"SCardListReaders", SCardListReaders(scContext, NULL, &readers[0], &size)); if (!strlen(&readers[0])) { std::wcout << L"NO READERS FOUND" << std::endl; throw (LONG)SCARD_E_NO_READERS_AVAILABLE; } DWORD proto = 0; //if launched second time should hang here (on windows 8+ for 5 secs only) //but it doesn't hang on osx - transaction do not work properly. EXEC(L"SCardConnect", SCardConnect(scContext, &readers[0], SCARD_SHARE_SHARED, SCARD_PROTOCOL_T1 | SCARD_PROTOCOL_T0, &scard, &proto)); EXEC(L"SCardBeginTransaction 1", SCardBeginTransaction(scard)); //lock EXEC(L"SCardBeginTransaction 2", SCardBeginTransaction(scard)); //lock again EXEC( L"SCardEndTransaction", SCardEndTransaction(scard, SCARD_LEAVE_CARD));//unlock once //card should be still locked std::wcout << L"Start me again"; getwchar(); } catch (LONG res) { result = 1; std::wcout << L"Error occurred: " << std::dec << res << L"(0x" << std::hex << std::uppercase << res << L")" << std::endl; } if (scContext) SCardReleaseContext(scContext); if (scard) SCardDisconnect(scard, SCARD_LEAVE_CARD); return result; }