API

This handles smartcard reader communications and forwarding requests over message queues. More...


Functions

PCSC_API char * pcsc_stringify_error (const long pcscError)
 This function return a human readable text for the given PC/SC error code.
LONG SCardEstablishContext (DWORD dwScope, LPCVOID pvReserved1, LPCVOID pvReserved2, LPSCARDCONTEXT phContext)
 Creates an Application Context to the PC/SC Resource Manager.
LONG SCardReleaseContext (SCARDCONTEXT hContext)
 This function destroys a communication context to the PC/SC Resource Manager.
LONG SCardSetTimeout (SCARDCONTEXT hContext, DWORD dwTimeout)
 The function does not do anything except returning SCARD_S_SUCCESS.
LONG SCardConnect (SCARDCONTEXT hContext, LPCSTR szReader, DWORD dwShareMode, DWORD dwPreferredProtocols, LPSCARDHANDLE phCard, LPDWORD pdwActiveProtocol)
 This function establishes a connection to the reader specified in szReader.
LONG SCardReconnect (SCARDHANDLE hCard, DWORD dwShareMode, DWORD dwPreferredProtocols, DWORD dwInitialization, LPDWORD pdwActiveProtocol)
 This function reestablishes a connection to a reader that was previously connected to using SCardConnect().
LONG SCardDisconnect (SCARDHANDLE hCard, DWORD dwDisposition)
 This function terminates a connection made through SCardConnect().
LONG SCardBeginTransaction (SCARDHANDLE hCard)
 This function establishes a temporary exclusive access mode for doing a serie of commands in a transaction.
LONG SCardEndTransaction (SCARDHANDLE hCard, DWORD dwDisposition)
 This function ends a previously begun transaction.
LONG SCardCancelTransaction (SCARDHANDLE hCard)
LONG SCardStatus (SCARDHANDLE hCard, LPSTR mszReaderName, LPDWORD pcchReaderLen, LPDWORD pdwState, LPDWORD pdwProtocol, LPBYTE pbAtr, LPDWORD pcbAtrLen)
 This function returns the current status of the reader connected to by hCard.
LONG SCardGetStatusChange (SCARDCONTEXT hContext, DWORD dwTimeout, LPSCARD_READERSTATE_A rgReaderStates, DWORD cReaders)
 This function receives a structure or list of structures containing reader names.
LONG SCardControl (SCARDHANDLE hCard, DWORD dwControlCode, LPCVOID pbSendBuffer, DWORD cbSendLength, LPVOID pbRecvBuffer, DWORD cbRecvLength, LPDWORD lpBytesReturned)
 This function sends a command directly to the IFD Handler (reader driver) to be processed by the reader.
LONG SCardGetAttrib (SCARDHANDLE hCard, DWORD dwAttrId, LPBYTE pbAttr, LPDWORD pcbAttrLen)
 This function get an attribute from the IFD Handler (reader driver).
LONG SCardSetAttrib (SCARDHANDLE hCard, DWORD dwAttrId, LPCBYTE pbAttr, DWORD cbAttrLen)
 This function set an attribute of the IFD Handler.
LONG SCardTransmit (SCARDHANDLE hCard, LPCSCARD_IO_REQUEST pioSendPci, LPCBYTE pbSendBuffer, DWORD cbSendLength, LPSCARD_IO_REQUEST pioRecvPci, LPBYTE pbRecvBuffer, LPDWORD pcbRecvLength)
 This function sends an APDU to the smart card contained in the reader connected to by SCardConnect().
LONG SCardListReaders (SCARDCONTEXT hContext, LPCSTR mszGroups, LPSTR mszReaders, LPDWORD pcchReaders)
 This function returns a list of currently available readers on the system.
LONG SCardFreeMemory (SCARDCONTEXT hContext, LPCVOID pvMem)
 Releases memory that has been returned from the resource manager using the SCARD_AUTOALLOCATE length designator.
LONG SCardListReaderGroups (SCARDCONTEXT hContext, LPSTR mszGroups, LPDWORD pcchGroups)
 This function returns a list of currently available reader groups on the system.
LONG SCardCancel (SCARDCONTEXT hContext)
 This function cancels all pending blocking requests on the SCardGetStatusChange() function.
LONG SCardIsValidContext (SCARDCONTEXT hContext)
 Check if a SCARDCONTEXT is valid.


Detailed Description

This handles smartcard reader communications and forwarding requests over message queues.

Here is exposed the API for client applications.


Function Documentation

PCSC_API char* pcsc_stringify_error ( const long  pcscError  ) 

LONG SCardBeginTransaction ( SCARDHANDLE  hCard  ) 

This function establishes a temporary exclusive access mode for doing a serie of commands in a transaction.

You might want to use this when you are selecting a few files and then writing a large file so you can make sure that another application will not change the current file. If another application has a lock on this reader or this application is in SCARD_SHARE_EXCLUSIVE there will be no action taken.

Parameters:
[in] hCard Connection made from SCardConnect().
Returns:
Error code.
Return values:
SCARD_S_SUCCESS Successful (SCARD_S_SUCCESS)
SCARD_E_INVALID_HANDLE Invalid hCard handle (SCARD_E_INVALID_HANDLE)
SCARD_E_NO_SERVICE The server is not runing (SCARD_E_NO_SERVICE)
SCARD_E_READER_UNAVAILABLE The reader has been removed (SCARD_E_READER_UNAVAILABLE)
SCARD_E_SHARING_VIOLATION Someone else has exclusive rights (SCARD_E_SHARING_VIOLATION)
SCARD_F_COMM_ERROR An internal communications error has been detected (SCARD_F_COMM_ERROR)
 SCARDCONTEXT hContext;
 SCARDHANDLE hCard;
 DWORD dwActiveProtocol;
 LONG rv;
 ...
 rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
 rv = SCardConnect(hContext, "Reader X", SCARD_SHARE_SHARED,
          SCARD_PROTOCOL_T0, &hCard, &dwActiveProtocol);
 rv = SCardBeginTransaction(hCard);
 ...
 / * Do some transmit commands * /

Definition at line 1125 of file winscard_clnt.c.

References PCSCLITE_CLIENT_ATTEMPTS, PCSCLITE_LOCK_POLL_RATE, PCSCLITE_MAX_READERS_CONTEXTS, psContextMap, SCARD_BEGIN_TRANSACTION, SCARD_E_INVALID_HANDLE, SCARD_E_NO_SERVICE, SCARD_E_READER_UNAVAILABLE, SCARD_E_SHARING_VIOLATION, SCARD_F_COMM_ERROR, SCARD_S_SUCCESS, SCardCheckDaemonAvailability(), SHMClientRead(), SYS_USleep(), and WrapSHMWrite().

Referenced by MSGFunctionDemarshall().

Here is the call graph for this function:

LONG SCardCancel ( SCARDCONTEXT  hContext  ) 

This function cancels all pending blocking requests on the SCardGetStatusChange() function.

Parameters:
[in] hContext Connection context to the PC/SC Resource Manager.
Returns:
Error code.
Return values:
SCARD_S_SUCCESS Successful (SCARD_S_SUCCESS)
SCARD_E_INVALID_HANDLE Invalid hContext handle (SCARD_E_INVALID_HANDLE)
 SCARDCONTEXT hContext;
 DWORD cReaders;
 SCARD_READERSTATE rgReaderStates;
 LONG rv;
 ...
 rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
 rgReaderStates.szReader = strdup("Reader X");
 rgReaderStates.dwCurrentState = SCARD_STATE_EMPTY;
 ...
 / * Spawn off thread for following function * /
 ...
 rv = SCardGetStatusChange(hContext, 0, rgReaderStates, cReaders);
 rv = SCardCancel(hContext);

