Blame winpr/libwinpr/smartcard/smartcard_pcsc.h

Packit 1fb8d4
/**
Packit 1fb8d4
 * WinPR: Windows Portable Runtime
Packit 1fb8d4
 * Smart Card API
Packit 1fb8d4
 *
Packit 1fb8d4
 * Copyright 2014 Marc-Andre Moreau <marcandre.moreau@gmail.com>
Packit 1fb8d4
 *
Packit 1fb8d4
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit 1fb8d4
 * you may not use this file except in compliance with the License.
Packit 1fb8d4
 * You may obtain a copy of the License at
Packit 1fb8d4
 *
Packit 1fb8d4
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit 1fb8d4
 *
Packit 1fb8d4
 * Unless required by applicable law or agreed to in writing, software
Packit 1fb8d4
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit 1fb8d4
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit 1fb8d4
 * See the License for the specific language governing permissions and
Packit 1fb8d4
 * limitations under the License.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
#ifndef WINPR_SMARTCARD_PCSC_PRIVATE_H
Packit 1fb8d4
#define WINPR_SMARTCARD_PCSC_PRIVATE_H
Packit 1fb8d4
Packit 1fb8d4
#ifndef _WIN32
Packit 1fb8d4
Packit 1fb8d4
#include <winpr/platform.h>
Packit 1fb8d4
#include <winpr/smartcard.h>
Packit 1fb8d4
Packit 1fb8d4
/**
Packit 1fb8d4
 * On Windows, DWORD and ULONG are defined to unsigned long.
Packit 1fb8d4
 * However, 64-bit Windows uses the LLP64 model which defines
Packit 1fb8d4
 * unsigned long as a 4-byte type, while most non-Windows
Packit 1fb8d4
 * systems use the LP64 model where unsigned long is 8 bytes.
Packit 1fb8d4
 *
Packit 1fb8d4
 * WinPR correctly defines DWORD and ULONG to be 4-byte types
Packit 1fb8d4
 * regardless of LLP64/LP64, but this has the side effect of
Packit 1fb8d4
 * breaking compatibility with the broken pcsc-lite types.
Packit 1fb8d4
 *
Packit 1fb8d4
 * To make matters worse, pcsc-lite correctly defines
Packit 1fb8d4
 * the data types on OS X, but not on other platforms.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
#ifdef __APPLE__
Packit 1fb8d4
typedef unsigned int PCSC_DWORD;
Packit 1fb8d4
typedef PCSC_DWORD* PCSC_PDWORD, *PCSC_LPDWORD;
Packit 1fb8d4
typedef unsigned int PCSC_ULONG;
Packit 1fb8d4
typedef PCSC_ULONG* PCSC_PULONG;
Packit 1fb8d4
typedef int PCSC_LONG;
Packit 1fb8d4
#else
Packit 1fb8d4
typedef unsigned long PCSC_DWORD;
Packit 1fb8d4
typedef PCSC_DWORD* PCSC_PDWORD, *PCSC_LPDWORD;
Packit 1fb8d4
typedef unsigned long PCSC_ULONG;
Packit 1fb8d4
typedef PCSC_ULONG* PCSC_PULONG;
Packit 1fb8d4
typedef long PCSC_LONG;
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#define PCSC_SCARD_UNKNOWN			0x0001
Packit 1fb8d4
#define PCSC_SCARD_ABSENT			0x0002
Packit 1fb8d4
#define PCSC_SCARD_PRESENT			0x0004
Packit 1fb8d4
#define PCSC_SCARD_SWALLOWED			0x0008
Packit 1fb8d4
#define PCSC_SCARD_POWERED			0x0010
Packit 1fb8d4
#define PCSC_SCARD_NEGOTIABLE			0x0020
Packit 1fb8d4
#define PCSC_SCARD_SPECIFIC			0x0040
Packit 1fb8d4
Packit 1fb8d4
#define PCSC_SCARD_PROTOCOL_RAW			0x00000004
Packit 1fb8d4
#define PCSC_SCARD_PROTOCOL_T15			0x00000008
Packit 1fb8d4
Packit 1fb8d4
#define PCSC_MAX_BUFFER_SIZE			264
Packit 1fb8d4
#define PCSC_MAX_BUFFER_SIZE_EXTENDED		(4 + 3 + (1 << 16) + 3 + 2)
Packit 1fb8d4
Packit 1fb8d4
#define PCSC_MAX_ATR_SIZE			33
Packit 1fb8d4
Packit 1fb8d4
#define PCSC_SCARD_AUTOALLOCATE			(PCSC_DWORD)(-1)
Packit 1fb8d4
Packit 1fb8d4
#define PCSC_SCARD_PCI_T0			(&g_PCSC_rgSCardT0Pci)
Packit 1fb8d4
#define PCSC_SCARD_PCI_T1			(&g_PCSC_rgSCardT1Pci)
Packit 1fb8d4
#define PCSC_SCARD_PCI_RAW			(&g_PCSC_rgSCardRawPci)
Packit 1fb8d4
Packit 1fb8d4
#define PCSC_SCARD_CTL_CODE(code)		(0x42000000 + (code))
Packit 1fb8d4
#define PCSC_CM_IOCTL_GET_FEATURE_REQUEST	PCSC_SCARD_CTL_CODE(3400)
Packit 1fb8d4
Packit 1fb8d4
/**
Packit 1fb8d4
 * pcsc-lite defines SCARD_READERSTATE, SCARD_IO_REQUEST as packed
Packit 1fb8d4
 * on Mac OS X only and uses default packing everywhere else.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
#ifdef __APPLE__
Packit 1fb8d4
#pragma pack(push, 1)
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
typedef struct
Packit 1fb8d4
{
Packit 1fb8d4
	LPCSTR szReader;
Packit 1fb8d4
	LPVOID pvUserData;
Packit 1fb8d4
	PCSC_DWORD dwCurrentState;
Packit 1fb8d4
	PCSC_DWORD dwEventState;
Packit 1fb8d4
	PCSC_DWORD cbAtr;
Packit 1fb8d4
	BYTE rgbAtr[PCSC_MAX_ATR_SIZE]; /* WinSCard: 36, PCSC: 33 */
Packit 1fb8d4
}
Packit 1fb8d4
PCSC_SCARD_READERSTATE;
Packit 1fb8d4
Packit 1fb8d4
typedef struct
Packit 1fb8d4
{
Packit 1fb8d4
	PCSC_DWORD dwProtocol;
Packit 1fb8d4
	PCSC_DWORD cbPciLength;
Packit 1fb8d4
} PCSC_SCARD_IO_REQUEST;
Packit 1fb8d4
Packit 1fb8d4
#ifdef __APPLE__
Packit 1fb8d4
#pragma pack(pop)
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#pragma pack(push, 1)
Packit 1fb8d4
Packit 1fb8d4
typedef struct
Packit 1fb8d4
{
Packit 1fb8d4
	BYTE tag;
Packit 1fb8d4
	BYTE length;
Packit 1fb8d4
	UINT32 value;
Packit 1fb8d4
} PCSC_TLV_STRUCTURE;
Packit 1fb8d4
Packit 1fb8d4
#pragma pack(pop)
Packit 1fb8d4
Packit 1fb8d4
struct _PCSCFunctionTable
Packit 1fb8d4
{
Packit 1fb8d4
	PCSC_LONG(* pfnSCardEstablishContext)(PCSC_DWORD dwScope,
Packit 1fb8d4
	                                      LPCVOID pvReserved1, LPCVOID pvReserved2, LPSCARDCONTEXT phContext);
Packit 1fb8d4
	PCSC_LONG(* pfnSCardReleaseContext)(SCARDCONTEXT hContext);
Packit 1fb8d4
	PCSC_LONG(* pfnSCardIsValidContext)(SCARDCONTEXT hContext);
Packit 1fb8d4
	PCSC_LONG(* pfnSCardConnect)(SCARDCONTEXT hContext,
Packit 1fb8d4
	                             LPCSTR szReader, PCSC_DWORD dwShareMode, PCSC_DWORD dwPreferredProtocols,
Packit 1fb8d4
	                             LPSCARDHANDLE phCard, PCSC_LPDWORD pdwActiveProtocol);
Packit 1fb8d4
	PCSC_LONG(* pfnSCardReconnect)(SCARDHANDLE hCard,
Packit 1fb8d4
	                               PCSC_DWORD dwShareMode, PCSC_DWORD dwPreferredProtocols,
Packit 1fb8d4
	                               PCSC_DWORD dwInitialization, PCSC_LPDWORD pdwActiveProtocol);
Packit 1fb8d4
	PCSC_LONG(* pfnSCardDisconnect)(SCARDHANDLE hCard, PCSC_DWORD dwDisposition);
Packit 1fb8d4
	PCSC_LONG(* pfnSCardBeginTransaction)(SCARDHANDLE hCard);
Packit 1fb8d4
	PCSC_LONG(* pfnSCardEndTransaction)(SCARDHANDLE hCard, PCSC_DWORD dwDisposition);
Packit 1fb8d4
	PCSC_LONG(* pfnSCardStatus)(SCARDHANDLE hCard,
Packit 1fb8d4
	                            LPSTR mszReaderName, PCSC_LPDWORD pcchReaderLen, PCSC_LPDWORD pdwState,
Packit 1fb8d4
	                            PCSC_LPDWORD pdwProtocol, LPBYTE pbAtr, PCSC_LPDWORD pcbAtrLen);
Packit 1fb8d4
	PCSC_LONG(* pfnSCardGetStatusChange)(SCARDCONTEXT hContext,
Packit 1fb8d4
	                                     PCSC_DWORD dwTimeout, PCSC_SCARD_READERSTATE* rgReaderStates, PCSC_DWORD cReaders);
Packit 1fb8d4
	PCSC_LONG(* pfnSCardControl)(SCARDHANDLE hCard,
Packit 1fb8d4
	                             PCSC_DWORD dwControlCode, LPCVOID pbSendBuffer, PCSC_DWORD cbSendLength,
Packit 1fb8d4
	                             LPVOID pbRecvBuffer, PCSC_DWORD cbRecvLength, PCSC_LPDWORD lpBytesReturned);
Packit 1fb8d4
	PCSC_LONG(* pfnSCardTransmit)(SCARDHANDLE hCard,
Packit 1fb8d4
	                              const PCSC_SCARD_IO_REQUEST* pioSendPci, LPCBYTE pbSendBuffer, PCSC_DWORD cbSendLength,
Packit 1fb8d4
	                              PCSC_SCARD_IO_REQUEST* pioRecvPci, LPBYTE pbRecvBuffer, PCSC_LPDWORD pcbRecvLength);
Packit 1fb8d4
	PCSC_LONG(* pfnSCardListReaderGroups)(SCARDCONTEXT hContext, LPSTR mszGroups,
Packit 1fb8d4
	                                      PCSC_LPDWORD pcchGroups);
Packit 1fb8d4
	PCSC_LONG(* pfnSCardListReaders)(SCARDCONTEXT hContext,
Packit 1fb8d4
	                                 LPCSTR mszGroups, LPSTR mszReaders, PCSC_LPDWORD pcchReaders);
Packit 1fb8d4
	PCSC_LONG(* pfnSCardFreeMemory)(SCARDCONTEXT hContext, LPCVOID pvMem);
Packit 1fb8d4
	PCSC_LONG(* pfnSCardCancel)(SCARDCONTEXT hContext);
Packit 1fb8d4
	PCSC_LONG(* pfnSCardGetAttrib)(SCARDHANDLE hCard, PCSC_DWORD dwAttrId, LPBYTE pbAttr,
Packit 1fb8d4
	                               PCSC_LPDWORD pcbAttrLen);
Packit 1fb8d4
	PCSC_LONG(* pfnSCardSetAttrib)(SCARDHANDLE hCard, PCSC_DWORD dwAttrId, LPCBYTE pbAttr,
Packit 1fb8d4
	                               PCSC_DWORD cbAttrLen);
Packit 1fb8d4
};
Packit 1fb8d4
typedef struct _PCSCFunctionTable PCSCFunctionTable;
Packit 1fb8d4
Packit 1fb8d4
int PCSC_InitializeSCardApi(void);
Packit 1fb8d4
PSCardApiFunctionTable PCSC_GetSCardApiFunctionTable(void);
Packit 1fb8d4
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#endif /* WINPR_SMARTCARD_PCSC_PRIVATE_H */