Blame winpr/libwinpr/smartcard/smartcard.c

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