Definition at line 3467 of file winscard_clnt.c.

References BLOCK_STATUS_RESUME, psContextMap, SCARD_E_INVALID_HANDLE, SCARD_F_INTERNAL_ERROR, SCARD_S_SUCCESS, SCardGetContextIndice(), and StatSynchronizeContext().

Here is the call graph for this function:

LONG SCardCancelTransaction ( SCARDHANDLE  hCard  ) 

Deprecated:
This function is not in Microsoft(R) WinSCard API and is deprecated in pcsc-lite API.

Definition at line 1357 of file winscard_clnt.c.

References PCSCLITE_CLIENT_ATTEMPTS, PCSCLITE_MAX_READERS_CONTEXTS, psContextMap, SCARD_E_INVALID_HANDLE, SCARD_E_NO_SERVICE, SCARD_E_READER_UNAVAILABLE, SCARD_F_COMM_ERROR, SCARD_S_SUCCESS, SCardCheckDaemonAvailability(), SHMClientRead(), and WrapSHMWrite().

Referenced by MSGFunctionDemarshall().

Here is the call graph for this function:

LONG SCardConnect ( SCARDCONTEXT  hContext,
LPCSTR  szReader,
DWORD  dwShareMode,
DWORD  dwPreferredProtocols,
LPSCARDHANDLE  phCard,
LPDWORD  pdwActiveProtocol 
)

This function establishes a connection to the reader specified in szReader.

Parameters:
[in] hContext Connection context to the PC/SC Resource Manager.
[in] szReader Reader name to connect to.
[in] dwShareMode Mode of connection type: exclusive or shared.
[in] dwPreferredProtocols Desired protocol use.
[out] phCard Handle to this connection.
[out] pdwActiveProtocol Established protocol to this connection.
Returns:
Error code.
Return values:
SCARD_S_SUCCESS Successful (SCARD_S_SUCCESS)
SCARD_E_INVALID_HANDLE Invalid hContext handle (SCARD_E_INVALID_HANDLE)
SCARD_E_INVALID_PARAMETER phCard or pdwActiveProtocol is NULL (SCARD_E_INVALID_PARAMETER)
SCARD_E_INVALID_VALUE Invalid sharing mode, requested protocol, or reader name (SCARD_E_INVALID_VALUE)
SCARD_E_NO_SERVICE The server is not runing (SCARD_E_NO_SERVICE)
SCARD_E_NOT_READY Could not allocate the desired port (SCARD_E_NOT_READY)
SCARD_E_READER_UNAVAILABLE Could not power up the reader or card (SCARD_E_READER_UNAVAILABLE)
SCARD_E_SHARING_VIOLATION Someone else has exclusive rights (SCARD_E_SHARING_VIOLATION)
SCARD_E_UNKNOWN_READER szReader is NULL (SCARD_E_UNKNOWN_READER)
SCARD_E_UNSUPPORTED_FEATURE Protocol not supported (SCARD_E_UNSUPPORTED_FEATURE)
SCARD_F_INTERNAL_ERROR An internal consistency check failed (SCARD_F_INTERNAL_ERROR)
 SCARDCONTEXT hContext;
 SCARDHANDLE hCard;
 DWORD dwActiveProtocol;
 LONG rv;
 ...
 rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
 rv = SCardConnect(hContext, "Reader X", SCARD_SHARE_SHARED,
          SCARD_PROTOCOL_T0, &hCard, &dwActiveProtocol);

Definition at line 726 of file winscard_clnt.c.

References PCSCLITE_CLIENT_ATTEMPTS, PCSCLITE_LOCK_POLL_RATE, PHGetAvailableProtocols(), PHGetDefaultProtocol(), PHSetProtocol(), psContextMap, SCARD_CONNECT, SCARD_E_INVALID_HANDLE, SCARD_E_INVALID_PARAMETER, SCARD_E_INVALID_VALUE, SCARD_E_NO_SERVICE, SCARD_E_NO_SMARTCARD, SCARD_E_PROTO_MISMATCH, SCARD_E_SHARING_VIOLATION, SCARD_E_UNKNOWN_READER, SCARD_EXCLUSIVE_CONTEXT, SCARD_F_COMM_ERROR, SCARD_F_INTERNAL_ERROR, SCARD_NO_CONTEXT, SCARD_PRESENT, SCARD_PROTOCOL_ANY_OLD, SCARD_PROTOCOL_RAW, SCARD_PROTOCOL_T0, SCARD_PROTOCOL_T1, SCARD_PROTOCOL_UNDEFINED, SCARD_S_SUCCESS, SCARD_SHARE_DIRECT, SCARD_SHARE_EXCLUSIVE, SCARD_SHARE_SHARED, SCARD_SWALLOWED, SCARD_W_UNPOWERED_CARD, SCARD_W_UNRESPONSIVE_CARD, SCardCheckDaemonAvailability(), SCardGetContextIndice(), SHMClientRead(), StatSynchronize(), SYS_USleep(), and WrapSHMWrite().

Referenced by MSGFunctionDemarshall().

Here is the call graph for this function:

LONG SCardControl ( SCARDHANDLE  hCard,
DWORD  dwControlCode,
LPCVOID  pbSendBuffer,
DWORD  cbSendLength,
LPVOID  pbRecvBuffer,
DWORD  cbRecvLength,
LPDWORD  lpBytesReturned 
)

This function sends a command directly to the IFD Handler (reader driver) to be processed by the reader.

This is useful for creating client side reader drivers for functions like PIN pads, biometrics, or other extensions to the normal smart card reader that are not normally handled by PC/SC.

Note:
the API of this function changed. In pcsc-lite 1.2.0 and before the API was not Windows(R) PC/SC compatible. This has been corrected.
Parameters:
[in] hCard Connection made from SCardConnect().
[in] dwControlCode Control code for the operation.
Click here for a list of supported commands by some drivers.
[in] pbSendBuffer Command to send to the reader.
[in] cbSendLength Length of the command.
[out] pbRecvBuffer Response from the reader.
[in] cbRecvLength Length of the response buffer.
[out] lpBytesReturned Length of the response.
Returns:
Error code.
Return values:
SCARD_S_SUCCESS Successful (SCARD_S_SUCCESS)
SCARD_E_INVALID_HANDLE Invalid hCard handle (SCARD_E_INVALID_HANDLE)
SCARD_E_INVALID_VALUE Invalid value was presented (SCARD_E_INVALID_VALUE)
SCARD_E_INSUFFICIENT_BUFFER cbSendLength or cbRecvLength are too big (SCARD_E_INSUFFICIENT_BUFFER)
SCARD_E_NO_SERVICE The server is not runing (SCARD_E_NO_SERVICE)
SCARD_E_NOT_TRANSACTED Data exchange not successful (SCARD_E_NOT_TRANSACTED)
SCARD_E_READER_UNAVAILABLE The reader has been removed(SCARD_E_READER_UNAVAILABLE)
SCARD_F_COMM_ERROR An internal communications error has been detected (SCARD_F_COMM_ERROR)
SCARD_W_REMOVED_CARD The card has been removed from the reader(SCARD_W_REMOVED_CARD)
SCARD_W_RESET_CARD The card has been reset by another application (SCARD_W_RESET_CARD)
 LONG rv;
 SCARDCONTEXT hContext;
 SCARDHANDLE hCard;
 DWORD dwActiveProtocol, dwSendLength, dwRecvLength;
 BYTE pbRecvBuffer[10];
 BYTE pbSendBuffer[] = { 0x06, 0x00, 0x0A, 0x01, 0x01, 0x10 0x00 };
 ...
 rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
 rv = SCardConnect(hContext, "Reader X", SCARD_SHARE_SHARED,
          SCARD_PROTOCOL_RAW, &hCard, &dwActiveProtocol);
 dwSendLength = sizeof(pbSendBuffer);
 dwRecvLength = sizeof(pbRecvBuffer);
 rv = SCardControl(hCard, 0x42000001, pbSendBuffer, dwSendLength,
          pbRecvBuffer, sizeof(pbRecvBuffer), &dwRecvLength);

Definition at line 2337 of file winscard_clnt.c.

References _psContextMap::dwClientID, IFDControl(), MAX_BUFFER_SIZE, MAX_BUFFER_SIZE_EXTENDED, PCSCLITE_CLIENT_ATTEMPTS, PCSCLITE_MAX_MESSAGE_SIZE, PCSCLITE_MAX_READERS_CONTEXTS, psContextMap, SCARD_CONTROL, SCARD_CONTROL_EXTENDED, SCARD_E_INSUFFICIENT_BUFFER, SCARD_E_INVALID_HANDLE, SCARD_E_INVALID_PARAMETER, SCARD_E_NO_SERVICE, SCARD_E_READER_UNAVAILABLE, SCARD_E_UNSUPPORTED_FEATURE, SCARD_F_COMM_ERROR, SCARD_S_SUCCESS, SCardCheckDaemonAvailability(), SHMClientRead(), SHMMessageReceive(), and WrapSHMWrite().

Referenced by MSGFunctionDemarshall().

Here is the call graph for this function:

LONG SCardDisconnect ( SCARDHANDLE  hCard,
DWORD  dwDisposition 
)

This function terminates a connection made through SCardConnect().

Parameters:
[in] hCard Connection made from SCardConnect().
[in] dwDisposition Reader function to execute.
Returns:
Error code.
Return values:
SCARD_S_SUCCESS Successful(SCARD_S_SUCCESS)
SCARD_E_INVALID_HANDLE Invalid hCard handle (SCARD_E_INVALID_HANDLE)
SCARD_E_INVALID_VALUE Invalid dwDisposition (SCARD_E_INVALID_VALUE)
SCARD_E_NO_SERVICE The server is not runing (SCARD_E_NO_SERVICE)
SCARD_F_COMM_ERROR An internal communications error has been detected (SCARD_F_COMM_ERROR)
 SCARDCONTEXT hContext;
 SCARDHANDLE hCard;
 DWORD dwActiveProtocol;
 LONG rv;
 ...
 rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
 rv = SCardConnect(hContext, "Reader X", SCARD_SHARE_SHARED,
          SCARD_PROTOCOL_T0, &hCard, &dwActiveProtocol);
 rv = SCardDisconnect(hCard, SCARD_UNPOWER_CARD);

Definition at line 1022 of file winscard_clnt.c.

References IFDPowerICC(), MAX_BUFFER_SIZE, PCSCLITE_CLIENT_ATTEMPTS, PCSCLITE_LOCK_POLL_RATE, psContextMap, SCARD_ABSENT, SCARD_DISCONNECT, SCARD_E_INVALID_HANDLE, SCARD_E_INVALID_VALUE, SCARD_E_NO_SERVICE, SCARD_E_NO_SMARTCARD, SCARD_EJECT_CARD, SCARD_EXCLUSIVE_CONTEXT, SCARD_F_COMM_ERROR, SCARD_LEAVE_CARD, SCARD_NEGOTIABLE, SCARD_NO_CONTEXT, SCARD_POWERED, SCARD_PRESENT, SCARD_PROTOCOL_UNDEFINED, SCARD_RESET, SCARD_RESET_CARD, SCARD_S_SUCCESS, SCARD_SPECIFIC, SCARD_SWALLOWED, SCARD_UNKNOWN, SCARD_UNPOWER_CARD, SCardCheckDaemonAvailability(), SHMClientRead(), StatSynchronize(), SYS_USleep(), and WrapSHMWrite().

Referenced by MSGFunctionDemarshall().

Here is the call graph for this function:

LONG SCardEndTransaction ( SCARDHANDLE  hCard,
DWORD  dwDisposition 
)

This function ends a previously begun transaction.

The calling application must be the owner of the previously begun transaction or an error will occur.

Parameters:
[in] hCard Connection made from SCardConnect().
[in] dwDisposition Action to be taken on the reader. The disposition action is not currently used in this release.
Returns:
Error code.
Return values:
SCARD_S_SUCCESS Successful (SCARD_S_SUCCESS)
SCARD_E_INVALID_HANDLE Invalid hCard handle (SCARD_E_INVALID_HANDLE)
SCARD_E_INVALID_VALUE Invalid value for dwDisposition (SCARD_E_INVALID_VALUE)
SCARD_E_NO_SERVICE The server is not runing (SCARD_E_NO_SERVICE)
SCARD_E_READER_UNAVAILABLE The reader has been removed (SCARD_E_READER_UNAVAILABLE)
SCARD_E_SHARING_VIOLATION Someone else has exclusive rights (SCARD_E_SHARING_VIOLATION)
SCARD_F_COMM_ERROR An internal communications error has been detected (SCARD_F_COMM_ERROR)
 SCARDCONTEXT hContext;
 SCARDHANDLE hCard;
 DWORD dwActiveProtocol;
 LONG rv;
 ...
 rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
 rv = SCardConnect(hContext, "Reader X", SCARD_SHARE_SHARED,
          SCARD_PROTOCOL_T0, &hCard, &dwActiveProtocol);
 rv = SCardBeginTransaction(hCard);
 ...
 / * Do some transmit commands * /
 ...
 rv = SCardEndTransaction(hCard, SCARD_LEAVE_CARD);

Definition at line 1258 of file winscard_clnt.c.

References IFDPowerICC(), MAX_BUFFER_SIZE, PCSCLITE_CLIENT_ATTEMPTS, PCSCLITE_MAX_READERS_CONTEXTS, psContextMap, SCARD_ABSENT, SCARD_E_INVALID_HANDLE, SCARD_E_INVALID_VALUE, SCARD_E_NO_SERVICE, SCARD_E_READER_UNAVAILABLE, SCARD_EJECT_CARD, SCARD_END_TRANSACTION, SCARD_F_COMM_ERROR, SCARD_LEAVE_CARD, SCARD_NEGOTIABLE, SCARD_POWERED, SCARD_PRESENT, SCARD_PROTOCOL_UNDEFINED, SCARD_RESET, SCARD_RESET_CARD, SCARD_S_SUCCESS, SCARD_SPECIFIC, SCARD_SWALLOWED, SCARD_UNKNOWN, SCARD_UNPOWER_CARD, SCardCheckDaemonAvailability(), SHMClientRead(), SYS_USleep(), and WrapSHMWrite().

Referenced by MSGFunctionDemarshall().

Here is the call graph for this function:

LONG SCardEstablishContext ( DWORD  dwScope,
LPCVOID  pvReserved1,
LPCVOID  pvReserved2,
LPSCARDCONTEXT  phContext 
)

Creates an Application Context to the PC/SC Resource Manager.

Creates an Application Context for a client.

This must be the first function called in a PC/SC application.

