FreeRDP
|
#include <winpr/config.h>
#include <stdio.h>
#include <stdlib.h>
#include <winpr/crt.h>
#include <winpr/assert.h>
#include <winpr/synch.h>
#include <winpr/library.h>
#include <winpr/smartcard.h>
#include <winpr/collections.h>
#include <winpr/environment.h>
#include "smartcard_pcsc.h"
#include "../log.h"
Macros | |
#define | TAG WINPR_TAG("smartcard") |
#define | PCSC_SCARD_PCI_T0 (&g_PCSC_rgSCardT0Pci) |
#define | PCSC_SCARD_PCI_T1 (&g_PCSC_rgSCardT1Pci) |
#define | PCSC_SCARD_PCI_RAW (&g_PCSC_rgSCardRawPci) |
#define | ARRAY_LENGTH(a) (sizeof(a) / sizeof(a)[0]) |
Typedefs | |
typedef PCSC_LONG(* | fnPCSCSCardEstablishContext) (PCSC_DWORD dwScope, LPCVOID pvReserved1, LPCVOID pvReserved2, LPSCARDCONTEXT phContext) |
typedef PCSC_LONG(* | fnPCSCSCardReleaseContext) (SCARDCONTEXT hContext) |
typedef PCSC_LONG(* | fnPCSCSCardIsValidContext) (SCARDCONTEXT hContext) |
typedef PCSC_LONG(* | fnPCSCSCardConnect) (SCARDCONTEXT hContext, LPCSTR szReader, PCSC_DWORD dwShareMode, PCSC_DWORD dwPreferredProtocols, LPSCARDHANDLE phCard, PCSC_LPDWORD pdwActiveProtocol) |
typedef PCSC_LONG(* | fnPCSCSCardReconnect) (SCARDHANDLE hCard, PCSC_DWORD dwShareMode, PCSC_DWORD dwPreferredProtocols, PCSC_DWORD dwInitialization, PCSC_LPDWORD pdwActiveProtocol) |
typedef PCSC_LONG(* | fnPCSCSCardDisconnect) (SCARDHANDLE hCard, PCSC_DWORD dwDisposition) |
typedef PCSC_LONG(* | fnPCSCSCardBeginTransaction) (SCARDHANDLE hCard) |
typedef PCSC_LONG(* | fnPCSCSCardEndTransaction) (SCARDHANDLE hCard, PCSC_DWORD dwDisposition) |
typedef PCSC_LONG(* | fnPCSCSCardStatus) (SCARDHANDLE hCard, LPSTR mszReaderName, PCSC_LPDWORD pcchReaderLen, PCSC_LPDWORD pdwState, PCSC_LPDWORD pdwProtocol, LPBYTE pbAtr, PCSC_LPDWORD pcbAtrLen) |
typedef PCSC_LONG(* | fnPCSCSCardGetStatusChange) (SCARDCONTEXT hContext, PCSC_DWORD dwTimeout, PCSC_SCARD_READERSTATE *rgReaderStates, PCSC_DWORD cReaders) |
typedef PCSC_LONG(* | fnPCSCSCardControl) (SCARDHANDLE hCard, PCSC_DWORD dwControlCode, LPCVOID pbSendBuffer, PCSC_DWORD cbSendLength, LPVOID pbRecvBuffer, PCSC_DWORD cbRecvLength, PCSC_LPDWORD lpBytesReturned) |
typedef PCSC_LONG(* | fnPCSCSCardTransmit) (SCARDHANDLE hCard, const PCSC_SCARD_IO_REQUEST *pioSendPci, LPCBYTE pbSendBuffer, PCSC_DWORD cbSendLength, PCSC_SCARD_IO_REQUEST *pioRecvPci, LPBYTE pbRecvBuffer, PCSC_LPDWORD pcbRecvLength) |
typedef PCSC_LONG(* | fnPCSCSCardListReaderGroups) (SCARDCONTEXT hContext, LPSTR mszGroups, PCSC_LPDWORD pcchGroups) |
typedef PCSC_LONG(* | fnPCSCSCardListReaders) (SCARDCONTEXT hContext, LPCSTR mszGroups, LPSTR mszReaders, PCSC_LPDWORD pcchReaders) |
typedef PCSC_LONG(* | fnPCSCSCardFreeMemory) (SCARDCONTEXT hContext, LPCVOID pvMem) |
typedef PCSC_LONG(* | fnPCSCSCardCancel) (SCARDCONTEXT hContext) |
typedef PCSC_LONG(* | fnPCSCSCardGetAttrib) (SCARDHANDLE hCard, PCSC_DWORD dwAttrId, LPBYTE pbAttr, PCSC_LPDWORD pcbAttrLen) |
typedef PCSC_LONG(* | fnPCSCSCardSetAttrib) (SCARDHANDLE hCard, PCSC_DWORD dwAttrId, LPCBYTE pbAttr, PCSC_DWORD cbAttrLen) |
Functions | |
static LONG WINAPI | PCSC_SCardFreeMemory_Internal (SCARDCONTEXT hContext, LPVOID pvMem) |
static LONG WINAPI | PCSC_SCardEstablishContext_Internal (DWORD dwScope, LPCVOID pvReserved1, LPCVOID pvReserved2, LPSCARDCONTEXT phContext) |
static LONG WINAPI | PCSC_SCardReleaseContext_Internal (SCARDCONTEXT hContext) |
static LONG | PCSC_SCard_LogError (const char *what) |
static LONG | PCSC_MapErrorCodeToWinSCard (PCSC_LONG errorCode) |
static DWORD | PCSC_ConvertCardStateToWinSCard (DWORD dwCardState, PCSC_LONG status) |
static DWORD | PCSC_ConvertProtocolsToWinSCard (PCSC_DWORD dwProtocols) |
static DWORD | PCSC_ConvertProtocolsFromWinSCard (DWORD dwProtocols) |
static PCSC_SCARDCONTEXT * | PCSC_GetCardContextData (SCARDCONTEXT hContext) |
static void | pcsc_cache_item_free (void *ptr) |
static PCSC_SCARDCONTEXT * | PCSC_EstablishCardContext (SCARDCONTEXT hContext) |
static void | PCSC_ReleaseCardContext (SCARDCONTEXT hContext) |
static BOOL | PCSC_LockCardContext (SCARDCONTEXT hContext) |
static BOOL | PCSC_UnlockCardContext (SCARDCONTEXT hContext) |
static PCSC_SCARDHANDLE * | PCSC_GetCardHandleData (SCARDHANDLE hCard) |
static SCARDCONTEXT | PCSC_GetCardContextFromHandle (SCARDHANDLE hCard) |
static BOOL | PCSC_WaitForCardAccess (SCARDCONTEXT hContext, SCARDHANDLE hCard, BOOL shared) |
static BOOL | PCSC_ReleaseCardAccess (SCARDCONTEXT hContext, SCARDHANDLE hCard) |
static PCSC_SCARDHANDLE * | PCSC_ConnectCardHandle (SCARDCONTEXT hSharedContext, SCARDHANDLE hCard) |
static void | PCSC_DisconnectCardHandle (SCARDHANDLE hCard) |
static BOOL | PCSC_AddMemoryBlock (SCARDCONTEXT hContext, void *pvMem) |
static void * | PCSC_RemoveMemoryBlock (SCARDCONTEXT hContext, void *pvMem) |
static LONG WINAPI | PCSC_SCardEstablishContext (DWORD dwScope, LPCVOID pvReserved1, LPCVOID pvReserved2, LPSCARDCONTEXT phContext) |
static LONG WINAPI | PCSC_SCardReleaseContext (SCARDCONTEXT hContext) |
static LONG WINAPI | PCSC_SCardIsValidContext (SCARDCONTEXT hContext) |
static LONG WINAPI | PCSC_SCardListReaderGroups_Internal (SCARDCONTEXT hContext, LPSTR mszGroups, LPDWORD pcchGroups) |
static LONG WINAPI | PCSC_SCardListReaderGroupsA (SCARDCONTEXT hContext, LPSTR mszGroups, LPDWORD pcchGroups) |
static LONG WINAPI | PCSC_SCardListReaderGroupsW (SCARDCONTEXT hContext, LPWSTR mszGroups, LPDWORD pcchGroups) |
static LONG WINAPI | PCSC_SCardListReaders_Internal (SCARDCONTEXT hContext, LPCSTR mszGroups, LPSTR mszReaders, LPDWORD pcchReaders) |
static LONG WINAPI | PCSC_SCardListReadersA (SCARDCONTEXT hContext, LPCSTR mszGroups, LPSTR mszReaders, LPDWORD pcchReaders) |
static LONG WINAPI | PCSC_SCardListReadersW (SCARDCONTEXT hContext, LPCWSTR mszGroups, LPWSTR mszReaders, LPDWORD pcchReaders) |
static const char * | findCardByAtr (LPCBYTE pbAtr) |
static LONG WINAPI | PCSC_SCardListCardsA (SCARDCONTEXT hContext, LPCBYTE pbAtr, LPCGUID rgquidInterfaces, DWORD cguidInterfaceCount, CHAR *mszCards, LPDWORD pcchCards) |
static LONG WINAPI | PCSC_SCardListCardsW (SCARDCONTEXT hContext, LPCBYTE pbAtr, LPCGUID rgquidInterfaces, DWORD cguidInterfaceCount, WCHAR *mszCards, LPDWORD pcchCards) |
static LONG WINAPI | PCSC_SCardListInterfacesA (SCARDCONTEXT hContext, LPCSTR szCard, LPGUID pguidInterfaces, LPDWORD pcguidInterfaces) |
static LONG WINAPI | PCSC_SCardListInterfacesW (SCARDCONTEXT hContext, LPCWSTR szCard, LPGUID pguidInterfaces, LPDWORD pcguidInterfaces) |
static LONG WINAPI | PCSC_SCardGetProviderIdA (SCARDCONTEXT hContext, LPCSTR szCard, LPGUID pguidProviderId) |
static LONG WINAPI | PCSC_SCardGetProviderIdW (SCARDCONTEXT hContext, LPCWSTR szCard, LPGUID pguidProviderId) |
static LONG WINAPI | PCSC_SCardGetCardTypeProviderNameA (SCARDCONTEXT hContext, LPCSTR szCardName, DWORD dwProviderId, CHAR *szProvider, LPDWORD pcchProvider) |
static LONG WINAPI | PCSC_SCardGetCardTypeProviderNameW (SCARDCONTEXT hContext, LPCWSTR szCardName, DWORD dwProviderId, WCHAR *szProvider, LPDWORD pcchProvider) |
static LONG WINAPI | PCSC_SCardIntroduceReaderGroupA (SCARDCONTEXT hContext, LPCSTR szGroupName) |
static LONG WINAPI | PCSC_SCardIntroduceReaderGroupW (SCARDCONTEXT hContext, LPCWSTR szGroupName) |
static LONG WINAPI | PCSC_SCardForgetReaderGroupA (SCARDCONTEXT hContext, LPCSTR szGroupName) |
static LONG WINAPI | PCSC_SCardForgetReaderGroupW (SCARDCONTEXT hContext, LPCWSTR szGroupName) |
static LONG WINAPI | PCSC_SCardIntroduceReaderA (SCARDCONTEXT hContext, LPCSTR szReaderName, LPCSTR szDeviceName) |
static LONG WINAPI | PCSC_SCardIntroduceReaderW (SCARDCONTEXT hContext, LPCWSTR szReaderName, LPCWSTR szDeviceName) |
static LONG WINAPI | PCSC_SCardForgetReaderA (SCARDCONTEXT hContext, LPCSTR szReaderName) |
static LONG WINAPI | PCSC_SCardForgetReaderW (SCARDCONTEXT hContext, LPCWSTR szReaderName) |
static LONG WINAPI | PCSC_SCardAddReaderToGroupA (SCARDCONTEXT hContext, LPCSTR szReaderName, LPCSTR szGroupName) |
static LONG WINAPI | PCSC_SCardAddReaderToGroupW (SCARDCONTEXT hContext, LPCWSTR szReaderName, LPCWSTR szGroupName) |
static LONG WINAPI | PCSC_SCardRemoveReaderFromGroupA (SCARDCONTEXT hContext, LPCSTR szReaderName, LPCSTR szGroupName) |
static LONG WINAPI | PCSC_SCardRemoveReaderFromGroupW (SCARDCONTEXT hContext, LPCWSTR szReaderName, LPCWSTR szGroupName) |
static LONG WINAPI | PCSC_SCardIntroduceCardTypeA (SCARDCONTEXT hContext, LPCSTR szCardName, LPCGUID pguidPrimaryProvider, LPCGUID rgguidInterfaces, DWORD dwInterfaceCount, LPCBYTE pbAtr, LPCBYTE pbAtrMask, DWORD cbAtrLen) |
static LONG WINAPI | PCSC_SCardIntroduceCardTypeW (SCARDCONTEXT hContext, LPCWSTR szCardName, LPCGUID pguidPrimaryProvider, LPCGUID rgguidInterfaces, DWORD dwInterfaceCount, LPCBYTE pbAtr, LPCBYTE pbAtrMask, DWORD cbAtrLen) |
static LONG WINAPI | PCSC_SCardSetCardTypeProviderNameA (SCARDCONTEXT hContext, LPCSTR szCardName, DWORD dwProviderId, LPCSTR szProvider) |
static LONG WINAPI | PCSC_SCardSetCardTypeProviderNameW (SCARDCONTEXT hContext, LPCWSTR szCardName, DWORD dwProviderId, LPCWSTR szProvider) |
static LONG WINAPI | PCSC_SCardForgetCardTypeA (SCARDCONTEXT hContext, LPCSTR szCardName) |
static LONG WINAPI | PCSC_SCardForgetCardTypeW (SCARDCONTEXT hContext, LPCWSTR szCardName) |
static LONG WINAPI | PCSC_SCardFreeMemory (SCARDCONTEXT hContext, LPVOID pvMem) |
static HANDLE WINAPI | PCSC_SCardAccessStartedEvent (void) |
static void WINAPI | PCSC_SCardReleaseStartedEvent (void) |
static LONG WINAPI | PCSC_SCardLocateCardsA (SCARDCONTEXT hContext, LPCSTR mszCards, LPSCARD_READERSTATEA rgReaderStates, DWORD cReaders) |
static LONG WINAPI | PCSC_SCardLocateCardsW (SCARDCONTEXT hContext, LPCWSTR mszCards, LPSCARD_READERSTATEW rgReaderStates, DWORD cReaders) |
static LONG WINAPI | PCSC_SCardLocateCardsByATRA (SCARDCONTEXT hContext, LPSCARD_ATRMASK rgAtrMasks, DWORD cAtrs, LPSCARD_READERSTATEA rgReaderStates, DWORD cReaders) |
static LONG WINAPI | PCSC_SCardLocateCardsByATRW (SCARDCONTEXT hContext, LPSCARD_ATRMASK rgAtrMasks, DWORD cAtrs, LPSCARD_READERSTATEW rgReaderStates, DWORD cReaders) |
static LONG WINAPI | PCSC_SCardGetStatusChange_Internal (SCARDCONTEXT hContext, DWORD dwTimeout, LPSCARD_READERSTATEA rgReaderStates, DWORD cReaders) |
static LONG WINAPI | PCSC_SCardGetStatusChangeA (SCARDCONTEXT hContext, DWORD dwTimeout, LPSCARD_READERSTATEA rgReaderStates, DWORD cReaders) |
static LONG WINAPI | PCSC_SCardGetStatusChangeW (SCARDCONTEXT hContext, DWORD dwTimeout, LPSCARD_READERSTATEW rgReaderStates, DWORD cReaders) |
static LONG WINAPI | PCSC_SCardCancel (SCARDCONTEXT hContext) |
static LONG WINAPI | PCSC_SCardConnect_Internal (SCARDCONTEXT hContext, LPCSTR szReader, DWORD dwShareMode, DWORD dwPreferredProtocols, LPSCARDHANDLE phCard, LPDWORD pdwActiveProtocol) |
static LONG WINAPI | PCSC_SCardConnectA (SCARDCONTEXT hContext, LPCSTR szReader, DWORD dwShareMode, DWORD dwPreferredProtocols, LPSCARDHANDLE phCard, LPDWORD pdwActiveProtocol) |
static LONG WINAPI | PCSC_SCardConnectW (SCARDCONTEXT hContext, LPCWSTR szReader, DWORD dwShareMode, DWORD dwPreferredProtocols, LPSCARDHANDLE phCard, LPDWORD pdwActiveProtocol) |
static LONG WINAPI | PCSC_SCardReconnect (SCARDHANDLE hCard, DWORD dwShareMode, DWORD dwPreferredProtocols, DWORD dwInitialization, LPDWORD pdwActiveProtocol) |
static LONG WINAPI | PCSC_SCardDisconnect (SCARDHANDLE hCard, DWORD dwDisposition) |
static LONG WINAPI | PCSC_SCardBeginTransaction (SCARDHANDLE hCard) |
static LONG WINAPI | PCSC_SCardEndTransaction (SCARDHANDLE hCard, DWORD dwDisposition) |
static LONG WINAPI | PCSC_SCardCancelTransaction (SCARDHANDLE hCard) |
static LONG WINAPI | PCSC_SCardStatus_Internal (SCARDHANDLE hCard, LPSTR mszReaderNames, LPDWORD pcchReaderLen, LPDWORD pdwState, LPDWORD pdwProtocol, LPBYTE pbAtr, LPDWORD pcbAtrLen, BOOL unicode) |
static LONG WINAPI | PCSC_SCardState (SCARDHANDLE hCard, LPDWORD pdwState, LPDWORD pdwProtocol, LPBYTE pbAtr, LPDWORD pcbAtrLen) |
static LONG WINAPI | PCSC_SCardStatusA (SCARDHANDLE hCard, LPSTR mszReaderNames, LPDWORD pcchReaderLen, LPDWORD pdwState, LPDWORD pdwProtocol, LPBYTE pbAtr, LPDWORD pcbAtrLen) |
static LONG WINAPI | PCSC_SCardStatusW (SCARDHANDLE hCard, LPWSTR mszReaderNames, LPDWORD pcchReaderLen, LPDWORD pdwState, LPDWORD pdwProtocol, LPBYTE pbAtr, LPDWORD pcbAtrLen) |
static LONG WINAPI | PCSC_SCardTransmit (SCARDHANDLE hCard, LPCSCARD_IO_REQUEST pioSendPci, LPCBYTE pbSendBuffer, DWORD cbSendLength, LPSCARD_IO_REQUEST pioRecvPci, LPBYTE pbRecvBuffer, LPDWORD pcbRecvLength) |
static LONG WINAPI | PCSC_SCardGetTransmitCount (SCARDHANDLE hCard, LPDWORD pcTransmitCount) |
static LONG WINAPI | PCSC_SCardControl (SCARDHANDLE hCard, DWORD dwControlCode, LPCVOID lpInBuffer, DWORD cbInBufferSize, LPVOID lpOutBuffer, DWORD cbOutBufferSize, LPDWORD lpBytesReturned) |
static LONG WINAPI | PCSC_SCardGetAttrib_Internal (SCARDHANDLE hCard, DWORD dwAttrId, LPBYTE pbAttr, LPDWORD pcbAttrLen) |
static LONG WINAPI | PCSC_SCardGetAttrib_FriendlyName (SCARDHANDLE hCard, DWORD dwAttrId, LPBYTE pbAttr, LPDWORD pcbAttrLen) |
static LONG WINAPI | PCSC_SCardGetAttrib (SCARDHANDLE hCard, DWORD dwAttrId, LPBYTE pbAttr, LPDWORD pcbAttrLen) |
static LONG WINAPI | PCSC_SCardSetAttrib (SCARDHANDLE hCard, DWORD dwAttrId, LPCBYTE pbAttr, DWORD cbAttrLen) |
static LONG WINAPI | PCSC_SCardUIDlgSelectCardA (LPOPENCARDNAMEA_EX pDlgStruc) |
static LONG WINAPI | PCSC_SCardUIDlgSelectCardW (LPOPENCARDNAMEW_EX pDlgStruc) |
static LONG WINAPI | PCSC_GetOpenCardNameA (LPOPENCARDNAMEA pDlgStruc) |
static LONG WINAPI | PCSC_GetOpenCardNameW (LPOPENCARDNAMEW pDlgStruc) |
static LONG WINAPI | PCSC_SCardDlgExtendedError (void) |
static char * | card_id_and_name_a (const UUID *CardIdentifier, LPCSTR LookupName) |
static char * | card_id_and_name_w (const UUID *CardIdentifier, LPCWSTR LookupName) |
static LONG WINAPI | PCSC_SCardReadCacheA (SCARDCONTEXT hContext, UUID *CardIdentifier, DWORD FreshnessCounter, LPSTR LookupName, PBYTE Data, DWORD *DataLen) |
static LONG WINAPI | PCSC_SCardReadCacheW (SCARDCONTEXT hContext, UUID *CardIdentifier, DWORD FreshnessCounter, LPWSTR LookupName, PBYTE Data, DWORD *DataLen) |
static LONG WINAPI | PCSC_SCardWriteCacheA (SCARDCONTEXT hContext, UUID *CardIdentifier, DWORD FreshnessCounter, LPSTR LookupName, PBYTE Data, DWORD DataLen) |
static LONG WINAPI | PCSC_SCardWriteCacheW (SCARDCONTEXT hContext, UUID *CardIdentifier, DWORD FreshnessCounter, LPWSTR LookupName, PBYTE Data, DWORD DataLen) |
static LONG WINAPI | PCSC_SCardGetReaderIconA (SCARDCONTEXT hContext, LPCSTR szReaderName, LPBYTE pbIcon, LPDWORD pcbIcon) |
static LONG WINAPI | PCSC_SCardGetReaderIconW (SCARDCONTEXT hContext, LPCWSTR szReaderName, LPBYTE pbIcon, LPDWORD pcbIcon) |
static LONG WINAPI | PCSC_SCardGetDeviceTypeIdA (SCARDCONTEXT hContext, LPCSTR szReaderName, LPDWORD pdwDeviceTypeId) |
static LONG WINAPI | PCSC_SCardGetDeviceTypeIdW (SCARDCONTEXT hContext, LPCWSTR szReaderName, LPDWORD pdwDeviceTypeId) |
static LONG WINAPI | PCSC_SCardGetReaderDeviceInstanceIdA (SCARDCONTEXT hContext, LPCSTR szReaderName, LPSTR szDeviceInstanceId, LPDWORD pcchDeviceInstanceId) |
static LONG WINAPI | PCSC_SCardGetReaderDeviceInstanceIdW (SCARDCONTEXT hContext, LPCWSTR szReaderName, LPWSTR szDeviceInstanceId, LPDWORD pcchDeviceInstanceId) |
static LONG WINAPI | PCSC_SCardListReadersWithDeviceInstanceIdA (SCARDCONTEXT hContext, LPCSTR szDeviceInstanceId, LPSTR mszReaders, LPDWORD pcchReaders) |
static LONG WINAPI | PCSC_SCardListReadersWithDeviceInstanceIdW (SCARDCONTEXT hContext, LPCWSTR szDeviceInstanceId, LPWSTR mszReaders, LPDWORD pcchReaders) |
static LONG WINAPI | PCSC_SCardAudit (SCARDCONTEXT hContext, DWORD dwEvent) |
const SCardApiFunctionTable * | PCSC_GetSCardApiFunctionTable (void) |
int | PCSC_InitializeSCardApi (void) |
Variables | |
static HMODULE | g_PCSCModule = NULL |
static PCSCFunctionTable | g_PCSC = { 0 } |
static HANDLE | g_StartedEvent = NULL |
static int | g_StartedEventRefCount = 0 |
static BOOL | g_SCardAutoAllocate = FALSE |
static BOOL | g_PnP_Notification = TRUE |
static wListDictionary * | g_CardHandles = NULL |
static wListDictionary * | g_CardContexts = NULL |
static wListDictionary * | g_MemoryBlocks = NULL |
static const char | SMARTCARD_PNP_NOTIFICATION_A [] = "\\\\?PnP?\\Notification" |
static const PCSC_SCARD_IO_REQUEST | g_PCSC_rgSCardT0Pci |
static const PCSC_SCARD_IO_REQUEST | g_PCSC_rgSCardT1Pci |
static const PCSC_SCARD_IO_REQUEST | g_PCSC_rgSCardRawPci |
static PcscKnownAtr | knownAtrs [] |
static const SCardApiFunctionTable | PCSC_SCardApiFunctionTable |
#define ARRAY_LENGTH | ( | a | ) | (sizeof(a) / sizeof(a)[0]) |
#define PCSC_SCARD_PCI_RAW (&g_PCSC_rgSCardRawPci) |
#define PCSC_SCARD_PCI_T0 (&g_PCSC_rgSCardT0Pci) |
PC/SC transactions: http://developersblog.wwpass.com/?p=180 Smart Card Logon on Windows Vista: http://blogs.msdn.com/b/shivaram/archive/2007/02/26/smart-card-logon-on-windows-vista.aspx The Smart Card Cryptographic Service Provider Cookbook: http://msdn.microsoft.com/en-us/library/ms953432.aspx
SCARDCONTEXT
The context is a communication channel with the smart card resource manager and all calls to the resource manager must go through this link.
All functions that take a context as a parameter or a card handle as parameter, which is indirectly associated with a particular context, may be blocking calls. Examples of these are SCardGetStatusChange and SCardBeginTransaction, which takes a card handle as a parameter. If such a function blocks then all operations wanting to use the context are blocked as well. So, it is recommended that a CSP using monitoring establishes at least two contexts with the resource manager; one for monitoring (with SCardGetStatusChange) and one for other operations.
If multiple cards are present, it is recommended that a separate context or pair of contexts be established for each card to prevent operations on one card from blocking operations on another.
Example one
The example below shows what can happen if a CSP using SCardGetStatusChange for monitoring does not establish two contexts with the resource manager. The context becomes unusable until SCardGetStatusChange unblocks.
In this example, there is one process running called P1. P1 calls SCardEstablishContext, which returns the context hCtx. P1 calls SCardConnect (with the hCtx context) which returns a handle to the card, hCard. P1 calls SCardGetStatusChange (with the hCtx context) which blocks because there are no status changes to report. Until the thread running SCardGetStatusChange unblocks, another thread in P1 trying to perform an operation using the context hCtx (or the card hCard) will also be blocked.
Example two
The example below shows how transaction control ensures that operations meant to be performed without interruption can do so safely within a transaction.
In this example, there are two different processes running; P1 and P2. P1 calls SCardEstablishContext, which returns the context hCtx1. P2 calls SCardEstablishContext, which returns the context hCtx2. P1 calls SCardConnect (with the hCtx1 context) which returns a handle to the card, hCard1. P2 calls SCardConnect (with the hCtx2 context) which returns a handle to the same card, hCard2. P1 calls SCardBeginTransaction (with the hCard 1 context). Until P1 calls SCardEndTransaction (with the hCard1 context), any operation using hCard2 will be blocked. Once an operation using hCard2 is blocked and until it's returning, any operation using hCtx2 (and hCard2) will also be blocked.
#define PCSC_SCARD_PCI_T1 (&g_PCSC_rgSCardT1Pci) |
#define TAG WINPR_TAG("smartcard") |
WinPR: Windows Portable Runtime Smart Card API
Copyright 2014 Marc-Andre Moreau marca Copyright 2020 Armin Novak ndre .more au@g mail. comarmin Copyright 2020 Thincast Technologies GmbH .nov ak@th inca st.co m
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
typedef PCSC_LONG(* fnPCSCSCardBeginTransaction) (SCARDHANDLE hCard) |
typedef PCSC_LONG(* fnPCSCSCardCancel) (SCARDCONTEXT hContext) |
typedef PCSC_LONG(* fnPCSCSCardConnect) (SCARDCONTEXT hContext, LPCSTR szReader, PCSC_DWORD dwShareMode, PCSC_DWORD dwPreferredProtocols, LPSCARDHANDLE phCard, PCSC_LPDWORD pdwActiveProtocol) |
typedef PCSC_LONG(* fnPCSCSCardControl) (SCARDHANDLE hCard, PCSC_DWORD dwControlCode, LPCVOID pbSendBuffer, PCSC_DWORD cbSendLength, LPVOID pbRecvBuffer, PCSC_DWORD cbRecvLength, PCSC_LPDWORD lpBytesReturned) |
typedef PCSC_LONG(* fnPCSCSCardDisconnect) (SCARDHANDLE hCard, PCSC_DWORD dwDisposition) |
typedef PCSC_LONG(* fnPCSCSCardEndTransaction) (SCARDHANDLE hCard, PCSC_DWORD dwDisposition) |
typedef PCSC_LONG(* fnPCSCSCardEstablishContext) (PCSC_DWORD dwScope, LPCVOID pvReserved1, LPCVOID pvReserved2, LPSCARDCONTEXT phContext) |
typedef PCSC_LONG(* fnPCSCSCardFreeMemory) (SCARDCONTEXT hContext, LPCVOID pvMem) |
typedef PCSC_LONG(* fnPCSCSCardGetAttrib) (SCARDHANDLE hCard, PCSC_DWORD dwAttrId, LPBYTE pbAttr, PCSC_LPDWORD pcbAttrLen) |
typedef PCSC_LONG(* fnPCSCSCardGetStatusChange) (SCARDCONTEXT hContext, PCSC_DWORD dwTimeout, PCSC_SCARD_READERSTATE *rgReaderStates, PCSC_DWORD cReaders) |
typedef PCSC_LONG(* fnPCSCSCardIsValidContext) (SCARDCONTEXT hContext) |
typedef PCSC_LONG(* fnPCSCSCardListReaderGroups) (SCARDCONTEXT hContext, LPSTR mszGroups, PCSC_LPDWORD pcchGroups) |
typedef PCSC_LONG(* fnPCSCSCardListReaders) (SCARDCONTEXT hContext, LPCSTR mszGroups, LPSTR mszReaders, PCSC_LPDWORD pcchReaders) |
typedef PCSC_LONG(* fnPCSCSCardReconnect) (SCARDHANDLE hCard, PCSC_DWORD dwShareMode, PCSC_DWORD dwPreferredProtocols, PCSC_DWORD dwInitialization, PCSC_LPDWORD pdwActiveProtocol) |
typedef PCSC_LONG(* fnPCSCSCardReleaseContext) (SCARDCONTEXT hContext) |
typedef PCSC_LONG(* fnPCSCSCardSetAttrib) (SCARDHANDLE hCard, PCSC_DWORD dwAttrId, LPCBYTE pbAttr, PCSC_DWORD cbAttrLen) |
typedef PCSC_LONG(* fnPCSCSCardStatus) (SCARDHANDLE hCard, LPSTR mszReaderName, PCSC_LPDWORD pcchReaderLen, PCSC_LPDWORD pdwState, PCSC_LPDWORD pdwProtocol, LPBYTE pbAtr, PCSC_LPDWORD pcbAtrLen) |
typedef PCSC_LONG(* fnPCSCSCardTransmit) (SCARDHANDLE hCard, const PCSC_SCARD_IO_REQUEST *pioSendPci, LPCBYTE pbSendBuffer, PCSC_DWORD cbSendLength, PCSC_SCARD_IO_REQUEST *pioRecvPci, LPBYTE pbRecvBuffer, PCSC_LPDWORD pcbRecvLength) |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
pcsc-lite's SCardStatus returns a bit-field, not an enumerated value.
State WinSCard pcsc-lite SCARD_UNKNOWN 0 0x0001 SCARD_ABSENT 1 0x0002 SCARD_PRESENT 2 0x0004 SCARD_SWALLOWED 3 0x0008 SCARD_POWERED 4 0x0010 SCARD_NEGOTIABLE 5 0x0020 SCARD_SPECIFIC 6 0x0040
pcsc-lite also never sets SCARD_SPECIFIC, which is expected by some windows applications.
|
static |
pcsc-lite uses a different value for SCARD_PROTOCOL_RAW, and it does not define WinSCard's SCARD_PROTOCOL_DEFAULT.
|
static |
pcsc-lite uses a different value for SCARD_PROTOCOL_RAW, and also has SCARD_PROTOCOL_T15 which is not in WinSCard.
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
const SCardApiFunctionTable* PCSC_GetSCardApiFunctionTable | ( | void | ) |
int PCSC_InitializeSCardApi | ( | void | ) |
|
static |
|
static |
pcsc-lite returns SCARD_E_UNEXPECTED when it should return SCARD_E_UNSUPPORTED_FEATURE.
Additionally, the pcsc-lite headers incorrectly define SCARD_E_UNSUPPORTED_FEATURE to 0x8010001F, when the real value should be 0x80100022.
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
As stated here : https://pcsclite.alioth.debian.org/api/group__API.html#ga4e515829752e0a8dbc4d630696a8d6a5 SCARD_PROTOCOL_UNDEFINED is valid for dwPreferredProtocols (only) if dwShareMode == SCARD_SHARE_DIRECT and allows to send control commands to the reader (with SCardControl()) even if a card is not present in the reader
|
static |
|
static |
|
static |
PCSCv2 Part 10: http://www.pcscworkgroup.com/specifications/files/pcsc10_v2.02.09.pdf
Smart Card Driver IOCTLs: http://msdn.microsoft.com/en-us/library/windows/hardware/ff548988/
Converting Windows Feature Request IOCTL code to the pcsc-lite control code: http://musclecard.996296.n3.nabble.com/Converting-Windows-Feature-Request-IOCTL-code-to-the-pcsc-lite-control-code-td4906.html
|
static |
|
static |
|
static |
|
static |
|
static |
Standard Windows Smart Card API (PCSC)
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
pcsc-lite returns SCARD_E_INSUFFICIENT_BUFFER if the given buffer size is larger than PCSC_MAX_BUFFER_SIZE (264)
pcsc-lite adds a null terminator to the vendor name, while WinSCard doesn't. Strip the null terminator.
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
Apple's SmartCard Services (not vanilla pcsc-lite) appears to have trouble with the "\\\\?PnP?\\Notification" reader name. I am always getting EXC_BAD_ACCESS with it.
The SmartCard Services tarballs can be found here: http://opensource.apple.com/tarballs/SmartCardServices/
The "\\\\?PnP?\\Notification" string cannot be found anywhere in the sources, while this string is present in the vanilla pcsc-lite sources.
To work around this apparent lack of "\\\\?PnP?\\Notification" support, we have to filter rgReaderStates to exclude the special PnP reader name.
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
pcsc-lite cannot have a null pioSendPci parameter, unlike WinSCard. Query the current protocol and use default SCARD_IO_REQUEST for it.
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |