Blame winpr/libwinpr/smartcard/smartcard.c

Packit Service fa4841
/**
Packit Service fa4841
 * WinPR: Windows Portable Runtime
Packit Service fa4841
 * Smart Card API
Packit Service fa4841
 *
Packit Service fa4841
 * Copyright 2014 Marc-Andre Moreau <marcandre.moreau@gmail.com>
Packit Service fa4841
 * Copyright 2020 Armin Novak <armin.novak@thincast.com>
Packit Service fa4841
 * Copyright 2020 Thincast Technologies GmbH
Packit Service fa4841
 *
Packit Service fa4841
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit Service fa4841
 * you may not use this file except in compliance with the License.
Packit Service fa4841
 * You may obtain a copy of the License at
Packit Service fa4841
 *
Packit Service fa4841
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit Service fa4841
 *
Packit Service fa4841
 * Unless required by applicable law or agreed to in writing, software
Packit Service fa4841
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit Service fa4841
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit Service fa4841
 * See the License for the specific language governing permissions and
Packit Service fa4841
 * limitations under the License.
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
#ifdef HAVE_CONFIG_H
Packit Service fa4841
#include "config.h"
Packit Service fa4841
#endif
Packit Service fa4841
Packit Service fa4841
#include <winpr/crt.h>
Packit Service fa4841
#include <winpr/library.h>
Packit Service fa4841
#include <winpr/smartcard.h>
Packit Service fa4841
#include <winpr/synch.h>
Packit Service fa4841
#include <winpr/wlog.h>
Packit Service fa4841
Packit Service fa4841
#include "../log.h"
Packit Service fa4841
Packit Service fa4841
#include "smartcard.h"
Packit Service fa4841
Packit Service fa4841
#include "smartcard_inspect.h"
Packit Service fa4841
Packit Service fa4841
static INIT_ONCE g_Initialized = INIT_ONCE_STATIC_INIT;
Packit Service fa4841
static const SCardApiFunctionTable* g_SCardApi = NULL;
Packit Service fa4841
Packit Service fa4841
#define TAG WINPR_TAG("smartcard")
Packit Service fa4841
Packit Service fa4841
#define xstr(s) str(s)
Packit Service fa4841
#define str(s) #s
Packit Service fa4841
Packit Service fa4841
#define SCARDAPI_STUB_CALL_LONG(_name, ...)                                              \
Packit Service fa4841
	InitOnceExecuteOnce(&g_Initialized, InitializeSCardApiStubs, NULL, NULL);            \
Packit Service fa4841
	if (!g_SCardApi || !g_SCardApi->pfn##_name)                                          \
Packit Service fa4841
	{                                                                                    \
Packit Service fa4841
		WLog_DBG(TAG, "Missing function pointer g_SCardApi=%p->" xstr(pfn##_name) "=%p", \
Packit Service fa4841
		         g_SCardApi, g_SCardApi ? g_SCardApi->pfn##_name : NULL);                \
Packit Service fa4841
		return SCARD_E_NO_SERVICE;                                                       \
Packit Service fa4841
	}                                                                                    \
Packit Service fa4841
	return g_SCardApi->pfn##_name(__VA_ARGS__)
Packit Service fa4841
Packit Service fa4841
#define SCARDAPI_STUB_CALL_HANDLE(_name, ...)                                 \
Packit Service fa4841
	InitOnceExecuteOnce(&g_Initialized, InitializeSCardApiStubs, NULL, NULL); \
Packit Service fa4841
	if (!g_SCardApi || !g_SCardApi->pfn##_name)                               \
Packit Service fa4841
		return NULL;                                                          \
Packit Service fa4841
	return g_SCardApi->pfn##_name(__VA_ARGS__)
Packit Service fa4841
Packit Service fa4841
#define SCARDAPI_STUB_CALL_VOID(_name, ...)                                   \
Packit Service fa4841
	InitOnceExecuteOnce(&g_Initialized, InitializeSCardApiStubs, NULL, NULL); \
Packit Service fa4841
	if (!g_SCardApi || !g_SCardApi->pfn##_name)                               \
Packit Service fa4841
		return;                                                               \
Packit Service fa4841
	g_SCardApi->pfn##_name(__VA_ARGS__)
Packit Service fa4841
Packit Service fa4841
/**
Packit Service fa4841
 * Standard Windows Smart Card API
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
const SCARD_IO_REQUEST g_rgSCardT0Pci = { SCARD_PROTOCOL_T0, 8 };
Packit Service fa4841
const SCARD_IO_REQUEST g_rgSCardT1Pci = { SCARD_PROTOCOL_T1, 8 };
Packit Service fa4841
const SCARD_IO_REQUEST g_rgSCardRawPci = { SCARD_PROTOCOL_RAW, 8 };
Packit Service fa4841
Packit Service fa4841
static BOOL CALLBACK InitializeSCardApiStubs(PINIT_ONCE once, PVOID param, PVOID* context)
Packit Service fa4841
{
Packit Service fa4841
#ifndef _WIN32
Packit Service fa4841
Packit Service fa4841
	if (PCSC_InitializeSCardApi() >= 0)
Packit Service fa4841
		g_SCardApi = PCSC_GetSCardApiFunctionTable();
Packit Service fa4841
Packit Service fa4841
#else
Packit Service fa4841
Packit Service fa4841
	if (WinSCard_InitializeSCardApi() >= 0)
Packit Service fa4841
		g_SCardApi = WinSCard_GetSCardApiFunctionTable();
Packit Service fa4841
Packit Service fa4841
#endif
Packit Service fa4841
#ifdef WITH_SMARTCARD_INSPECT
Packit Service fa4841
	g_SCardApi = Inspect_RegisterSCardApi(g_SCardApi);
Packit Service fa4841
#endif
Packit Service fa4841
	return TRUE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardEstablishContext(DWORD dwScope, LPCVOID pvReserved1,
Packit Service fa4841
                                              LPCVOID pvReserved2, LPSCARDCONTEXT phContext)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardEstablishContext, dwScope, pvReserved1, pvReserved2, phContext);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardReleaseContext(SCARDCONTEXT hContext)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardReleaseContext, hContext);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardIsValidContext(SCARDCONTEXT hContext)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardIsValidContext, hContext);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardListReaderGroupsA(SCARDCONTEXT hContext, LPSTR mszGroups,
Packit Service fa4841
                                               LPDWORD pcchGroups)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardListReaderGroupsA, hContext, mszGroups, pcchGroups);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardListReaderGroupsW(SCARDCONTEXT hContext, LPWSTR mszGroups,
Packit Service fa4841
                                               LPDWORD pcchGroups)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardListReaderGroupsW, hContext, mszGroups, pcchGroups);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardListReadersA(SCARDCONTEXT hContext, LPCSTR mszGroups, LPSTR mszReaders,
Packit Service fa4841
                                          LPDWORD pcchReaders)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardListReadersA, hContext, mszGroups, mszReaders, pcchReaders);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardListReadersW(SCARDCONTEXT hContext, LPCWSTR mszGroups,
Packit Service fa4841
                                          LPWSTR mszReaders, LPDWORD pcchReaders)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardListReadersW, hContext, mszGroups, mszReaders, pcchReaders);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardListCardsA(SCARDCONTEXT hContext, LPCBYTE pbAtr,
Packit Service fa4841
                                        LPCGUID rgquidInterfaces, DWORD cguidInterfaceCount,
Packit Service fa4841
                                        CHAR* mszCards, LPDWORD pcchCards)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardListCardsA, hContext, pbAtr, rgquidInterfaces, cguidInterfaceCount,
Packit Service fa4841
	                        mszCards, pcchCards);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardListCardsW(SCARDCONTEXT hContext, LPCBYTE pbAtr,
Packit Service fa4841
                                        LPCGUID rgquidInterfaces, DWORD cguidInterfaceCount,
Packit Service fa4841
                                        WCHAR* mszCards, LPDWORD pcchCards)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardListCardsW, hContext, pbAtr, rgquidInterfaces, cguidInterfaceCount,
Packit Service fa4841
	                        mszCards, pcchCards);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardListInterfacesA(SCARDCONTEXT hContext, LPCSTR szCard,
Packit Service fa4841
                                             LPGUID pguidInterfaces, LPDWORD pcguidInterfaces)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardListInterfacesA, hContext, szCard, pguidInterfaces,
Packit Service fa4841
	                        pcguidInterfaces);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardListInterfacesW(SCARDCONTEXT hContext, LPCWSTR szCard,
Packit Service fa4841
                                             LPGUID pguidInterfaces, LPDWORD pcguidInterfaces)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardListInterfacesW, hContext, szCard, pguidInterfaces,
Packit Service fa4841
	                        pcguidInterfaces);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardGetProviderIdA(SCARDCONTEXT hContext, LPCSTR szCard,
Packit Service fa4841
                                            LPGUID pguidProviderId)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardGetProviderIdA, hContext, szCard, pguidProviderId);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardGetProviderIdW(SCARDCONTEXT hContext, LPCWSTR szCard,
Packit Service fa4841
                                            LPGUID pguidProviderId)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardGetProviderIdW, hContext, szCard, pguidProviderId);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardGetCardTypeProviderNameA(SCARDCONTEXT hContext, LPCSTR szCardName,
Packit Service fa4841
                                                      DWORD dwProviderId, CHAR* szProvider,
Packit Service fa4841
                                                      LPDWORD pcchProvider)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardGetCardTypeProviderNameA, hContext, szCardName, dwProviderId,
Packit Service fa4841
	                        szProvider, pcchProvider);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardGetCardTypeProviderNameW(SCARDCONTEXT hContext, LPCWSTR szCardName,
Packit Service fa4841
                                                      DWORD dwProviderId, WCHAR* szProvider,
Packit Service fa4841
                                                      LPDWORD pcchProvider)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardGetCardTypeProviderNameW, hContext, szCardName, dwProviderId,
Packit Service fa4841
	                        szProvider, pcchProvider);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardIntroduceReaderGroupA(SCARDCONTEXT hContext, LPCSTR szGroupName)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderGroupA, hContext, szGroupName);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardIntroduceReaderGroupW(SCARDCONTEXT hContext, LPCWSTR szGroupName)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderGroupW, hContext, szGroupName);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardForgetReaderGroupA(SCARDCONTEXT hContext, LPCSTR szGroupName)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardForgetReaderGroupA, hContext, szGroupName);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardForgetReaderGroupW(SCARDCONTEXT hContext, LPCWSTR szGroupName)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardForgetReaderGroupW, hContext, szGroupName);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardIntroduceReaderA(SCARDCONTEXT hContext, LPCSTR szReaderName,
Packit Service fa4841
                                              LPCSTR szDeviceName)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderA, hContext, szReaderName, szDeviceName);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardIntroduceReaderW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
Packit Service fa4841
                                              LPCWSTR szDeviceName)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderW, hContext, szReaderName, szDeviceName);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardForgetReaderA(SCARDCONTEXT hContext, LPCSTR szReaderName)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardForgetReaderA, hContext, szReaderName);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardForgetReaderW(SCARDCONTEXT hContext, LPCWSTR szReaderName)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardForgetReaderW, hContext, szReaderName);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardAddReaderToGroupA(SCARDCONTEXT hContext, LPCSTR szReaderName,
Packit Service fa4841
                                               LPCSTR szGroupName)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardAddReaderToGroupA, hContext, szReaderName, szGroupName);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardAddReaderToGroupW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
Packit Service fa4841
                                               LPCWSTR szGroupName)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardAddReaderToGroupW, hContext, szReaderName, szGroupName);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardRemoveReaderFromGroupA(SCARDCONTEXT hContext, LPCSTR szReaderName,
Packit Service fa4841
                                                    LPCSTR szGroupName)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardRemoveReaderFromGroupA, hContext, szReaderName, szGroupName);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardRemoveReaderFromGroupW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
Packit Service fa4841
                                                    LPCWSTR szGroupName)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardRemoveReaderFromGroupW, hContext, szReaderName, szGroupName);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardIntroduceCardTypeA(SCARDCONTEXT hContext, LPCSTR szCardName,
Packit Service fa4841
                                                LPCGUID pguidPrimaryProvider,
Packit Service fa4841
                                                LPCGUID rgguidInterfaces, DWORD dwInterfaceCount,
Packit Service fa4841
                                                LPCBYTE pbAtr, LPCBYTE pbAtrMask, DWORD cbAtrLen)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardIntroduceCardTypeA, hContext, szCardName, pguidPrimaryProvider,
Packit Service fa4841
	                        rgguidInterfaces, dwInterfaceCount, pbAtr, pbAtrMask, cbAtrLen);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardIntroduceCardTypeW(SCARDCONTEXT hContext, LPCWSTR szCardName,
Packit Service fa4841
                                                LPCGUID pguidPrimaryProvider,
Packit Service fa4841
                                                LPCGUID rgguidInterfaces, DWORD dwInterfaceCount,
Packit Service fa4841
                                                LPCBYTE pbAtr, LPCBYTE pbAtrMask, DWORD cbAtrLen)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardIntroduceCardTypeW, hContext, szCardName, pguidPrimaryProvider,
Packit Service fa4841
	                        rgguidInterfaces, dwInterfaceCount, pbAtr, pbAtrMask, cbAtrLen);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardSetCardTypeProviderNameA(SCARDCONTEXT hContext, LPCSTR szCardName,
Packit Service fa4841
                                                      DWORD dwProviderId, LPCSTR szProvider)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardSetCardTypeProviderNameA, hContext, szCardName, dwProviderId,
Packit Service fa4841
	                        szProvider);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardSetCardTypeProviderNameW(SCARDCONTEXT hContext, LPCWSTR szCardName,
Packit Service fa4841
                                                      DWORD dwProviderId, LPCWSTR szProvider)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardSetCardTypeProviderNameW, hContext, szCardName, dwProviderId,
Packit Service fa4841
	                        szProvider);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardForgetCardTypeA(SCARDCONTEXT hContext, LPCSTR szCardName)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardForgetCardTypeA, hContext, szCardName);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardForgetCardTypeW(SCARDCONTEXT hContext, LPCWSTR szCardName)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardForgetCardTypeW, hContext, szCardName);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardFreeMemory(SCARDCONTEXT hContext, LPVOID pvMem)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardFreeMemory, hContext, pvMem);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI HANDLE WINAPI SCardAccessStartedEvent(void)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_HANDLE(SCardAccessStartedEvent);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI void WINAPI SCardReleaseStartedEvent(void)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_VOID(SCardReleaseStartedEvent);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardLocateCardsA(SCARDCONTEXT hContext, LPCSTR mszCards,
Packit Service fa4841
                                          LPSCARD_READERSTATEA rgReaderStates, DWORD cReaders)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardLocateCardsA, hContext, mszCards, rgReaderStates, cReaders);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardLocateCardsW(SCARDCONTEXT hContext, LPCWSTR mszCards,
Packit Service fa4841
                                          LPSCARD_READERSTATEW rgReaderStates, DWORD cReaders)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardLocateCardsW, hContext, mszCards, rgReaderStates, cReaders);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardLocateCardsByATRA(SCARDCONTEXT hContext, LPSCARD_ATRMASK rgAtrMasks,
Packit Service fa4841
                                               DWORD cAtrs, LPSCARD_READERSTATEA rgReaderStates,
Packit Service fa4841
                                               DWORD cReaders)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardLocateCardsByATRA, hContext, rgAtrMasks, cAtrs, rgReaderStates,
Packit Service fa4841
	                        cReaders);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardLocateCardsByATRW(SCARDCONTEXT hContext, LPSCARD_ATRMASK rgAtrMasks,
Packit Service fa4841
                                               DWORD cAtrs, LPSCARD_READERSTATEW rgReaderStates,
Packit Service fa4841
                                               DWORD cReaders)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardLocateCardsByATRW, hContext, rgAtrMasks, cAtrs, rgReaderStates,
Packit Service fa4841
	                        cReaders);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardGetStatusChangeA(SCARDCONTEXT hContext, DWORD dwTimeout,
Packit Service fa4841
                                              LPSCARD_READERSTATEA rgReaderStates, DWORD cReaders)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardGetStatusChangeA, hContext, dwTimeout, rgReaderStates, cReaders);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardGetStatusChangeW(SCARDCONTEXT hContext, DWORD dwTimeout,
Packit Service fa4841
                                              LPSCARD_READERSTATEW rgReaderStates, DWORD cReaders)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardGetStatusChangeW, hContext, dwTimeout, rgReaderStates, cReaders);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardCancel(SCARDCONTEXT hContext)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardCancel, hContext);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardConnectA(SCARDCONTEXT hContext, LPCSTR szReader, DWORD dwShareMode,
Packit Service fa4841
                                      DWORD dwPreferredProtocols, LPSCARDHANDLE phCard,
Packit Service fa4841
                                      LPDWORD pdwActiveProtocol)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardConnectA, hContext, szReader, dwShareMode, dwPreferredProtocols,
Packit Service fa4841
	                        phCard, pdwActiveProtocol);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardConnectW(SCARDCONTEXT hContext, LPCWSTR szReader, DWORD dwShareMode,
Packit Service fa4841
                                      DWORD dwPreferredProtocols, LPSCARDHANDLE phCard,
Packit Service fa4841
                                      LPDWORD pdwActiveProtocol)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardConnectW, hContext, szReader, dwShareMode, dwPreferredProtocols,
Packit Service fa4841
	                        phCard, pdwActiveProtocol);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardReconnect(SCARDHANDLE hCard, DWORD dwShareMode,
Packit Service fa4841
                                       DWORD dwPreferredProtocols, DWORD dwInitialization,
Packit Service fa4841
                                       LPDWORD pdwActiveProtocol)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardReconnect, hCard, dwShareMode, dwPreferredProtocols,
Packit Service fa4841
	                        dwInitialization, pdwActiveProtocol);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardDisconnect(SCARDHANDLE hCard, DWORD dwDisposition)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardDisconnect, hCard, dwDisposition);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardBeginTransaction(SCARDHANDLE hCard)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardBeginTransaction, hCard);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardEndTransaction(SCARDHANDLE hCard, DWORD dwDisposition)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardEndTransaction, hCard, dwDisposition);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardCancelTransaction(SCARDHANDLE hCard)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardCancelTransaction, hCard);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardState(SCARDHANDLE hCard, LPDWORD pdwState, LPDWORD pdwProtocol,
Packit Service fa4841
                                   LPBYTE pbAtr, LPDWORD pcbAtrLen)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardState, hCard, pdwState, pdwProtocol, pbAtr, pcbAtrLen);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardStatusA(SCARDHANDLE hCard, LPSTR mszReaderNames, LPDWORD pcchReaderLen,
Packit Service fa4841
                                     LPDWORD pdwState, LPDWORD pdwProtocol, LPBYTE pbAtr,
Packit Service fa4841
                                     LPDWORD pcbAtrLen)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardStatusA, hCard, mszReaderNames, pcchReaderLen, pdwState,
Packit Service fa4841
	                        pdwProtocol, pbAtr, pcbAtrLen);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardStatusW(SCARDHANDLE hCard, LPWSTR mszReaderNames,
Packit Service fa4841
                                     LPDWORD pcchReaderLen, LPDWORD pdwState, LPDWORD pdwProtocol,
Packit Service fa4841
                                     LPBYTE pbAtr, LPDWORD pcbAtrLen)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardStatusW, hCard, mszReaderNames, pcchReaderLen, pdwState,
Packit Service fa4841
	                        pdwProtocol, pbAtr, pcbAtrLen);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardTransmit(SCARDHANDLE hCard, LPCSCARD_IO_REQUEST pioSendPci,
Packit Service fa4841
                                      LPCBYTE pbSendBuffer, DWORD cbSendLength,
Packit Service fa4841
                                      LPSCARD_IO_REQUEST pioRecvPci, LPBYTE pbRecvBuffer,
Packit Service fa4841
                                      LPDWORD pcbRecvLength)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardTransmit, hCard, pioSendPci, pbSendBuffer, cbSendLength,
Packit Service fa4841
	                        pioRecvPci, pbRecvBuffer, pcbRecvLength);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardGetTransmitCount(SCARDHANDLE hCard, LPDWORD pcTransmitCount)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardGetTransmitCount, hCard, pcTransmitCount);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardControl(SCARDHANDLE hCard, DWORD dwControlCode, LPCVOID lpInBuffer,
Packit Service fa4841
                                     DWORD cbInBufferSize, LPVOID lpOutBuffer,
Packit Service fa4841
                                     DWORD cbOutBufferSize, LPDWORD lpBytesReturned)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardControl, hCard, dwControlCode, lpInBuffer, cbInBufferSize,
Packit Service fa4841
	                        lpOutBuffer, cbOutBufferSize, lpBytesReturned);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardGetAttrib(SCARDHANDLE hCard, DWORD dwAttrId, LPBYTE pbAttr,
Packit Service fa4841
                                       LPDWORD pcbAttrLen)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardGetAttrib, hCard, dwAttrId, pbAttr, pcbAttrLen);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardSetAttrib(SCARDHANDLE hCard, DWORD dwAttrId, LPCBYTE pbAttr,
Packit Service fa4841
                                       DWORD cbAttrLen)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardSetAttrib, hCard, dwAttrId, pbAttr, cbAttrLen);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardUIDlgSelectCardA(LPOPENCARDNAMEA_EX pDlgStruc)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardUIDlgSelectCardA, pDlgStruc);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardUIDlgSelectCardW(LPOPENCARDNAMEW_EX pDlgStruc)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardUIDlgSelectCardW, pDlgStruc);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI GetOpenCardNameA(LPOPENCARDNAMEA pDlgStruc)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(GetOpenCardNameA, pDlgStruc);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI GetOpenCardNameW(LPOPENCARDNAMEW pDlgStruc)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(GetOpenCardNameW, pDlgStruc);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardDlgExtendedError(void)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardDlgExtendedError);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardReadCacheA(SCARDCONTEXT hContext, UUID* CardIdentifier,
Packit Service fa4841
                                        DWORD FreshnessCounter, LPSTR LookupName, PBYTE Data,
Packit Service fa4841
                                        DWORD* DataLen)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardReadCacheA, hContext, CardIdentifier, FreshnessCounter, LookupName,
Packit Service fa4841
	                        Data, DataLen);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardReadCacheW(SCARDCONTEXT hContext, UUID* CardIdentifier,
Packit Service fa4841
                                        DWORD FreshnessCounter, LPWSTR LookupName, PBYTE Data,
Packit Service fa4841
                                        DWORD* DataLen)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardReadCacheW, hContext, CardIdentifier, FreshnessCounter, LookupName,
Packit Service fa4841
	                        Data, DataLen);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardWriteCacheA(SCARDCONTEXT hContext, UUID* CardIdentifier,
Packit Service fa4841
                                         DWORD FreshnessCounter, LPSTR LookupName, PBYTE Data,
Packit Service fa4841
                                         DWORD DataLen)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardWriteCacheA, hContext, CardIdentifier, FreshnessCounter,
Packit Service fa4841
	                        LookupName, Data, DataLen);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardWriteCacheW(SCARDCONTEXT hContext, UUID* CardIdentifier,
Packit Service fa4841
                                         DWORD FreshnessCounter, LPWSTR LookupName, PBYTE Data,
Packit Service fa4841
                                         DWORD DataLen)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardWriteCacheW, hContext, CardIdentifier, FreshnessCounter,
Packit Service fa4841
	                        LookupName, Data, DataLen);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardGetReaderIconA(SCARDCONTEXT hContext, LPCSTR szReaderName,
Packit Service fa4841
                                            LPBYTE pbIcon, LPDWORD pcbIcon)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardGetReaderIconA, hContext, szReaderName, pbIcon, pcbIcon);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardGetReaderIconW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
Packit Service fa4841
                                            LPBYTE pbIcon, LPDWORD pcbIcon)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardGetReaderIconW, hContext, szReaderName, pbIcon, pcbIcon);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardGetDeviceTypeIdA(SCARDCONTEXT hContext, LPCSTR szReaderName,
Packit Service fa4841
                                              LPDWORD pdwDeviceTypeId)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardGetDeviceTypeIdA, hContext, szReaderName, pdwDeviceTypeId);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardGetDeviceTypeIdW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
Packit Service fa4841
                                              LPDWORD pdwDeviceTypeId)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardGetDeviceTypeIdW, hContext, szReaderName, pdwDeviceTypeId);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardGetReaderDeviceInstanceIdA(SCARDCONTEXT hContext, LPCSTR szReaderName,
Packit Service fa4841
                                                        LPSTR szDeviceInstanceId,
Packit Service fa4841
                                                        LPDWORD pcchDeviceInstanceId)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardGetReaderDeviceInstanceIdA, hContext, szReaderName,
Packit Service fa4841
	                        szDeviceInstanceId, pcchDeviceInstanceId);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardGetReaderDeviceInstanceIdW(SCARDCONTEXT hContext, LPCWSTR szReaderName,
Packit Service fa4841
                                                        LPWSTR szDeviceInstanceId,
Packit Service fa4841
                                                        LPDWORD pcchDeviceInstanceId)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardGetReaderDeviceInstanceIdW, hContext, szReaderName,
Packit Service fa4841
	                        szDeviceInstanceId, pcchDeviceInstanceId);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardListReadersWithDeviceInstanceIdA(SCARDCONTEXT hContext,
Packit Service fa4841
                                                              LPCSTR szDeviceInstanceId,
Packit Service fa4841
                                                              LPSTR mszReaders, LPDWORD pcchReaders)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardListReadersWithDeviceInstanceIdA, hContext, szDeviceInstanceId,
Packit Service fa4841
	                        mszReaders, pcchReaders);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardListReadersWithDeviceInstanceIdW(SCARDCONTEXT hContext,
Packit Service fa4841
                                                              LPCWSTR szDeviceInstanceId,
Packit Service fa4841
                                                              LPWSTR mszReaders,
Packit Service fa4841
                                                              LPDWORD pcchReaders)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardListReadersWithDeviceInstanceIdW, hContext, szDeviceInstanceId,
Packit Service fa4841
	                        mszReaders, pcchReaders);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI LONG WINAPI SCardAudit(SCARDCONTEXT hContext, DWORD dwEvent)
Packit Service fa4841
{
Packit Service fa4841
	SCARDAPI_STUB_CALL_LONG(SCardAudit, hContext, dwEvent);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
/**
Packit Service fa4841
 * Extended API
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI const char* WINAPI SCardGetErrorString(LONG errorCode)
Packit Service fa4841
{
Packit Service fa4841
	switch (errorCode)
Packit Service fa4841
	{
Packit Service fa4841
		case SCARD_S_SUCCESS:
Packit Service fa4841
			return "SCARD_S_SUCCESS";
Packit Service fa4841
Packit Service fa4841
		case SCARD_F_INTERNAL_ERROR:
Packit Service fa4841
			return "SCARD_F_INTERNAL_ERROR";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_CANCELLED:
Packit Service fa4841
			return "SCARD_E_CANCELLED";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_INVALID_HANDLE:
Packit Service fa4841
			return "SCARD_E_INVALID_HANDLE";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_INVALID_PARAMETER:
Packit Service fa4841
			return "SCARD_E_INVALID_PARAMETER";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_INVALID_TARGET:
Packit Service fa4841
			return "SCARD_E_INVALID_TARGET";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_NO_MEMORY:
Packit Service fa4841
			return "SCARD_E_NO_MEMORY";
Packit Service fa4841
Packit Service fa4841
		case SCARD_F_WAITED_TOO_LONG:
Packit Service fa4841
			return "SCARD_F_WAITED_TOO_LONG";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_INSUFFICIENT_BUFFER:
Packit Service fa4841
			return "SCARD_E_INSUFFICIENT_BUFFER";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_UNKNOWN_READER:
Packit Service fa4841
			return "SCARD_E_UNKNOWN_READER";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_TIMEOUT:
Packit Service fa4841
			return "SCARD_E_TIMEOUT";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_SHARING_VIOLATION:
Packit Service fa4841
			return "SCARD_E_SHARING_VIOLATION";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_NO_SMARTCARD:
Packit Service fa4841
			return "SCARD_E_NO_SMARTCARD";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_UNKNOWN_CARD:
Packit Service fa4841
			return "SCARD_E_UNKNOWN_CARD";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_CANT_DISPOSE:
Packit Service fa4841
			return "SCARD_E_CANT_DISPOSE";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_PROTO_MISMATCH:
Packit Service fa4841
			return "SCARD_E_PROTO_MISMATCH";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_NOT_READY:
Packit Service fa4841
			return "SCARD_E_NOT_READY";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_INVALID_VALUE:
Packit Service fa4841
			return "SCARD_E_INVALID_VALUE";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_SYSTEM_CANCELLED:
Packit Service fa4841
			return "SCARD_E_SYSTEM_CANCELLED";
Packit Service fa4841
Packit Service fa4841
		case SCARD_F_COMM_ERROR:
Packit Service fa4841
			return "SCARD_F_COMM_ERROR";
Packit Service fa4841
Packit Service fa4841
		case SCARD_F_UNKNOWN_ERROR:
Packit Service fa4841
			return "SCARD_F_UNKNOWN_ERROR";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_INVALID_ATR:
Packit Service fa4841
			return "SCARD_E_INVALID_ATR";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_NOT_TRANSACTED:
Packit Service fa4841
			return "SCARD_E_NOT_TRANSACTED";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_READER_UNAVAILABLE:
Packit Service fa4841
			return "SCARD_E_READER_UNAVAILABLE";
Packit Service fa4841
Packit Service fa4841
		case SCARD_P_SHUTDOWN:
Packit Service fa4841
			return "SCARD_P_SHUTDOWN";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_PCI_TOO_SMALL:
Packit Service fa4841
			return "SCARD_E_PCI_TOO_SMALL";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_READER_UNSUPPORTED:
Packit Service fa4841
			return "SCARD_E_READER_UNSUPPORTED";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_DUPLICATE_READER:
Packit Service fa4841
			return "SCARD_E_DUPLICATE_READER";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_CARD_UNSUPPORTED:
Packit Service fa4841
			return "SCARD_E_CARD_UNSUPPORTED";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_NO_SERVICE:
Packit Service fa4841
			return "SCARD_E_NO_SERVICE";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_SERVICE_STOPPED:
Packit Service fa4841
			return "SCARD_E_SERVICE_STOPPED";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_UNEXPECTED:
Packit Service fa4841
			return "SCARD_E_UNEXPECTED";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_ICC_INSTALLATION:
Packit Service fa4841
			return "SCARD_E_ICC_INSTALLATION";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_ICC_CREATEORDER:
Packit Service fa4841
			return "SCARD_E_ICC_CREATEORDER";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_UNSUPPORTED_FEATURE:
Packit Service fa4841
			return "SCARD_E_UNSUPPORTED_FEATURE";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_DIR_NOT_FOUND:
Packit Service fa4841
			return "SCARD_E_DIR_NOT_FOUND";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_FILE_NOT_FOUND:
Packit Service fa4841
			return "SCARD_E_FILE_NOT_FOUND";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_NO_DIR:
Packit Service fa4841
			return "SCARD_E_NO_DIR";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_NO_FILE:
Packit Service fa4841
			return "SCARD_E_NO_FILE";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_NO_ACCESS:
Packit Service fa4841
			return "SCARD_E_NO_ACCESS";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_WRITE_TOO_MANY:
Packit Service fa4841
			return "SCARD_E_WRITE_TOO_MANY";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_BAD_SEEK:
Packit Service fa4841
			return "SCARD_E_BAD_SEEK";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_INVALID_CHV:
Packit Service fa4841
			return "SCARD_E_INVALID_CHV";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_UNKNOWN_RES_MNG:
Packit Service fa4841
			return "SCARD_E_UNKNOWN_RES_MNG";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_NO_SUCH_CERTIFICATE:
Packit Service fa4841
			return "SCARD_E_NO_SUCH_CERTIFICATE";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_CERTIFICATE_UNAVAILABLE:
Packit Service fa4841
			return "SCARD_E_CERTIFICATE_UNAVAILABLE";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_NO_READERS_AVAILABLE:
Packit Service fa4841
			return "SCARD_E_NO_READERS_AVAILABLE";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_COMM_DATA_LOST:
Packit Service fa4841
			return "SCARD_E_COMM_DATA_LOST";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_NO_KEY_CONTAINER:
Packit Service fa4841
			return "SCARD_E_NO_KEY_CONTAINER";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_SERVER_TOO_BUSY:
Packit Service fa4841
			return "SCARD_E_SERVER_TOO_BUSY";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_PIN_CACHE_EXPIRED:
Packit Service fa4841
			return "SCARD_E_PIN_CACHE_EXPIRED";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_NO_PIN_CACHE:
Packit Service fa4841
			return "SCARD_E_NO_PIN_CACHE";
Packit Service fa4841
Packit Service fa4841
		case SCARD_E_READ_ONLY_CARD:
Packit Service fa4841
			return "SCARD_E_READ_ONLY_CARD";
Packit Service fa4841
Packit Service fa4841
		case SCARD_W_UNSUPPORTED_CARD:
Packit Service fa4841
			return "SCARD_W_UNSUPPORTED_CARD";
Packit Service fa4841
Packit Service fa4841
		case SCARD_W_UNRESPONSIVE_CARD:
Packit Service fa4841
			return "SCARD_W_UNRESPONSIVE_CARD";
Packit Service fa4841
Packit Service fa4841
		case SCARD_W_UNPOWERED_CARD:
Packit Service fa4841
			return "SCARD_W_UNPOWERED_CARD";
Packit Service fa4841
Packit Service fa4841
		case SCARD_W_RESET_CARD:
Packit Service fa4841
			return "SCARD_W_RESET_CARD";
Packit Service fa4841
Packit Service fa4841
		case SCARD_W_REMOVED_CARD:
Packit Service fa4841
			return "SCARD_W_REMOVED_CARD";
Packit Service fa4841
Packit Service fa4841
		case SCARD_W_SECURITY_VIOLATION:
Packit Service fa4841
			return "SCARD_W_SECURITY_VIOLATION";
Packit Service fa4841
Packit Service fa4841
		case SCARD_W_WRONG_CHV:
Packit Service fa4841
			return "SCARD_W_WRONG_CHV";
Packit Service fa4841
Packit Service fa4841
		case SCARD_W_CHV_BLOCKED:
Packit Service fa4841
			return "SCARD_W_CHV_BLOCKED";
Packit Service fa4841
Packit Service fa4841
		case SCARD_W_EOF:
Packit Service fa4841
			return "SCARD_W_EOF";
Packit Service fa4841
Packit Service fa4841
		case SCARD_W_CANCELLED_BY_USER:
Packit Service fa4841
			return "SCARD_W_CANCELLED_BY_USER";
Packit Service fa4841
Packit Service fa4841
		case SCARD_W_CARD_NOT_AUTHENTICATED:
Packit Service fa4841
			return "SCARD_W_CARD_NOT_AUTHENTICATED";
Packit Service fa4841
Packit Service fa4841
		case SCARD_W_CACHE_ITEM_NOT_FOUND:
Packit Service fa4841
			return "SCARD_W_CACHE_ITEM_NOT_FOUND";
Packit Service fa4841
Packit Service fa4841
		case SCARD_W_CACHE_ITEM_STALE:
Packit Service fa4841
			return "SCARD_W_CACHE_ITEM_STALE";
Packit Service fa4841
Packit Service fa4841
		case SCARD_W_CACHE_ITEM_TOO_BIG:
Packit Service fa4841
			return "SCARD_W_CACHE_ITEM_TOO_BIG";
Packit Service fa4841
Packit Service fa4841
		default:
Packit Service fa4841
			return "SCARD_E_UNKNOWN";
Packit Service fa4841
	}
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI const char* WINAPI SCardGetAttributeString(DWORD dwAttrId)
Packit Service fa4841
{
Packit Service fa4841
	switch (dwAttrId)
Packit Service fa4841
	{
Packit Service fa4841
		case SCARD_ATTR_VENDOR_NAME:
Packit Service fa4841
			return "SCARD_ATTR_VENDOR_NAME";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_VENDOR_IFD_TYPE:
Packit Service fa4841
			return "SCARD_ATTR_VENDOR_IFD_TYPE";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_VENDOR_IFD_VERSION:
Packit Service fa4841
			return "SCARD_ATTR_VENDOR_IFD_VERSION";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_VENDOR_IFD_SERIAL_NO:
Packit Service fa4841
			return "SCARD_ATTR_VENDOR_IFD_SERIAL_NO";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_CHANNEL_ID:
Packit Service fa4841
			return "SCARD_ATTR_CHANNEL_ID";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_PROTOCOL_TYPES:
Packit Service fa4841
			return "SCARD_ATTR_PROTOCOL_TYPES";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_DEFAULT_CLK:
Packit Service fa4841
			return "SCARD_ATTR_DEFAULT_CLK";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_MAX_CLK:
Packit Service fa4841
			return "SCARD_ATTR_MAX_CLK";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_DEFAULT_DATA_RATE:
Packit Service fa4841
			return "SCARD_ATTR_DEFAULT_DATA_RATE";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_MAX_DATA_RATE:
Packit Service fa4841
			return "SCARD_ATTR_MAX_DATA_RATE";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_MAX_IFSD:
Packit Service fa4841
			return "SCARD_ATTR_MAX_IFSD";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_POWER_MGMT_SUPPORT:
Packit Service fa4841
			return "SCARD_ATTR_POWER_MGMT_SUPPORT";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_USER_TO_CARD_AUTH_DEVICE:
Packit Service fa4841
			return "SCARD_ATTR_USER_TO_CARD_AUTH_DEVICE";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_USER_AUTH_INPUT_DEVICE:
Packit Service fa4841
			return "SCARD_ATTR_USER_AUTH_INPUT_DEVICE";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_CHARACTERISTICS:
Packit Service fa4841
			return "SCARD_ATTR_CHARACTERISTICS";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_CURRENT_PROTOCOL_TYPE:
Packit Service fa4841
			return "SCARD_ATTR_CURRENT_PROTOCOL_TYPE";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_CURRENT_CLK:
Packit Service fa4841
			return "SCARD_ATTR_CURRENT_CLK";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_CURRENT_F:
Packit Service fa4841
			return "SCARD_ATTR_CURRENT_F";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_CURRENT_D:
Packit Service fa4841
			return "SCARD_ATTR_CURRENT_D";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_CURRENT_N:
Packit Service fa4841
			return "SCARD_ATTR_CURRENT_N";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_CURRENT_W:
Packit Service fa4841
			return "SCARD_ATTR_CURRENT_W";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_CURRENT_IFSC:
Packit Service fa4841
			return "SCARD_ATTR_CURRENT_IFSC";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_CURRENT_IFSD:
Packit Service fa4841
			return "SCARD_ATTR_CURRENT_IFSD";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_CURRENT_BWT:
Packit Service fa4841
			return "SCARD_ATTR_CURRENT_BWT";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_CURRENT_CWT:
Packit Service fa4841
			return "SCARD_ATTR_CURRENT_CWT";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_CURRENT_EBC_ENCODING:
Packit Service fa4841
			return "SCARD_ATTR_CURRENT_EBC_ENCODING";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_EXTENDED_BWT:
Packit Service fa4841
			return "SCARD_ATTR_EXTENDED_BWT";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_ICC_PRESENCE:
Packit Service fa4841
			return "SCARD_ATTR_ICC_PRESENCE";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_ICC_INTERFACE_STATUS:
Packit Service fa4841
			return "SCARD_ATTR_ICC_INTERFACE_STATUS";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_CURRENT_IO_STATE:
Packit Service fa4841
			return "SCARD_ATTR_CURRENT_IO_STATE";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_ATR_STRING:
Packit Service fa4841
			return "SCARD_ATTR_ATR_STRING";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_ICC_TYPE_PER_ATR:
Packit Service fa4841
			return "SCARD_ATTR_ICC_TYPE_PER_ATR";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_ESC_RESET:
Packit Service fa4841
			return "SCARD_ATTR_ESC_RESET";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_ESC_CANCEL:
Packit Service fa4841
			return "SCARD_ATTR_ESC_CANCEL";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_ESC_AUTHREQUEST:
Packit Service fa4841
			return "SCARD_ATTR_ESC_AUTHREQUEST";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_MAXINPUT:
Packit Service fa4841
			return "SCARD_ATTR_MAXINPUT";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_DEVICE_UNIT:
Packit Service fa4841
			return "SCARD_ATTR_DEVICE_UNIT";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_DEVICE_IN_USE:
Packit Service fa4841
			return "SCARD_ATTR_DEVICE_IN_USE";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_DEVICE_FRIENDLY_NAME_A:
Packit Service fa4841
			return "SCARD_ATTR_DEVICE_FRIENDLY_NAME_A";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_DEVICE_SYSTEM_NAME_A:
Packit Service fa4841
			return "SCARD_ATTR_DEVICE_SYSTEM_NAME_A";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_DEVICE_FRIENDLY_NAME_W:
Packit Service fa4841
			return "SCARD_ATTR_DEVICE_FRIENDLY_NAME_W";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_DEVICE_SYSTEM_NAME_W:
Packit Service fa4841
			return "SCARD_ATTR_DEVICE_SYSTEM_NAME_W";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ATTR_SUPRESS_T1_IFS_REQUEST:
Packit Service fa4841
			return "SCARD_ATTR_SUPRESS_T1_IFS_REQUEST";
Packit Service fa4841
Packit Service fa4841
		default:
Packit Service fa4841
			return "SCARD_ATTR_UNKNOWN";
Packit Service fa4841
	}
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI const char* WINAPI SCardGetProtocolString(DWORD dwProtocols)
Packit Service fa4841
{
Packit Service fa4841
	if (dwProtocols == SCARD_PROTOCOL_UNDEFINED)
Packit Service fa4841
		return "SCARD_PROTOCOL_UNDEFINED";
Packit Service fa4841
Packit Service fa4841
	if (dwProtocols == SCARD_PROTOCOL_T0)
Packit Service fa4841
		return "SCARD_PROTOCOL_T0";
Packit Service fa4841
Packit Service fa4841
	if (dwProtocols == SCARD_PROTOCOL_T1)
Packit Service fa4841
		return "SCARD_PROTOCOL_T1";
Packit Service fa4841
Packit Service fa4841
	if (dwProtocols == SCARD_PROTOCOL_Tx)
Packit Service fa4841
		return "SCARD_PROTOCOL_Tx";
Packit Service fa4841
Packit Service fa4841
	if (dwProtocols == SCARD_PROTOCOL_RAW)
Packit Service fa4841
		return "SCARD_PROTOCOL_RAW";
Packit Service fa4841
Packit Service fa4841
	if (dwProtocols == SCARD_PROTOCOL_DEFAULT)
Packit Service fa4841
		return "SCARD_PROTOCOL_DEFAULT";
Packit Service fa4841
Packit Service fa4841
	if (dwProtocols == (SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_RAW))
Packit Service fa4841
		return "SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_RAW";
Packit Service fa4841
Packit Service fa4841
	if (dwProtocols == (SCARD_PROTOCOL_T1 | SCARD_PROTOCOL_RAW))
Packit Service fa4841
		return "SCARD_PROTOCOL_T1 | SCARD_PROTOCOL_RAW";
Packit Service fa4841
Packit Service fa4841
	if (dwProtocols == (SCARD_PROTOCOL_Tx | SCARD_PROTOCOL_RAW))
Packit Service fa4841
		return "SCARD_PROTOCOL_Tx | SCARD_PROTOCOL_RAW";
Packit Service fa4841
Packit Service fa4841
	return "SCARD_PROTOCOL_UNKNOWN";
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI const char* WINAPI SCardGetShareModeString(DWORD dwShareMode)
Packit Service fa4841
{
Packit Service fa4841
	switch (dwShareMode)
Packit Service fa4841
	{
Packit Service fa4841
		case SCARD_SHARE_EXCLUSIVE:
Packit Service fa4841
			return "SCARD_SHARE_EXCLUSIVE";
Packit Service fa4841
Packit Service fa4841
		case SCARD_SHARE_SHARED:
Packit Service fa4841
			return "SCARD_SHARE_SHARED";
Packit Service fa4841
Packit Service fa4841
		case SCARD_SHARE_DIRECT:
Packit Service fa4841
			return "SCARD_SHARE_DIRECT";
Packit Service fa4841
Packit Service fa4841
		default:
Packit Service fa4841
			return "SCARD_SHARE_UNKNOWN";
Packit Service fa4841
	}
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI const char* WINAPI SCardGetDispositionString(DWORD dwDisposition)
Packit Service fa4841
{
Packit Service fa4841
	switch (dwDisposition)
Packit Service fa4841
	{
Packit Service fa4841
		case SCARD_LEAVE_CARD:
Packit Service fa4841
			return "SCARD_LEAVE_CARD";
Packit Service fa4841
Packit Service fa4841
		case SCARD_RESET_CARD:
Packit Service fa4841
			return "SCARD_RESET_CARD";
Packit Service fa4841
Packit Service fa4841
		case SCARD_UNPOWER_CARD:
Packit Service fa4841
			return "SCARD_UNPOWER_CARD";
Packit Service fa4841
Packit Service fa4841
		default:
Packit Service fa4841
			return "SCARD_UNKNOWN_CARD";
Packit Service fa4841
	}
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI const char* WINAPI SCardGetScopeString(DWORD dwScope)
Packit Service fa4841
{
Packit Service fa4841
	switch (dwScope)
Packit Service fa4841
	{
Packit Service fa4841
		case SCARD_SCOPE_USER:
Packit Service fa4841
			return "SCARD_SCOPE_USER";
Packit Service fa4841
Packit Service fa4841
		case SCARD_SCOPE_TERMINAL:
Packit Service fa4841
			return "SCARD_SCOPE_TERMINAL";
Packit Service fa4841
Packit Service fa4841
		case SCARD_SCOPE_SYSTEM:
Packit Service fa4841
			return "SCARD_SCOPE_SYSTEM";
Packit Service fa4841
Packit Service fa4841
		default:
Packit Service fa4841
			return "SCARD_SCOPE_UNKNOWN";
Packit Service fa4841
	}
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI const char* WINAPI SCardGetCardStateString(DWORD dwCardState)
Packit Service fa4841
{
Packit Service fa4841
	switch (dwCardState)
Packit Service fa4841
	{
Packit Service fa4841
		case SCARD_UNKNOWN:
Packit Service fa4841
			return "SCARD_UNKNOWN";
Packit Service fa4841
Packit Service fa4841
		case SCARD_ABSENT:
Packit Service fa4841
			return "SCARD_ABSENT";
Packit Service fa4841
Packit Service fa4841
		case SCARD_PRESENT:
Packit Service fa4841
			return "SCARD_PRESENT";
Packit Service fa4841
Packit Service fa4841
		case SCARD_SWALLOWED:
Packit Service fa4841
			return "SCARD_SWALLOWED";
Packit Service fa4841
Packit Service fa4841
		case SCARD_POWERED:
Packit Service fa4841
			return "SCARD_POWERED";
Packit Service fa4841
Packit Service fa4841
		case SCARD_NEGOTIABLE:
Packit Service fa4841
			return "SCARD_NEGOTIABLE";
Packit Service fa4841
Packit Service fa4841
		case SCARD_SPECIFIC:
Packit Service fa4841
			return "SCARD_SPECIFIC";
Packit Service fa4841
Packit Service fa4841
		default:
Packit Service fa4841
			return "SCARD_UNKNOWN";
Packit Service fa4841
	}
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WINSCARDAPI char* WINAPI SCardGetReaderStateString(DWORD dwReaderState)
Packit Service fa4841
{
Packit Service fa4841
	char* szReaderState = malloc(512);
Packit Service fa4841
Packit Service fa4841
	if (!szReaderState)
Packit Service fa4841
		return NULL;
Packit Service fa4841
Packit Service fa4841
	szReaderState[0] = '\0';
Packit Service fa4841
Packit Service fa4841
	if (dwReaderState & SCARD_STATE_IGNORE)
Packit Service fa4841
	{
Packit Service fa4841
		if (szReaderState[0])
Packit Service fa4841
			strcat(szReaderState, " | ");
Packit Service fa4841
Packit Service fa4841
		strcat(szReaderState, "SCARD_STATE_IGNORE");
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	if (dwReaderState & SCARD_STATE_CHANGED)
Packit Service fa4841
	{
Packit Service fa4841
		if (szReaderState[0])
Packit Service fa4841
			strcat(szReaderState, " | ");
Packit Service fa4841
Packit Service fa4841
		strcat(szReaderState, "SCARD_STATE_CHANGED");
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	if (dwReaderState & SCARD_STATE_UNKNOWN)
Packit Service fa4841
	{
Packit Service fa4841
		if (szReaderState[0])
Packit Service fa4841
			strcat(szReaderState, " | ");
Packit Service fa4841
Packit Service fa4841
		strcat(szReaderState, "SCARD_STATE_UNKNOWN");
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	if (dwReaderState & SCARD_STATE_UNAVAILABLE)
Packit Service fa4841
	{
Packit Service fa4841
		if (szReaderState[0])
Packit Service fa4841
			strcat(szReaderState, " | ");
Packit Service fa4841
Packit Service fa4841
		strcat(szReaderState, "SCARD_STATE_UNAVAILABLE");
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	if (dwReaderState & SCARD_STATE_EMPTY)
Packit Service fa4841
	{
Packit Service fa4841
		if (szReaderState[0])
Packit Service fa4841
			strcat(szReaderState, " | ");
Packit Service fa4841
Packit Service fa4841
		strcat(szReaderState, "SCARD_STATE_EMPTY");
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	if (dwReaderState & SCARD_STATE_PRESENT)
Packit Service fa4841
	{
Packit Service fa4841
		if (szReaderState[0])
Packit Service fa4841
			strcat(szReaderState, " | ");
Packit Service fa4841
Packit Service fa4841
		strcat(szReaderState, "SCARD_STATE_PRESENT");
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	if (dwReaderState & SCARD_STATE_ATRMATCH)
Packit Service fa4841
	{
Packit Service fa4841
		if (szReaderState[0])
Packit Service fa4841
			strcat(szReaderState, " | ");
Packit Service fa4841
Packit Service fa4841
		strcat(szReaderState, "SCARD_STATE_ATRMATCH");
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	if (dwReaderState & SCARD_STATE_EXCLUSIVE)
Packit Service fa4841
	{
Packit Service fa4841
		if (szReaderState[0])
Packit Service fa4841
			strcat(szReaderState, " | ");
Packit Service fa4841
Packit Service fa4841
		strcat(szReaderState, "SCARD_STATE_EXCLUSIVE");
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	if (dwReaderState & SCARD_STATE_INUSE)
Packit Service fa4841
	{
Packit Service fa4841
		if (szReaderState[0])
Packit Service fa4841
			strcat(szReaderState, " | ");
Packit Service fa4841
Packit Service fa4841
		strcat(szReaderState, "SCARD_STATE_INUSE");
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	if (dwReaderState & SCARD_STATE_MUTE)
Packit Service fa4841
	{
Packit Service fa4841
		if (szReaderState[0])
Packit Service fa4841
			strcat(szReaderState, " | ");
Packit Service fa4841
Packit Service fa4841
		strcat(szReaderState, "SCARD_STATE_MUTE");
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	if (dwReaderState & SCARD_STATE_UNPOWERED)
Packit Service fa4841
	{
Packit Service fa4841
		if (szReaderState[0])
Packit Service fa4841
			strcat(szReaderState, " | ");
Packit Service fa4841
Packit Service fa4841
		strcat(szReaderState, "SCARD_STATE_UNPOWERED");
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	if (!szReaderState[0])
Packit Service fa4841
		strcat(szReaderState, "SCARD_STATE_UNAWARE");
Packit Service fa4841
Packit Service fa4841
	return szReaderState;
Packit Service fa4841
}