Parameters:
[in] dwScope Scope of the establishment. This can either be a local or remote connection.
[in] pvReserved1 Reserved for future use.
[in] pvReserved2 Reserved for future use.
[out] phContext Returned Application Context.
Returns:
Connection status.
Return values:
SCARD_S_SUCCESS Successful (SCARD_S_SUCCESS)
SCARD_E_INVALID_PARAMETER phContext is null (SCARD_E_INVALID_PARAMETER)
SCARD_E_INVALID_VALUE Invalid scope type passed (SCARD_E_INVALID_VALUE )
SCARD_E_NO_MEMORY There is no free slot to store hContext (SCARD_E_NO_MEMORY)
SCARD_E_NO_SERVICE The server is not runing (SCARD_E_NO_SERVICE)
SCARD_F_COMM_ERROR An internal communications error has been detected (SCARD_F_COMM_ERROR)
SCARD_F_INTERNAL_ERROR An internal consistency check failed (SCARD_F_INTERNAL_ERROR)
 SCARDCONTEXT hContext;
 LONG rv;
 ...
 rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);

Definition at line 304 of file winscard_clnt.c.

References SCARD_E_INVALID_HANDLE, SCARD_S_SUCCESS, SCardCheckDaemonAvailability(), SCardEstablishContextTH(), SCardLockThread(), and SCardUnlockThread().

Referenced by MSGFunctionDemarshall().

Here is the call graph for this function:

LONG SCardFreeMemory ( SCARDCONTEXT  hContext,
LPCVOID  pvMem 
)

Releases memory that has been returned from the resource manager using the SCARD_AUTOALLOCATE length designator.

Parameters:
[in] hContext Connection context to the PC/SC Resource Manager.
[in] pvMem pointer to allocated memory
Returns:
Error code.
Return values:
SCARD_S_SUCCESS Successful (SCARD_S_SUCCESS)

Definition at line 3293 of file winscard_clnt.c.

References SCARD_E_INVALID_HANDLE, SCARD_S_SUCCESS, SCardCheckDaemonAvailability(), and SCardGetContextIndice().

Here is the call graph for this function:

LONG SCardGetAttrib ( SCARDHANDLE  hCard,
DWORD  dwAttrId,
LPBYTE  pbAttr,
LPDWORD  pcbAttrLen 
)

This function get an attribute from the IFD Handler (reader driver).

The list of possible attributes is available in the file reader.h.

If *pcbAttrLen is equal to SCARD_AUTOALLOCATE then the function will allocate itself the needed memory. Use SCardFreeMemory() to release it.

Parameters:
[in] hCard Connection made from SCardConnect().
[in] dwAttrId Identifier for the attribute to get.
Not all the dwAttrId values listed above may be implemented in the IFD Handler you are using. And some dwAttrId values not listed here may be implemented.

Parameters:
[out] pbAttr Pointer to a buffer that receives the attribute.
pcbAttrLen [inout] Length of the pbAttr buffer in bytes.
Returns:
Error code.
Return values:
SCARD_S_SUCCESS Successful (SCARD_S_SUCCESS)
SCARD_E_INSUFFICIENT_BUFFER Reader buffer not large enough (SCARD_E_INSUFFICIENT_BUFFER)
SCARD_E_INVALID_HANDLE Invalid hCard handle (SCARD_E_INVALID_HANDLE)
SCARD_E_NO_SERVICE The server is not runing (SCARD_E_NO_SERVICE)
SCARD_E_NOT_TRANSACTED Data exchange not successful (SCARD_E_NOT_TRANSACTED)
SCARD_E_READER_UNAVAILABLE The reader has been removed (SCARD_E_READER_UNAVAILABLE)
SCARD_F_COMM_ERROR An internal communications error has been detected (SCARD_F_COMM_ERROR)
 LONG rv;
 SCARDCONTEXT hContext;
 SCARDHANDLE hCard;
 DWORD dwActiveProtocol;
 unsigned char pbAtr[MAX_ATR_SIZE];
 DWORD dwAtrLen;
 ...
 rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
 rv = SCardConnect(hContext, "Reader X", SCARD_SHARE_SHARED,
          SCARD_PROTOCOL_RAW, &hCard, &dwActiveProtocol);
 rv = SCardGetAttrib(hCard, SCARD_ATTR_ATR_STRING, pbAtr, &dwAtrLen);

 LONG rv;
 SCARDCONTEXT hContext;
 SCARDHANDLE hCard;
 DWORD dwActiveProtocol;
 unsigned char *pbAttr;
 DWORD dwAttrLen;
 ...
 rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
 rv = SCardConnect(hContext, "Reader X", SCARD_SHARE_SHARED,
          SCARD_PROTOCOL_RAW, &hCard, &dwActiveProtocol);
 dwAttrLen = SCARD_AUTOALLOCATE;
 rv = SCardGetAttrib(hCard, SCARD_ATTR_ATR_STRING, (unsigned char *)&pbAttr, &dwAttrLen);

Definition at line 2629 of file winscard_clnt.c.

References IFDGetCapabilities(), MAX_BUFFER_SIZE, SCARD_AUTOALLOCATE, SCARD_E_INVALID_HANDLE, SCARD_E_INVALID_PARAMETER, SCARD_E_NO_MEMORY, SCARD_E_NOT_TRANSACTED, SCARD_E_UNSUPPORTED_FEATURE, SCARD_GET_ATTRIB, and SCARD_S_SUCCESS.

Referenced by MSGFunctionDemarshall().

Here is the call graph for this function:

LONG SCardGetStatusChange ( SCARDCONTEXT  hContext,
DWORD  dwTimeout,
LPSCARD_READERSTATE_A  rgReaderStates,
DWORD  cReaders 
)

This function receives a structure or list of structures containing reader names.

It then blocks for a change in state to occur on any of the OR'd values contained in dwCurrentState for a maximum blocking time of dwTimeout or forever if INFINITE is used.

The new event state will be contained in dwEventState. A status change might be a card insertion or removal event, a change in ATR, etc.

To wait for a reader event (reader added or removed) you may use the special reader name "\\?PnP?\Notification". If a reader event occurs the state of this reader will change and the bit SCARD_STATE_CHANGED will be set.

 typedef struct {
   LPCSTR szReader;          // Reader name
   LPVOID pvUserData;         // User defined data
   DWORD dwCurrentState;      // Current state of reader
   DWORD dwEventState;        // Reader state after a state change
   DWORD cbAtr;               // ATR Length, usually MAX_ATR_SIZE
   BYTE rgbAtr[MAX_ATR_SIZE]; // ATR Value
 } SCARD_READERSTATE;
 ...
 typedef SCARD_READERSTATE *PSCARD_READERSTATE, **LPSCARD_READERSTATE;
 ...

Value of dwCurrentState and dwEventState:

  • SCARD_STATE_UNAWARE The application is unaware of the current state, and would like to know. The use of this value results in an immediate return from state transition monitoring services. This is represented by all bits set to zero.
  • SCARD_STATE_IGNORE This reader should be ignored
  • SCARD_STATE_CHANGED There is a difference between the state believed by the application, and the state known by the resource manager. When this bit is set, the application may assume a significant state change has occurred on this reader.
  • SCARD_STATE_UNKNOWN The given reader name is not recognized by the resource manager. If this bit is set, then SCARD_STATE_CHANGED and SCARD_STATE_IGNORE will also be set
  • SCARD_STATE_UNAVAILABLE The actual state of this reader is not available. If this bit is set, then all the following bits are clear.
  • SCARD_STATE_EMPTY There is no card in the reader. If this bit is set, all the following bits will be clear
  • SCARD_STATE_PRESENT There is a card in the reader
  • SCARD_STATE_ATRMATCH There is a card in the reader with an ATR matching one of the target cards. If this bit is set, SCARD_STATE_PRESENT will also be set. This bit is only returned on the SCardLocateCards() function.
  • SCARD_STATE_EXCLUSIVE The card in the reader is allocated for exclusive use by another application. If this bit is set, SCARD_STATE_PRESENT will also be set.
  • SCARD_STATE_INUSE The card in the reader is in use by one or more other applications, but may be connected to in shared mode. If this bit is set, SCARD_STATE_PRESENT will also be set.
  • SCARD_STATE_MUTE There is an unresponsive card in the reader.

