2014-04-04 23:30:03 +04:00
|
|
|
/**
|
|
|
|
* WinPR: Windows Portable Runtime
|
|
|
|
* Smart Card API
|
|
|
|
*
|
|
|
|
* Copyright 2014 Marc-Andre Moreau <marcandre.moreau@gmail.com>
|
|
|
|
*
|
|
|
|
* 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.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef WINPR_SMARTCARD_PCSC_PRIVATE_H
|
|
|
|
#define WINPR_SMARTCARD_PCSC_PRIVATE_H
|
|
|
|
|
2014-04-26 02:49:57 +04:00
|
|
|
#ifndef _WIN32
|
|
|
|
|
2014-04-09 02:55:50 +04:00
|
|
|
#include <winpr/platform.h>
|
2014-04-04 23:30:03 +04:00
|
|
|
#include <winpr/smartcard.h>
|
|
|
|
|
2014-05-03 21:49:50 +04:00
|
|
|
/**
|
|
|
|
* On Windows, DWORD and ULONG are defined to unsigned long.
|
|
|
|
* However, 64-bit Windows uses the LLP64 model which defines
|
|
|
|
* unsigned long as a 4-byte type, while most non-Windows
|
|
|
|
* systems use the LP64 model where unsigned long is 8 bytes.
|
|
|
|
*
|
|
|
|
* WinPR correctly defines DWORD and ULONG to be 4-byte types
|
|
|
|
* regardless of LLP64/LP64, but this has the side effect of
|
|
|
|
* breaking compatibility with the broken pcsc-lite types.
|
|
|
|
*
|
|
|
|
* To make matters worse, pcsc-lite correctly defines
|
|
|
|
* the data types on OS X, but not on other platforms.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifdef __APPLE__
|
|
|
|
typedef unsigned int PCSC_DWORD;
|
|
|
|
typedef PCSC_DWORD *PCSC_PDWORD, *PCSC_LPDWORD;
|
|
|
|
typedef unsigned int PCSC_ULONG;
|
|
|
|
typedef PCSC_ULONG *PCSC_PULONG;
|
|
|
|
typedef int PCSC_LONG;
|
|
|
|
#else
|
|
|
|
typedef unsigned long PCSC_DWORD;
|
|
|
|
typedef PCSC_DWORD *PCSC_PDWORD, *PCSC_LPDWORD;
|
|
|
|
typedef unsigned long PCSC_ULONG;
|
|
|
|
typedef PCSC_ULONG *PCSC_PULONG;
|
|
|
|
typedef long PCSC_LONG;
|
|
|
|
#endif
|
|
|
|
|
2014-12-23 00:25:59 +03:00
|
|
|
#define PCSC_SCARD_UNKNOWN 0x0001
|
|
|
|
#define PCSC_SCARD_ABSENT 0x0002
|
|
|
|
#define PCSC_SCARD_PRESENT 0x0004
|
|
|
|
#define PCSC_SCARD_SWALLOWED 0x0008
|
|
|
|
#define PCSC_SCARD_POWERED 0x0010
|
|
|
|
#define PCSC_SCARD_NEGOTIABLE 0x0020
|
|
|
|
#define PCSC_SCARD_SPECIFIC 0x0040
|
2014-04-13 00:45:06 +04:00
|
|
|
|
2014-12-23 00:25:59 +03:00
|
|
|
#define PCSC_SCARD_PROTOCOL_RAW 0x00000004
|
|
|
|
#define PCSC_SCARD_PROTOCOL_T15 0x00000008
|
2014-04-13 02:13:18 +04:00
|
|
|
|
2014-12-23 00:25:59 +03:00
|
|
|
#define PCSC_MAX_BUFFER_SIZE 264
|
|
|
|
#define PCSC_MAX_BUFFER_SIZE_EXTENDED (4 + 3 + (1 << 16) + 3 + 2)
|
2014-04-16 01:51:39 +04:00
|
|
|
|
2014-12-23 00:25:59 +03:00
|
|
|
#define PCSC_MAX_ATR_SIZE 33
|
2014-04-26 04:07:29 +04:00
|
|
|
|
2014-12-23 00:25:59 +03:00
|
|
|
#define PCSC_SCARD_AUTOALLOCATE (PCSC_DWORD)(-1)
|
2014-05-03 21:49:50 +04:00
|
|
|
|
2014-12-23 00:25:59 +03:00
|
|
|
#define PCSC_SCARD_PCI_T0 (&g_PCSC_rgSCardT0Pci)
|
|
|
|
#define PCSC_SCARD_PCI_T1 (&g_PCSC_rgSCardT1Pci)
|
|
|
|
#define PCSC_SCARD_PCI_RAW (&g_PCSC_rgSCardRawPci)
|
2014-05-03 22:20:17 +04:00
|
|
|
|
2014-05-04 03:02:17 +04:00
|
|
|
#define PCSC_SCARD_CTL_CODE(code) (0x42000000 + (code))
|
2014-12-23 00:25:59 +03:00
|
|
|
#define PCSC_CM_IOCTL_GET_FEATURE_REQUEST PCSC_SCARD_CTL_CODE(3400)
|
2014-05-04 03:02:17 +04:00
|
|
|
|
2014-11-11 01:40:22 +03:00
|
|
|
/**
|
|
|
|
* pcsc-lite defines SCARD_READERSTATE, SCARD_IO_REQUEST as packed
|
|
|
|
* on Mac OS X only and uses default packing everywhere else.
|
|
|
|
*/
|
|
|
|
|
2014-11-10 00:42:35 +03:00
|
|
|
#ifdef __APPLE__
|
2014-11-11 01:40:22 +03:00
|
|
|
#pragma pack(push, 1)
|
2014-11-10 00:42:35 +03:00
|
|
|
#endif
|
2014-05-04 03:02:17 +04:00
|
|
|
|
2014-04-26 04:07:29 +04:00
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
LPCSTR szReader;
|
|
|
|
LPVOID pvUserData;
|
2014-05-03 21:49:50 +04:00
|
|
|
PCSC_DWORD dwCurrentState;
|
|
|
|
PCSC_DWORD dwEventState;
|
|
|
|
PCSC_DWORD cbAtr;
|
2014-04-26 04:07:29 +04:00
|
|
|
BYTE rgbAtr[PCSC_MAX_ATR_SIZE]; /* WinSCard: 36, PCSC: 33 */
|
|
|
|
}
|
|
|
|
PCSC_SCARD_READERSTATE;
|
|
|
|
|
2014-05-03 22:20:17 +04:00
|
|
|
typedef struct
|
2014-05-03 21:49:50 +04:00
|
|
|
{
|
|
|
|
PCSC_DWORD dwProtocol;
|
|
|
|
PCSC_DWORD cbPciLength;
|
2014-05-03 22:20:17 +04:00
|
|
|
} PCSC_SCARD_IO_REQUEST;
|
2014-05-03 21:49:50 +04:00
|
|
|
|
2014-11-10 00:42:35 +03:00
|
|
|
#ifdef __APPLE__
|
2014-11-11 01:40:22 +03:00
|
|
|
#pragma pack(pop)
|
2014-11-10 00:42:35 +03:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#pragma pack(push, 1)
|
|
|
|
|
2014-05-04 03:02:17 +04:00
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
BYTE tag;
|
|
|
|
BYTE length;
|
|
|
|
UINT32 value;
|
|
|
|
} PCSC_TLV_STRUCTURE;
|
|
|
|
|
2014-10-18 04:40:11 +04:00
|
|
|
#pragma pack(pop)
|
2014-05-04 03:02:17 +04:00
|
|
|
|
2014-04-04 23:30:03 +04:00
|
|
|
struct _PCSCFunctionTable
|
|
|
|
{
|
2014-05-03 21:49:50 +04:00
|
|
|
PCSC_LONG (* pfnSCardEstablishContext)(PCSC_DWORD dwScope,
|
|
|
|
LPCVOID pvReserved1, LPCVOID pvReserved2, LPSCARDCONTEXT phContext);
|
|
|
|
PCSC_LONG (* pfnSCardReleaseContext)(SCARDCONTEXT hContext);
|
|
|
|
PCSC_LONG (* pfnSCardIsValidContext)(SCARDCONTEXT hContext);
|
|
|
|
PCSC_LONG (* pfnSCardConnect)(SCARDCONTEXT hContext,
|
|
|
|
LPCSTR szReader, PCSC_DWORD dwShareMode, PCSC_DWORD dwPreferredProtocols,
|
|
|
|
LPSCARDHANDLE phCard, PCSC_LPDWORD pdwActiveProtocol);
|
|
|
|
PCSC_LONG (* pfnSCardReconnect)(SCARDHANDLE hCard,
|
|
|
|
PCSC_DWORD dwShareMode, PCSC_DWORD dwPreferredProtocols,
|
|
|
|
PCSC_DWORD dwInitialization, PCSC_LPDWORD pdwActiveProtocol);
|
|
|
|
PCSC_LONG (* pfnSCardDisconnect)(SCARDHANDLE hCard, PCSC_DWORD dwDisposition);
|
|
|
|
PCSC_LONG (* pfnSCardBeginTransaction)(SCARDHANDLE hCard);
|
|
|
|
PCSC_LONG (* pfnSCardEndTransaction)(SCARDHANDLE hCard, PCSC_DWORD dwDisposition);
|
|
|
|
PCSC_LONG (* pfnSCardStatus)(SCARDHANDLE hCard,
|
|
|
|
LPSTR mszReaderName, PCSC_LPDWORD pcchReaderLen, PCSC_LPDWORD pdwState,
|
|
|
|
PCSC_LPDWORD pdwProtocol, LPBYTE pbAtr, PCSC_LPDWORD pcbAtrLen);
|
|
|
|
PCSC_LONG (* pfnSCardGetStatusChange)(SCARDCONTEXT hContext,
|
|
|
|
PCSC_DWORD dwTimeout, PCSC_SCARD_READERSTATE* rgReaderStates, PCSC_DWORD cReaders);
|
|
|
|
PCSC_LONG (* pfnSCardControl)(SCARDHANDLE hCard,
|
|
|
|
PCSC_DWORD dwControlCode, LPCVOID pbSendBuffer, PCSC_DWORD cbSendLength,
|
|
|
|
LPVOID pbRecvBuffer, PCSC_DWORD cbRecvLength, PCSC_LPDWORD lpBytesReturned);
|
|
|
|
PCSC_LONG (* pfnSCardTransmit)(SCARDHANDLE hCard,
|
2014-05-03 22:20:17 +04:00
|
|
|
const PCSC_SCARD_IO_REQUEST* pioSendPci, LPCBYTE pbSendBuffer, PCSC_DWORD cbSendLength,
|
|
|
|
PCSC_SCARD_IO_REQUEST* pioRecvPci, LPBYTE pbRecvBuffer, PCSC_LPDWORD pcbRecvLength);
|
2014-05-03 21:49:50 +04:00
|
|
|
PCSC_LONG (* pfnSCardListReaderGroups)(SCARDCONTEXT hContext, LPSTR mszGroups, PCSC_LPDWORD pcchGroups);
|
|
|
|
PCSC_LONG (* pfnSCardListReaders)(SCARDCONTEXT hContext,
|
|
|
|
LPCSTR mszGroups, LPSTR mszReaders, PCSC_LPDWORD pcchReaders);
|
|
|
|
PCSC_LONG (* pfnSCardFreeMemory)(SCARDCONTEXT hContext, LPCVOID pvMem);
|
|
|
|
PCSC_LONG (* pfnSCardCancel)(SCARDCONTEXT hContext);
|
|
|
|
PCSC_LONG (* pfnSCardGetAttrib)(SCARDHANDLE hCard, PCSC_DWORD dwAttrId, LPBYTE pbAttr, PCSC_LPDWORD pcbAttrLen);
|
|
|
|
PCSC_LONG (* pfnSCardSetAttrib)(SCARDHANDLE hCard, PCSC_DWORD dwAttrId, LPCBYTE pbAttr, PCSC_DWORD cbAttrLen);
|
2014-04-04 23:30:03 +04:00
|
|
|
};
|
|
|
|
typedef struct _PCSCFunctionTable PCSCFunctionTable;
|
|
|
|
|
|
|
|
int PCSC_InitializeSCardApi(void);
|
|
|
|
PSCardApiFunctionTable PCSC_GetSCardApiFunctionTable(void);
|
|
|
|
|
2014-04-26 02:49:57 +04:00
|
|
|
#endif
|
|
|
|
|
2014-04-04 23:30:03 +04:00
|
|
|
#endif /* WINPR_SMARTCARD_PCSC_PRIVATE_H */
|