Bug in SCardTransmit parameter

master
Marc Wäckerlin 16 years ago
parent d1c5ed8dd8
commit 0f0389f121
  1. 2
      doc/examples/pcsc-demo.cpp
  2. 34
      src/pcsc.hxx

@ -1,6 +1,6 @@
//g++ -I ../svn -I /usr/include/PCSC test.cpp -lpcsclite -ggdb3 //g++ -I ../svn -I /usr/include/PCSC test.cpp -lpcsclite -ggdb3
#include "pcscpp/pcsc.hxx" #include "pcscpp/pcsc.hxx"
#include "pcscpp/cardos.hxx" //#include "pcscpp/cardos.hxx"
#include <iostream> #include <iostream>
int main(int, char const*const*const argv) try { int main(int, char const*const*const argv) try {

@ -10,8 +10,10 @@
#ifndef PCSC_HXX #ifndef PCSC_HXX
#define PCSC_HXX #define PCSC_HXX
#include <string>
#ifdef WIN32 #ifdef WIN32
#include "WinSCard.h" #include <WinSCard.h>
#ifndef MAX_ATR_SIZE #ifndef MAX_ATR_SIZE
#define MAX_ATR_SIZE 33 #define MAX_ATR_SIZE 33
#endif #endif
@ -41,7 +43,6 @@ namespace pcsc {
#endif #endif
#include <boost/shared_ptr.hpp> #include <boost/shared_ptr.hpp>
#include <string>
#include <vector> #include <vector>
#include <map> #include <map>
#include <memory> #include <memory>
@ -69,8 +70,8 @@ namespace pcsc {
std::string hex(const std::string& data) { std::string hex(const std::string& data) {
std::stringstream res; std::stringstream res;
for (std::string::const_iterator it(data.begin()); it!=data.end(); ++it) for (std::string::const_iterator it(data.begin()); it!=data.end(); ++it)
res<<"(0x"<<std::hex<<std::setfill('0')<<std::setw(2) res<<std::hex<<std::setfill('0')<<std::setw(2)
<<(unsigned int)(unsigned char)*it<<')'; <<(unsigned int)(unsigned char)*it;
return res.str(); return res.str();
} }
@ -189,7 +190,7 @@ namespace pcsc {
//! Disconnects connection. //! Disconnects connection.
~Reader() { ~Reader() {
_state = SCardDisconnect(_id, SCARD_LEAVE_CARD); _state = SCardDisconnect(_id, SCARD_RESET_CARD);
if (!std::uncaught_exception()) if (!std::uncaught_exception())
_connection.check("disconnect smartcard"); _connection.check("disconnect smartcard");
} }
@ -210,9 +211,11 @@ namespace pcsc {
DWORD len(1024); // arbitrary DWORD len(1024); // arbitrary
unsigned char buff[len]; unsigned char buff[len];
SCARD_IO_REQUEST rPci; SCARD_IO_REQUEST rPci;
check(SCardTransmit(_id, pci(), rPci.dwProtocol = pci()->dwProtocol;
rPci.cbPciLength = sizeof(rPci);
check(SCardTransmit(_id, &rPci,
(unsigned char*)in.c_str(), in.size(), (unsigned char*)in.c_str(), in.size(),
&rPci, buff, &len), 0, buff, &len),
"smartcard transmit message "+hex(in)); "smartcard transmit message "+hex(in));
return std::string((char*)buff, len); return std::string((char*)buff, len);
} }
@ -232,8 +235,8 @@ namespace pcsc {
// 11 - Error // 11 - Error
// So everything with Sev=00 is successful // So everything with Sev=00 is successful
// theoretically even with Sev=01, but that's still rejected // theoretically even with Sev=01, but that's still rejected
return (_state>>30&3)==0; //return (_state>>30&3)==0;
//RETURN _STATE==SCARD_S_SUCCESS; return _state==SCARD_S_SUCCESS;
} }
//...........................................................variables //...........................................................variables
@ -282,11 +285,12 @@ namespace pcsc {
friend class Connection; friend class Connection;
//! Establishes a connection to the given named cardreader //! Establishes a connection to the given named cardreader
Reader(const std::string& nm, Connection& c): Reader(const std::string& nm, Connection& c,
DWORD mode=SCARD_SHARE_SHARED,
DWORD protocol=SCARD_PROTOCOL_T1):
name(nm), _connection(c) { name(nm), _connection(c) {
check(SCardConnect(_connection._id, strconv(name).c_str(), check(SCardConnect(_connection._id, strconv(name).c_str(),
SCARD_SHARE_SHARED, mode, protocol,
SCARD_PROTOCOL_T0|SCARD_PROTOCOL_T1,
&_id, &_protocol), &_id, &_protocol),
"connect smartcard \""+name+"\""); "connect smartcard \""+name+"\"");
} }
@ -347,7 +351,7 @@ namespace pcsc {
- @c true: class throws exceptions in case of an error - @c true: class throws exceptions in case of an error
- @c false: no exceptions, check your instance after each - @c false: no exceptions, check your instance after each
operation */ operation */
Connection(Scope s=SYSTEM, bool exceptions=true): Connection(Scope s=USER, bool exceptions=true):
_exc(exceptions), _id(0), _exc(exceptions), _id(0),
_state(SCardEstablishContext(s, 0, 0, &_id)) { _state(SCardEstablishContext(s, 0, 0, &_id)) {
check("establish smartcard context"); check("establish smartcard context");
@ -395,8 +399,8 @@ namespace pcsc {
//! @c false if last operation was not successful //! @c false if last operation was not successful
operator bool() const { operator bool() const {
return (_state>>30&3)==0; //return (_state>>30&3)==0;
//return _state==SCARD_S_SUCCESS; return _state==SCARD_S_SUCCESS;
} }
//! Get the describing text of the last error //! Get the describing text of the last error

Loading…
Cancel
Save