Parameters:
[in] hContext Connection context to the PC/SC Resource Manager.
[in] dwTimeout Maximum waiting time (in miliseconds) for status change, zero (or INFINITE) for infinite.
rgReaderStates [inout] Structures of readers with current states.
[in] cReaders Number of structures.
Returns:
Error code.
Return values:
SCARD_S_SUCCESS Successful (SCARD_S_SUCCESS)
SCARD_E_NO_SERVICE Server is not running (SCARD_E_NO_SERVICE)
SCARD_E_INVALID_PARAMETER rgReaderStates is NULL and cReaders > 0 (SCARD_E_INVALID_PARAMETER)
SCARD_E_INVALID_VALUE Invalid States, reader name, etc (SCARD_E_INVALID_VALUE)
SCARD_E_INVALID_HANDLE Invalid hContext handle (SCARD_E_INVALID_HANDLE)
SCARD_E_READER_UNAVAILABLE The reader is unavailable (SCARD_E_READER_UNAVAILABLE)
SCARD_E_TIMEOUT The user-specified timeout value has expired (SCARD_E_TIMEOUT)
 SCARDCONTEXT hContext;
 SCARD_READERSTATE_A rgReaderStates[2];
 LONG rv;
 ...
 rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
 ...
 rgReaderStates[0].szReader = "Reader X";
 rgReaderStates[0].dwCurrentState = SCARD_STATE_UNAWARE;

 rgReaderStates[1].szReader = "\\\\?PnP?\\Notification";
 rgReaderStates[1].dwCurrentState = SCARD_STATE_UNAWARE;
 ...
 rv = SCardGetStatusChange(hContext, INFINITE, rgReaderStates, 2);
 printf("reader state: 0x%04X\n", rgReaderStates[0].dwEventState);
 printf("reader state: 0x%04X\n", rgReaderStates[1].dwEventState);

Definition at line 1860 of file winscard_clnt.c.

References BLOCK_STATUS_BLOCKING, BLOCK_STATUS_RESUME, INFINITE, PCSCLITE_MAX_READERS_CONTEXTS, PCSCLITE_STATUS_POLL_RATE, psContextMap, SCARD_ABSENT, SCARD_E_CANCELLED, SCARD_E_INVALID_HANDLE, SCARD_E_INVALID_PARAMETER, SCARD_E_INVALID_VALUE, SCARD_E_READER_UNAVAILABLE, SCARD_E_TIMEOUT, SCARD_PRESENT, SCARD_S_SUCCESS, SCARD_STATE_ATRMATCH, SCARD_STATE_CHANGED, SCARD_STATE_EMPTY, SCARD_STATE_EXCLUSIVE, SCARD_STATE_IGNORE, SCARD_STATE_INUSE, SCARD_STATE_MUTE, SCARD_STATE_PRESENT, SCARD_STATE_UNAVAILABLE, SCARD_STATE_UNAWARE, SCARD_STATE_UNKNOWN, SCARD_SWALLOWED, SCARD_UNKNOWN, SCardCheckDaemonAvailability(), SCardGetContextIndice(), and SYS_USleep().

Here is the call graph for this function:

LONG SCardIsValidContext ( SCARDCONTEXT  hContext  ) 

Check if a SCARDCONTEXT is valid.

Call this function to determine whether a smart card context handle is still valid. After a smart card context handle has been set by SCardEstablishContext(), it may become not valid if the resource manager service has been shut down.

Parameters:
[in] hContext Connection context to the PC/SC Resource Manager.
Returns:
Error code.
Return values:
SCARD_S_SUCCESS Successful (SCARD_S_SUCCESS)
SCARD_E_INVALID_HANDLE Invalid Handle (SCARD_E_INVALID_HANDLE)
 SCARDCONTEXT hContext;
 LONG rv;
 ...
 rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
 rv = SCardIsValidContext(hContext);

Definition at line 3515 of file winscard_clnt.c.

References SCARD_E_INVALID_HANDLE, SCARD_S_SUCCESS, SCardCheckDaemonAvailability(), and SCardGetContextIndice().

Here is the call graph for this function:

LONG SCardListReaderGroups ( SCARDCONTEXT  hContext,
LPSTR  mszGroups,
LPDWORD  pcchGroups 
)

This function returns a list of currently available reader groups on the system.

mszGroups is a pointer to a character string that is allocated by the application. If the application sends mszGroups as NULL then this function will return the size of the buffer needed to allocate in pcchGroups.

The group names is a multi-string and separated by a nul character ('\0') and ended by a double nul character like "SCard$DefaultReaders\\0Group 2\\0\\0".

If *pcchGroups is equal to SCARD_AUTOALLOCATE then the function will allocate itself the needed memory. Use SCardFreeMemory() to release it.

Parameters:
[in] hContext Connection context to the PC/SC Resource Manager.
[out] mszGroups List of groups to list readers.
pcchGroups [inout] Size of multi-string buffer including NUL's.
Returns:
Error code.
Return values:
SCARD_S_SUCCESS Successful (SCARD_S_SUCCESS)
SCARD_E_INSUFFICIENT_BUFFER Reader buffer not large enough (SCARD_E_INSUFFICIENT_BUFFER)
SCARD_E_INVALID_HANDLE Invalid Scope Handle (SCARD_E_INVALID_HANDLE)
SCARD_E_NO_SERVICE The server is not runing (SCARD_E_NO_SERVICE)
 SCARDCONTEXT hContext;
 LPSTR mszGroups;
 DWORD dwGroups;
 LONG rv;
 ...
 rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
 rv = SCardListReaderGroups(hContext, NULL, &dwGroups);
 mszGroups = malloc(sizeof(char)*dwGroups);
 rv = SCardListReaderGroups(hContext, mszGroups, &dwGroups);

 SCARDCONTEXT hContext;
 LPSTR mszGroups;
 DWORD dwGroups;
 LONG rv;
 ...
 rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
 dwGroups = SCARD_AUTOALLOCATE;
 rv = SCardListReaderGroups(hContext, (LPSTR)&mszGroups, &dwGroups);
 rv = SCardFreeMemory(hContext, mszGroups);

Definition at line 3367 of file winscard_clnt.c.

References psContextMap, SCARD_AUTOALLOCATE, SCARD_E_INSUFFICIENT_BUFFER, SCARD_E_INVALID_HANDLE, SCARD_E_INVALID_PARAMETER, SCARD_E_NO_MEMORY, SCARD_S_SUCCESS, SCardCheckDaemonAvailability(), and SCardGetContextIndice().

Here is the call graph for this function:

LONG SCardListReaders ( SCARDCONTEXT  hContext,
LPCSTR  mszGroups,
LPSTR  mszReaders,
LPDWORD  pcchReaders 
)

This function returns a list of currently available readers on the system.

mszReaders is a pointer to a character string that is allocated by the application. If the application sends mszGroups and mszReaders as NULL then this function will return the size of the buffer needed to allocate in pcchReaders.

If *pcchReaders is equal to SCARD_AUTOALLOCATE then the function will allocate itself the needed memory. Use SCardFreeMemory() to release it.

Parameters:
[in] hContext Connection context to the PC/SC Resource Manager.
[in] mszGroups List of groups to list readers (not used).
[out] mszReaders Multi-string with list of readers.
pcchReaders [inout] Size of multi-string buffer including NULL's.
Returns:
Connection status.
Return values:
SCARD_S_SUCCESS Successful (SCARD_S_SUCCESS)
SCARD_E_INVALID_HANDLE Invalid Scope Handle (SCARD_E_INVALID_HANDLE)
SCARD_E_INVALID_PARAMETER pcchReaders is NULL (SCARD_E_INVALID_PARAMETER)
SCARD_E_INSUFFICIENT_BUFFER Reader buffer not large enough (SCARD_E_INSUFFICIENT_BUFFER)
SCARD_E_NO_SERVICE The server is not runing (SCARD_E_NO_SERVICE)
 SCARDCONTEXT hContext;
 LPSTR mszReaders;
 DWORD dwReaders;
 LONG rv;
 ...
 rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
 rv = SCardListReaders(hContext, NULL, NULL, &dwReaders);
 mszReaders = malloc(sizeof(char)*dwReaders);
 rv = SCardListReaders(hContext, NULL, mszReaders, &dwReaders);

 SCARDCONTEXT hContext;
 LPSTR mszReaders;
 DWORD dwReaders;
 LONG rv;
 ...
 rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
 dwReaders = SCARD_AUTOALLOCATE
 rv = SCardListReaders(hContext, NULL, (LPSTR)&mszReaders, &dwReaders);
 rv = SCardFreeMemory(hContext, mszReaders);

Definition at line 3174 of file winscard_clnt.c.

References psContextMap, SCARD_AUTOALLOCATE, SCARD_E_INSUFFICIENT_BUFFER, SCARD_E_INVALID_HANDLE, SCARD_E_INVALID_PARAMETER, SCARD_E_NO_MEMORY, SCARD_E_NO_READERS_AVAILABLE, SCARD_S_SUCCESS, SCardCheckDaemonAvailability(), and SCardGetContextIndice().

Here is the call graph for this function:

LONG SCardReconnect ( SCARDHANDLE  hCard,
DWORD  dwShareMode,
DWORD  dwPreferredProtocols,
DWORD  dwInitialization,
LPDWORD  pdwActiveProtocol 
)

This function reestablishes a connection to a reader that was previously connected to using SCardConnect().

In a multi application environment it is possible for an application to reset the card in shared mode. When this occurs any other application trying to access certain commands will be returned the value SCARD_W_RESET_CARD. When this occurs SCardReconnect() must be called in order to acknowledge that the card was reset and allow it to change it's state accordingly.

Parameters:
[in] hCard Handle to a previous call to connect.
[in] dwShareMode Mode of connection type: exclusive/shared.
[in] dwPreferredProtocols Desired protocol use.
  • SCARD_PROTOCOL_T0 - Use the T=0 protocol.
  • SCARD_PROTOCOL_T1 - Use the T=1 protocol.
  • SCARD_PROTOCOL_RAW - Use with memory type cards. dwPreferredProtocols is a bit mask of acceptable protocols for the connection. You can use (SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1) if you do not have a preferred protocol.
[in] dwInitialization Desired action taken on the card/reader.
[out] pdwActiveProtocol Established protocol to this connection.
Returns:
Error code.
Return values:
SCARD_S_SUCCESS Successful (SCARD_S_SUCCESS)
SCARD_E_INVALID_HANDLE Invalid hCard handle (SCARD_E_INVALID_HANDLE)
SCARD_E_INVALID_PARAMETER phContext is null. (SCARD_E_INVALID_PARAMETER)
SCARD_E_INVALID_VALUE Invalid sharing mode, requested protocol, or reader name (SCARD_E_INVALID_VALUE)
SCARD_E_NO_SERVICE The server is not runing (SCARD_E_NO_SERVICE)
SCARD_E_NOT_READY Could not allocate the desired port (SCARD_E_NOT_READY)
SCARD_E_READER_UNAVAILABLE The reader has been removed (SCARD_E_READER_UNAVAILABLE)
SCARD_E_UNSUPPORTED_FEATURE Protocol not supported (SCARD_E_UNSUPPORTED_FEATURE)
SCARD_E_SHARING_VIOLATION Someone else has exclusive rights (SCARD_E_SHARING_VIOLATION)
 SCARDCONTEXT hContext;
 SCARDHANDLE hCard;
 DWORD dwActiveProtocol, dwSendLength, dwRecvLength;
 LONG rv;
 BYTE pbRecvBuffer[10];
 BYTE pbSendBuffer[] = {0xC0, 0xA4, 0x00, 0x00, 0x02, 0x3F, 0x00};
 ...
 rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
 rv = SCardConnect(hContext, "Reader X", SCARD_SHARE_SHARED,
          SCARD_PROTOCOL_T0, &hCard, &dwActiveProtocol);
 ...
 dwSendLength = sizeof(pbSendBuffer);
 dwRecvLength = sizeof(pbRecvBuffer);
 rv = SCardTransmit(hCard, SCARD_PCI_T0, pbSendBuffer, dwSendLength,
          &pioRecvPci, pbRecvBuffer, &dwRecvLength);
 / * Card has been reset by another application * /
 if (rv == SCARD_W_RESET_CARD)
 {
   rv = SCardReconnect(hCard, SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0,
            SCARD_RESET_CARD, &dwActiveProtocol);
 }

Definition at line 898 of file winscard_clnt.c.

References IFDPowerICC(), IFDStatusICC(), MAX_ATR_SIZE, PCSCLITE_CLIENT_ATTEMPTS, PCSCLITE_MAX_READERS_CONTEXTS, PHGetAvailableProtocols(), PHGetDefaultProtocol(), PHSetProtocol(), psContextMap, SCARD_ABSENT, SCARD_E_INVALID_HANDLE, SCARD_E_INVALID_PARAMETER, SCARD_E_INVALID_VALUE, SCARD_E_NO_SERVICE, SCARD_E_NO_SMARTCARD, SCARD_E_PROTO_MISMATCH, SCARD_E_READER_UNAVAILABLE, SCARD_E_SHARING_VIOLATION, SCARD_EXCLUSIVE_CONTEXT, SCARD_F_COMM_ERROR, SCARD_F_INTERNAL_ERROR, SCARD_LAST_CONTEXT, SCARD_LEAVE_CARD, SCARD_NEGOTIABLE, SCARD_POWERED, SCARD_PRESENT, SCARD_PROTOCOL_ANY_OLD, SCARD_PROTOCOL_RAW, SCARD_PROTOCOL_T0, SCARD_PROTOCOL_T1, SCARD_PROTOCOL_UNDEFINED, SCARD_RECONNECT, SCARD_RESET, SCARD_RESET_CARD, SCARD_S_SUCCESS, SCARD_SHARE_DIRECT, SCARD_SHARE_EXCLUSIVE, SCARD_SHARE_SHARED, SCARD_SPECIFIC, SCARD_SWALLOWED, SCARD_UNKNOWN, SCARD_UNPOWER_CARD, SCARD_W_REMOVED_CARD, SCARD_W_RESET_CARD, SCARD_W_UNRESPONSIVE_CARD, SCardCheckDaemonAvailability(), SHMClientRead(), StatSynchronize(), and WrapSHMWrite().

Referenced by MSGFunctionDemarshall().

Here is the call graph for this function:

LONG SCardReleaseContext ( SCARDCONTEXT  hContext  ) 

This function destroys a communication context to the PC/SC Resource Manager.

This must be the last function called in a PC/SC application.

Parameters:
[in] hContext Connection context to be closed.
Returns:
Connection status.
Return values:
SCARD_S_SUCCESS Successful (SCARD_S_SUCCESS)
SCARD_E_NO_SERVICE The server is not runing (SCARD_E_NO_SERVICE)
SCARD_E_INVALID_HANDLE Invalid hContext handle (SCARD_E_INVALID_HANDLE)
SCARD_F_COMM_ERROR An internal communications error has been detected (SCARD_F_COMM_ERROR)
 SCARDCONTEXT hContext;
 LONG rv;
 ...
 rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
 rv = SCardReleaseContext(hContext);

Definition at line 569 of file winscard_clnt.c.

References PCSCLITE_CLIENT_ATTEMPTS, PCSCLITE_MCLIENT_ATTEMPTS, psContextMap, SCARD_E_INVALID_HANDLE, SCARD_E_NO_SERVICE, SCARD_F_COMM_ERROR, SCARD_RELEASE_CONTEXT, SCARD_S_SUCCESS, SCardCheckDaemonAvailability(), SCardGetContextIndice(), SCardLockThread(), SCardRemoveContext(), SCardUnlockThread(), SHMClientRead(), and WrapSHMWrite().

Referenced by MSGFunctionDemarshall().

Here is the call graph for this function:

LONG SCardSetAttrib ( SCARDHANDLE  hCard,
DWORD  dwAttrId,
LPCBYTE  pbAttr,
DWORD  cbAttrLen 
)

This function set an attribute of the IFD Handler.

The list of attributes you can set is dependent on the IFD Handler you are using.

Parameters:
[in] hCard Connection made from SCardConnect().
[in] dwAttrId Identifier for the attribute to set.
[in] pbAttr Pointer to a buffer that receives the attribute.
[in] cbAttrLen Length of the pbAttr buffer in bytes.
Returns:
Error code
Return values:
SCARD_S_SUCCESS Successful (SCARD_S_SUCCESS)
SCARD_E_INVALID_HANDLE Invalid hCard handle (SCARD_E_INVALID_HANDLE)
SCARD_E_NO_SERVICE The server is not runing (SCARD_E_NO_SERVICE)
SCARD_E_NOT_TRANSACTED Data exchange not successful (SCARD_E_NOT_TRANSACTED)
SCARD_E_READER_UNAVAILABLE The reader has been removed (SCARD_E_READER_UNAVAILABLE)
SCARD_F_COMM_ERROR An internal communications error has been detected (SCARD_F_COMM_ERROR)
 LONG rv;
 SCARDCONTEXT hContext;
 SCARDHANDLE hCard;
 DWORD dwActiveProtocol;
 unsigned char pbAtr[MAX_ATR_SIZE];
 DWORD dwAtrLen;
 ...
 rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
 rv = SCardConnect(hContext, "Reader X", SCARD_SHARE_SHARED,
          SCARD_PROTOCOL_RAW, &hCard, &dwActiveProtocol);
 rv = SCardSetAttrib(hCard, 0x42000001, "\x12\x34\x56", 3);

Definition at line 2704 of file winscard_clnt.c.

References IFDSetCapabilities(), SCARD_E_INVALID_HANDLE, SCARD_E_INVALID_PARAMETER, SCARD_E_NOT_TRANSACTED, SCARD_E_UNSUPPORTED_FEATURE, SCARD_S_SUCCESS, and SCARD_SET_ATTRIB.

Referenced by MSGFunctionDemarshall().

Here is the call graph for this function:

LONG SCardSetTimeout ( SCARDCONTEXT  hContext,
DWORD  dwTimeout 
)

The function does not do anything except returning SCARD_S_SUCCESS.

Deprecated:
This function is not in Microsoft(R) WinSCard API and is deprecated in pcsc-lite API.
Parameters:
[in] hContext Connection context to the PC/SC Resource Manager.
[in] dwTimeout New timeout value.
Returns:
Error code.
Return values:
SCARD_S_SUCCESS Successful (SCARD_S_SUCCESS)

Definition at line 665 of file winscard_clnt.c.

References SCARD_E_UNSUPPORTED_FEATURE, and SCARD_S_SUCCESS.

LONG SCardStatus ( SCARDHANDLE  hCard,
LPSTR  mszReaderName,
LPDWORD  pcchReaderLen,
LPDWORD  pdwState,
LPDWORD  pdwProtocol,
LPBYTE  pbAtr,
LPDWORD  pcbAtrLen 
)

This function returns the current status of the reader connected to by hCard.

It's friendly name will be stored in szReaderName. pcchReaderLen will be the size of the allocated buffer for szReaderName, while pcbAtrLen will be the size of the allocated buffer for pbAtr. If either of these is too small, the function will return with SCARD_E_INSUFFICIENT_BUFFER and the necessary size in pcchReaderLen and pcbAtrLen. The current state, and protocol will be stored in pdwState and pdwProtocol respectively.

If *pcchReaderLen is equal to SCARD_AUTOALLOCATE then the function will allocate itself the needed memory for mszReaderName. Use SCardFreeMemory() to release it.

If *pcbAtrLen is equal to SCARD_AUTOALLOCATE then the function will allocate itself the needed memory for pbAtr. Use SCardFreeMemory() to release it.

Parameters:
[in] hCard Connection made from SCardConnect().
mszReaderName [inout] Friendly name of this reader.
pcchReaderLen [inout] Size of the szReaderName multistring.
[out] pdwState Current state of this reader. pdwState is a DWORD possibly OR'd with the following values:
  • SCARD_ABSENT - There is no card in the reader.
  • SCARD_PRESENT - There is a card in the reader, but it has not been moved into position for use.
  • SCARD_SWALLOWED - There is a card in the reader in position for use. The card is not powered.
  • SCARD_POWERED - Power is being provided to the card, but the reader driver is unaware of the mode of the card.
  • SCARD_NEGOTIABLE - The card has been reset and is awaiting PTS negotiation.
  • SCARD_SPECIFIC - The card has been reset and specific communication protocols have been established.
[out] pdwProtocol Current protocol of this reader.
[out] pbAtr Current ATR of a card in this reader.
[out] pcbAtrLen Length of ATR.
Returns:
Error code.
Return values:
SCARD_S_SUCCESS Successful (SCARD_S_SUCCESS)
SCARD_E_INSUFFICIENT_BUFFER Not enough allocated memory for szReaderName or for pbAtr (SCARD_E_INSUFFICIENT_BUFFER)
SCARD_E_INVALID_HANDLE Invalid hCard handle (SCARD_E_INVALID_HANDLE)
SCARD_E_INVALID_PARAMETER pcchReaderLen or pcbAtrLen is NULL (SCARD_E_INVALID_PARAMETER)
SCARD_E_NO_SERVICE The server is not runing (SCARD_E_NO_SERVICE)
SCARD_E_READER_UNAVAILABLE The reader has been removed (SCARD_E_READER_UNAVAILABLE)
SCARD_F_COMM_ERROR An internal communications error has been detected (SCARD_F_COMM_ERROR)
SCARD_W_REMOVED_CARD The smart card has been removed (SCARD_W_REMOVED_CARD)
SCARD_W_RESET_CARD The smart card has been reset (SCARD_W_RESET_CARD)
 SCARDCONTEXT hContext;
 SCARDHANDLE hCard;
 DWORD dwActiveProtocol;
 DWORD dwState, dwProtocol, dwAtrLen, dwReaderLen;
 BYTE pbAtr[MAX_ATR_SIZE];
 ...
 rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
 rv = SCardConnect(hContext, "Reader X", SCARD_SHARE_SHARED,
          SCARD_PROTOCOL_T0, &hCard, &dwActiveProtocol);
 ...
 dwAtrLen = sizeof(pbAtr);
 rv = SCardStatus(hCard, NULL, &dwReaderLen, &dwState, &dwProtocol, pbAtr, &dwAtrLen);

 SCARDCONTEXT hContext;
 SCARDHANDLE hCard;
 DWORD dwActiveProtocol;
 DWORD dwState, dwProtocol, dwAtrLen, dwReaderLen;
 BYTE *pbAtr = NULL;
 char *pcReader = NULL;
 ...
 rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
 rv = SCardConnect(hContext, "Reader X", SCARD_SHARE_SHARED,
          SCARD_PROTOCOL_T0, &hCard, &dwActiveProtocol);
 ...
 dwReaderLen = SCARD_AUTOALLOCATE;
 dwAtrLen = SCARD_AUTOALLOCATE;
 rv = SCardStatus(hCard, (LPSTR)&pcReader, &dwReaderLen, &dwState,
          &dwProtocol, (LPBYTE)&pbAtr, &dwAtrLen);

Definition at line 1524 of file winscard_clnt.c.

References MAX_ATR_SIZE, MAX_BUFFER_SIZE, PCSCLITE_CLIENT_ATTEMPTS, PCSCLITE_MAX_READERS_CONTEXTS, psContextMap, SCARD_AUTOALLOCATE, SCARD_E_INSUFFICIENT_BUFFER, SCARD_E_INVALID_HANDLE, SCARD_E_INVALID_PARAMETER, SCARD_E_NO_MEMORY, SCARD_E_NO_SERVICE, SCARD_E_READER_UNAVAILABLE, SCARD_F_COMM_ERROR, SCARD_F_INTERNAL_ERROR, SCARD_S_SUCCESS, SCARD_STATUS, SCardCheckDaemonAvailability(), SHMClientRead(), and WrapSHMWrite().

Referenced by MSGFunctionDemarshall().

Here is the call graph for this function:

LONG SCardTransmit ( SCARDHANDLE  hCard,
LPCSCARD_IO_REQUEST  pioSendPci,
LPCBYTE  pbSendBuffer,
DWORD  cbSendLength,
LPSCARD_IO_REQUEST  pioRecvPci,
LPBYTE  pbRecvBuffer,
LPDWORD  pcbRecvLength 
)

This function sends an APDU to the smart card contained in the reader connected to by SCardConnect().

The card responds from the APDU and stores this response in pbRecvBuffer and it's length in pcbRecvLength. pioSendPci and pioRecvPci are structures containing the following:

 typedef struct {
    DWORD dwProtocol;    // SCARD_PROTOCOL_T0 or SCARD_PROTOCOL_T1
    DWORD cbPciLength;   // Length of this structure - not used
 } SCARD_IO_REQUEST;

Parameters:
[in] hCard Connection made from SCardConnect().
pioSendPci [inout] Structure of Protocol Control Information.
[in] pbSendBuffer APDU to send to the card.
[in] cbSendLength Length of the APDU.
pioRecvPci [inout] Structure of protocol information.
[out] pbRecvBuffer Response from the card.
pcbRecvLength [inout] Length of the response.
Returns:
Error code.
Return values:
SCARD_S_SUCCESS Successful (SCARD_S_SUCCESS)
SCARD_E_INSUFFICIENT_BUFFER cbSendLength or cbRecvLength are too big (SCARD_E_INSUFFICIENT_BUFFER)
SCARD_E_INVALID_HANDLE Invalid hCard handle (SCARD_E_INVALID_HANDLE)
SCARD_E_INVALID_PARAMETER pbSendBuffer or pbRecvBuffer or pcbRecvLength or pioSendPci is null (SCARD_E_INVALID_PARAMETER)
SCARD_E_INVALID_VALUE Invalid Protocol, reader name, etc (SCARD_E_INVALID_VALUE)
SCARD_E_NO_SERVICE The server is not runing (SCARD_E_NO_SERVICE)
SCARD_E_NOT_TRANSACTED APDU exchange not successful (SCARD_E_NOT_TRANSACTED)
SCARD_E_PROTO_MISMATCH Connect protocol is different than desired (SCARD_E_PROTO_MISMATCH)
SCARD_E_READER_UNAVAILABLE The reader has been removed (SCARD_E_READER_UNAVAILABLE)
SCARD_F_COMM_ERROR An internal communications error has been detected (SCARD_F_COMM_ERROR)
SCARD_W_RESET_CARD The card has been reset by another application (SCARD_W_RESET_CARD)
SCARD_W_REMOVED_CARD The card has been removed from the reader (SCARD_W_REMOVED_CARD)
 LONG rv;
 SCARDCONTEXT hContext;
 SCARDHANDLE hCard;
 DWORD dwActiveProtocol, dwSendLength, dwRecvLength;
 SCARD_IO_REQUEST pioRecvPci;
 BYTE pbRecvBuffer[10];
 BYTE pbSendBuffer[] = { 0xC0, 0xA4, 0x00, 0x00, 0x02, 0x3F, 0x00 };
 ...
 rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
 rv = SCardConnect(hContext, "Reader X", SCARD_SHARE_SHARED,
          SCARD_PROTOCOL_T0, &hCard, &dwActiveProtocol);
 dwSendLength = sizeof(pbSendBuffer);
 dwRecvLength = sizeof(pbRecvBuffer);
 rv = SCardTransmit(hCard, SCARD_PCI_T0, pbSendBuffer, dwSendLength,
          &pioRecvPci, pbRecvBuffer, &dwRecvLength);

Definition at line 2887 of file winscard_clnt.c.

References SCARD_IO_REQUEST::cbPciLength, _psContextMap::dwClientID, SCARD_IO_REQUEST::dwProtocol, IFDTransmit(), MAX_BUFFER_SIZE, MAX_BUFFER_SIZE_EXTENDED, PCSCLITE_CLIENT_ATTEMPTS, PCSCLITE_MAX_MESSAGE_SIZE, psContextMap, SCARD_ABSENT, SCARD_E_INSUFFICIENT_BUFFER, SCARD_E_INVALID_HANDLE, SCARD_E_INVALID_PARAMETER, SCARD_E_NO_SERVICE, SCARD_E_NO_SMARTCARD, SCARD_E_NOT_TRANSACTED, SCARD_E_PROTO_MISMATCH, SCARD_E_READER_UNAVAILABLE, SCARD_F_COMM_ERROR, SCARD_PROTOCOL_ANY, SCARD_PROTOCOL_ANY_OLD, SCARD_PROTOCOL_RAW, SCARD_PROTOCOL_T1, SCARD_S_SUCCESS, SCARD_TRANSMIT, SCARD_TRANSMIT_EXTENDED, SCardCheckDaemonAvailability(), SHMClientRead(), SHMMessageReceive(), and WrapSHMWrite().

Referenced by MSGFunctionDemarshall().

Here is the call graph for this function:


Generated on Mon Aug 17 01:00:17 2009 for pcsc-lite by  doxygen 1.5.9