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 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 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 1fb8d4
static PSCardApiFunctionTable g_SCardApi = NULL;
Packit 1fb8d4
Packit 1fb8d4
#define SCARDAPI_STUB_CALL_LONG(_name, ...) \
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSCardApiStubs, NULL, NULL); \
Packit 1fb8d4
	if (!g_SCardApi || !g_SCardApi->pfn ## _name) \
Packit 1fb8d4
		return SCARD_E_NO_SERVICE; \
Packit 1fb8d4
	return g_SCardApi->pfn ## _name ( __VA_ARGS__ )
Packit 1fb8d4
Packit 1fb8d4
#define SCARDAPI_STUB_CALL_HANDLE(_name, ...) \
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSCardApiStubs, NULL, NULL); \
Packit 1fb8d4
	if (!g_SCardApi || !g_SCardApi->pfn ## _name) \
Packit 1fb8d4
		return NULL; \
Packit 1fb8d4
	return g_SCardApi->pfn ## _name ( __VA_ARGS__ )
Packit 1fb8d4
Packit 1fb8d4
#define SCARDAPI_STUB_CALL_VOID(_name, ...) \
Packit 1fb8d4
	InitOnceExecuteOnce(&g_Initialized, InitializeSCardApiStubs, NULL, NULL); \
Packit 1fb8d4
	if (!g_SCardApi || !g_SCardApi->pfn ## _name) \
Packit 1fb8d4
		return; \
Packit 1fb8d4
	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 1fb8d4
WINSCARDAPI LONG WINAPI SCardEstablishContext(DWORD dwScope,
Packit 1fb8d4
        LPCVOID pvReserved1, LPCVOID pvReserved2, LPSCARDCONTEXT phContext)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardEstablishContext,
Packit 1fb8d4
	                        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 1fb8d4
WINSCARDAPI LONG WINAPI SCardListReaderGroupsA(SCARDCONTEXT hContext,
Packit 1fb8d4
        LPSTR mszGroups, LPDWORD pcchGroups)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardListReaderGroupsA, hContext, mszGroups, pcchGroups);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
WINSCARDAPI LONG WINAPI SCardListReaderGroupsW(SCARDCONTEXT hContext,
Packit 1fb8d4
        LPWSTR mszGroups, LPDWORD pcchGroups)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardListReaderGroupsW, hContext, mszGroups, pcchGroups);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
WINSCARDAPI LONG WINAPI SCardListReadersA(SCARDCONTEXT hContext,
Packit 1fb8d4
        LPCSTR mszGroups, LPSTR mszReaders, LPDWORD pcchReaders)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardListReadersA, hContext, mszGroups, mszReaders, pcchReaders);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
WINSCARDAPI LONG WINAPI SCardListReadersW(SCARDCONTEXT hContext,
Packit 1fb8d4
        LPCWSTR mszGroups, LPWSTR mszReaders, LPDWORD pcchReaders)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardListReadersW, hContext, mszGroups, mszReaders, pcchReaders);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
WINSCARDAPI LONG WINAPI SCardListCardsA(SCARDCONTEXT hContext,
Packit 1fb8d4
                                        LPCBYTE pbAtr, LPCGUID rgquidInterfaces, DWORD cguidInterfaceCount, CHAR* mszCards,
Packit 1fb8d4
                                        LPDWORD pcchCards)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardListCardsA, hContext, pbAtr,
Packit 1fb8d4
	                        rgquidInterfaces, cguidInterfaceCount, mszCards, pcchCards);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
WINSCARDAPI LONG WINAPI SCardListCardsW(SCARDCONTEXT hContext,
Packit 1fb8d4
                                        LPCBYTE pbAtr, LPCGUID rgquidInterfaces, DWORD cguidInterfaceCount, WCHAR* mszCards,
Packit 1fb8d4
                                        LPDWORD pcchCards)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardListCardsW, hContext, pbAtr,
Packit 1fb8d4
	                        rgquidInterfaces, cguidInterfaceCount, mszCards, pcchCards);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
WINSCARDAPI LONG WINAPI SCardListInterfacesA(SCARDCONTEXT hContext,
Packit 1fb8d4
        LPCSTR szCard, LPGUID pguidInterfaces, LPDWORD pcguidInterfaces)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardListInterfacesA, hContext, szCard, pguidInterfaces, pcguidInterfaces);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
WINSCARDAPI LONG WINAPI SCardListInterfacesW(SCARDCONTEXT hContext,
Packit 1fb8d4
        LPCWSTR szCard, LPGUID pguidInterfaces, LPDWORD pcguidInterfaces)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardListInterfacesW, hContext, szCard, pguidInterfaces, pcguidInterfaces);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
WINSCARDAPI LONG WINAPI SCardGetProviderIdA(SCARDCONTEXT hContext,
Packit 1fb8d4
        LPCSTR szCard, LPGUID pguidProviderId)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardGetProviderIdA, hContext, szCard, pguidProviderId);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
WINSCARDAPI LONG WINAPI SCardGetProviderIdW(SCARDCONTEXT hContext,
Packit 1fb8d4
        LPCWSTR szCard, LPGUID pguidProviderId)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardGetProviderIdW, hContext, szCard, pguidProviderId);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
WINSCARDAPI LONG WINAPI SCardGetCardTypeProviderNameA(SCARDCONTEXT hContext,
Packit 1fb8d4
        LPCSTR szCardName, DWORD dwProviderId, CHAR* szProvider, LPDWORD pcchProvider)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardGetCardTypeProviderNameA, hContext, szCardName,
Packit 1fb8d4
	                        dwProviderId, szProvider, pcchProvider);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
WINSCARDAPI LONG WINAPI SCardGetCardTypeProviderNameW(SCARDCONTEXT hContext,
Packit 1fb8d4
        LPCWSTR szCardName, DWORD dwProviderId, WCHAR* szProvider, LPDWORD pcchProvider)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardGetCardTypeProviderNameW, hContext, szCardName,
Packit 1fb8d4
	                        dwProviderId, 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 1fb8d4
WINSCARDAPI LONG WINAPI SCardIntroduceReaderA(SCARDCONTEXT hContext,
Packit 1fb8d4
        LPCSTR szReaderName, LPCSTR szDeviceName)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardIntroduceReaderA, hContext, szReaderName, szDeviceName);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
WINSCARDAPI LONG WINAPI SCardIntroduceReaderW(SCARDCONTEXT hContext,
Packit 1fb8d4
        LPCWSTR szReaderName, 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 1fb8d4
WINSCARDAPI LONG WINAPI SCardAddReaderToGroupA(SCARDCONTEXT hContext,
Packit 1fb8d4
        LPCSTR szReaderName, LPCSTR szGroupName)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardAddReaderToGroupA, hContext, szReaderName, szGroupName);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
WINSCARDAPI LONG WINAPI SCardAddReaderToGroupW(SCARDCONTEXT hContext,
Packit 1fb8d4
        LPCWSTR szReaderName, LPCWSTR szGroupName)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardAddReaderToGroupW, hContext, szReaderName, szGroupName);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
WINSCARDAPI LONG WINAPI SCardRemoveReaderFromGroupA(SCARDCONTEXT hContext,
Packit 1fb8d4
        LPCSTR szReaderName, LPCSTR szGroupName)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardRemoveReaderFromGroupA, hContext, szReaderName, szGroupName);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
WINSCARDAPI LONG WINAPI SCardRemoveReaderFromGroupW(SCARDCONTEXT hContext,
Packit 1fb8d4
        LPCWSTR szReaderName, LPCWSTR szGroupName)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardRemoveReaderFromGroupW, hContext, szReaderName, szGroupName);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
WINSCARDAPI LONG WINAPI SCardIntroduceCardTypeA(SCARDCONTEXT hContext,
Packit 1fb8d4
        LPCSTR szCardName, LPCGUID pguidPrimaryProvider, LPCGUID rgguidInterfaces,
Packit 1fb8d4
        DWORD dwInterfaceCount, 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 1fb8d4
WINSCARDAPI LONG WINAPI SCardIntroduceCardTypeW(SCARDCONTEXT hContext,
Packit 1fb8d4
        LPCWSTR szCardName, LPCGUID pguidPrimaryProvider, LPCGUID rgguidInterfaces,
Packit 1fb8d4
        DWORD dwInterfaceCount, 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 1fb8d4
WINSCARDAPI LONG WINAPI SCardSetCardTypeProviderNameA(SCARDCONTEXT hContext,
Packit 1fb8d4
        LPCSTR szCardName, DWORD dwProviderId, LPCSTR szProvider)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardSetCardTypeProviderNameA, hContext, szCardName, dwProviderId,
Packit 1fb8d4
	                        szProvider);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
WINSCARDAPI LONG WINAPI SCardSetCardTypeProviderNameW(SCARDCONTEXT hContext,
Packit 1fb8d4
        LPCWSTR szCardName, 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 1fb8d4
WINSCARDAPI LONG WINAPI SCardFreeMemory(SCARDCONTEXT hContext, LPCVOID 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 1fb8d4
WINSCARDAPI LONG WINAPI SCardLocateCardsA(SCARDCONTEXT hContext,
Packit 1fb8d4
        LPCSTR mszCards, LPSCARD_READERSTATEA rgReaderStates, DWORD cReaders)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardLocateCardsA, hContext, mszCards, rgReaderStates, cReaders);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
WINSCARDAPI LONG WINAPI SCardLocateCardsW(SCARDCONTEXT hContext,
Packit 1fb8d4
        LPCWSTR mszCards, LPSCARD_READERSTATEW rgReaderStates, DWORD cReaders)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardLocateCardsW, hContext, mszCards, rgReaderStates, cReaders);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
WINSCARDAPI LONG WINAPI SCardLocateCardsByATRA(SCARDCONTEXT hContext,
Packit 1fb8d4
        LPSCARD_ATRMASK rgAtrMasks, DWORD cAtrs, LPSCARD_READERSTATEA rgReaderStates, DWORD cReaders)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardLocateCardsByATRA, hContext, rgAtrMasks, cAtrs, rgReaderStates,
Packit 1fb8d4
	                        cReaders);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
WINSCARDAPI LONG WINAPI SCardLocateCardsByATRW(SCARDCONTEXT hContext,
Packit 1fb8d4
        LPSCARD_ATRMASK rgAtrMasks, DWORD cAtrs, LPSCARD_READERSTATEW rgReaderStates, DWORD cReaders)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardLocateCardsByATRW, hContext, rgAtrMasks, cAtrs, rgReaderStates,
Packit 1fb8d4
	                        cReaders);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
WINSCARDAPI LONG WINAPI SCardGetStatusChangeA(SCARDCONTEXT hContext,
Packit 1fb8d4
        DWORD dwTimeout, LPSCARD_READERSTATEA rgReaderStates, DWORD cReaders)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardGetStatusChangeA, hContext, dwTimeout, rgReaderStates, cReaders);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
WINSCARDAPI LONG WINAPI SCardGetStatusChangeW(SCARDCONTEXT hContext,
Packit 1fb8d4
        DWORD dwTimeout, 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 1fb8d4
WINSCARDAPI LONG WINAPI SCardConnectA(SCARDCONTEXT hContext,
Packit 1fb8d4
                                      LPCSTR szReader, DWORD dwShareMode, DWORD dwPreferredProtocols,
Packit 1fb8d4
                                      LPSCARDHANDLE phCard, LPDWORD pdwActiveProtocol)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardConnectA, hContext, szReader, dwShareMode,
Packit 1fb8d4
	                        dwPreferredProtocols, phCard, pdwActiveProtocol);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
WINSCARDAPI LONG WINAPI SCardConnectW(SCARDCONTEXT hContext,
Packit 1fb8d4
                                      LPCWSTR szReader, DWORD dwShareMode, DWORD dwPreferredProtocols,
Packit 1fb8d4
                                      LPSCARDHANDLE phCard, LPDWORD pdwActiveProtocol)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardConnectW, hContext, szReader, dwShareMode,
Packit 1fb8d4
	                        dwPreferredProtocols, phCard, pdwActiveProtocol);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
WINSCARDAPI LONG WINAPI SCardReconnect(SCARDHANDLE hCard,
Packit 1fb8d4
                                       DWORD dwShareMode, DWORD dwPreferredProtocols, DWORD dwInitialization, LPDWORD pdwActiveProtocol)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardReconnect, hCard, dwShareMode,
Packit 1fb8d4
	                        dwPreferredProtocols, 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 1fb8d4
WINSCARDAPI LONG WINAPI SCardState(SCARDHANDLE hCard,
Packit 1fb8d4
                                   LPDWORD pdwState, LPDWORD pdwProtocol, LPBYTE pbAtr, LPDWORD pcbAtrLen)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardState, hCard, pdwState, pdwProtocol, pbAtr, pcbAtrLen);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
WINSCARDAPI LONG WINAPI SCardStatusA(SCARDHANDLE hCard,
Packit 1fb8d4
                                     LPSTR mszReaderNames, LPDWORD pcchReaderLen, LPDWORD pdwState,
Packit 1fb8d4
                                     LPDWORD pdwProtocol, LPBYTE pbAtr, LPDWORD pcbAtrLen)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardStatusA, hCard, mszReaderNames, pcchReaderLen,
Packit 1fb8d4
	                        pdwState, pdwProtocol, pbAtr, pcbAtrLen);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
WINSCARDAPI LONG WINAPI SCardStatusW(SCARDHANDLE hCard,
Packit 1fb8d4
                                     LPWSTR mszReaderNames, LPDWORD pcchReaderLen, LPDWORD pdwState,
Packit 1fb8d4
                                     LPDWORD pdwProtocol, LPBYTE pbAtr, LPDWORD pcbAtrLen)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardStatusW, hCard, mszReaderNames, pcchReaderLen,
Packit 1fb8d4
	                        pdwState, pdwProtocol, pbAtr, pcbAtrLen);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
WINSCARDAPI LONG WINAPI SCardTransmit(SCARDHANDLE hCard,
Packit 1fb8d4
                                      LPCSCARD_IO_REQUEST pioSendPci, LPCBYTE pbSendBuffer, DWORD cbSendLength,
Packit 1fb8d4
                                      LPSCARD_IO_REQUEST pioRecvPci, LPBYTE pbRecvBuffer, 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 1fb8d4
WINSCARDAPI LONG WINAPI SCardControl(SCARDHANDLE hCard,
Packit 1fb8d4
                                     DWORD dwControlCode, LPCVOID lpInBuffer, DWORD cbInBufferSize,
Packit 1fb8d4
                                     LPVOID lpOutBuffer, 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 1fb8d4
WINSCARDAPI LONG WINAPI SCardReadCacheA(SCARDCONTEXT hContext,
Packit 1fb8d4
                                        UUID* CardIdentifier, DWORD FreshnessCounter, LPSTR LookupName, PBYTE Data, DWORD* DataLen)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardReadCacheA, hContext, CardIdentifier,
Packit 1fb8d4
	                        FreshnessCounter, LookupName, Data, DataLen);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
WINSCARDAPI LONG WINAPI SCardReadCacheW(SCARDCONTEXT hContext,
Packit 1fb8d4
                                        UUID* CardIdentifier,  DWORD FreshnessCounter, LPWSTR LookupName, PBYTE Data, DWORD* DataLen)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardReadCacheW, hContext, CardIdentifier,
Packit 1fb8d4
	                        FreshnessCounter, LookupName, Data, DataLen);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
WINSCARDAPI LONG WINAPI SCardWriteCacheA(SCARDCONTEXT hContext,
Packit 1fb8d4
        UUID* CardIdentifier, DWORD FreshnessCounter, LPSTR LookupName, PBYTE Data, DWORD DataLen)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardWriteCacheA, hContext, CardIdentifier,
Packit 1fb8d4
	                        FreshnessCounter, LookupName, Data, DataLen);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
WINSCARDAPI LONG WINAPI SCardWriteCacheW(SCARDCONTEXT hContext,
Packit 1fb8d4
        UUID* CardIdentifier, DWORD FreshnessCounter, LPWSTR LookupName, PBYTE Data, DWORD DataLen)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardWriteCacheW, hContext, CardIdentifier,
Packit 1fb8d4
	                        FreshnessCounter, LookupName, Data, DataLen);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
WINSCARDAPI LONG WINAPI SCardGetReaderIconA(SCARDCONTEXT hContext,
Packit 1fb8d4
        LPCSTR szReaderName, LPBYTE pbIcon, LPDWORD pcbIcon)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardGetReaderIconA, hContext, szReaderName, pbIcon, pcbIcon);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
WINSCARDAPI LONG WINAPI SCardGetReaderIconW(SCARDCONTEXT hContext,
Packit 1fb8d4
        LPCWSTR szReaderName, 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 1fb8d4
        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 1fb8d4
        LPDWORD pdwDeviceTypeId)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardGetDeviceTypeIdW, hContext, szReaderName, pdwDeviceTypeId);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
WINSCARDAPI LONG WINAPI SCardGetReaderDeviceInstanceIdA(SCARDCONTEXT hContext,
Packit 1fb8d4
        LPCSTR szReaderName, LPSTR szDeviceInstanceId, LPDWORD pcchDeviceInstanceId)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardGetReaderDeviceInstanceIdA, hContext, szReaderName,
Packit 1fb8d4
	                        szDeviceInstanceId, pcchDeviceInstanceId);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
WINSCARDAPI LONG WINAPI SCardGetReaderDeviceInstanceIdW(SCARDCONTEXT hContext,
Packit 1fb8d4
        LPCWSTR szReaderName, LPWSTR szDeviceInstanceId, 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 1fb8d4
        LPCSTR szDeviceInstanceId, LPSTR mszReaders, LPDWORD pcchReaders)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardListReadersWithDeviceInstanceIdA,
Packit 1fb8d4
	                        hContext, szDeviceInstanceId, mszReaders, pcchReaders);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
WINSCARDAPI LONG WINAPI SCardListReadersWithDeviceInstanceIdW(SCARDCONTEXT hContext,
Packit 1fb8d4
        LPCWSTR szDeviceInstanceId, LPWSTR mszReaders, LPDWORD pcchReaders)
Packit 1fb8d4
{
Packit 1fb8d4
	SCARDAPI_STUB_CALL_LONG(SCardListReadersWithDeviceInstanceIdW,
Packit 1fb8d4
	                        hContext, szDeviceInstanceId, 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
	return "SCARD_E_UNKNOWN";
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
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_VENDOR_IFD_TYPE:
Packit 1fb8d4
			return "SCARD_ATTR_VENDOR_IFD_TYPE";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_VENDOR_IFD_VERSION:
Packit 1fb8d4
			return "SCARD_ATTR_VENDOR_IFD_VERSION";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_VENDOR_IFD_SERIAL_NO:
Packit 1fb8d4
			return "SCARD_ATTR_VENDOR_IFD_SERIAL_NO";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_CHANNEL_ID:
Packit 1fb8d4
			return "SCARD_ATTR_CHANNEL_ID";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_PROTOCOL_TYPES:
Packit 1fb8d4
			return "SCARD_ATTR_PROTOCOL_TYPES";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_DEFAULT_CLK:
Packit 1fb8d4
			return "SCARD_ATTR_DEFAULT_CLK";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_MAX_CLK:
Packit 1fb8d4
			return "SCARD_ATTR_MAX_CLK";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_DEFAULT_DATA_RATE:
Packit 1fb8d4
			return "SCARD_ATTR_DEFAULT_DATA_RATE";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_MAX_DATA_RATE:
Packit 1fb8d4
			return "SCARD_ATTR_MAX_DATA_RATE";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_MAX_IFSD:
Packit 1fb8d4
			return "SCARD_ATTR_MAX_IFSD";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_POWER_MGMT_SUPPORT:
Packit 1fb8d4
			return "SCARD_ATTR_POWER_MGMT_SUPPORT";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_USER_TO_CARD_AUTH_DEVICE:
Packit 1fb8d4
			return "SCARD_ATTR_USER_TO_CARD_AUTH_DEVICE";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_USER_AUTH_INPUT_DEVICE:
Packit 1fb8d4
			return "SCARD_ATTR_USER_AUTH_INPUT_DEVICE";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_CHARACTERISTICS:
Packit 1fb8d4
			return "SCARD_ATTR_CHARACTERISTICS";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_CURRENT_PROTOCOL_TYPE:
Packit 1fb8d4
			return "SCARD_ATTR_CURRENT_PROTOCOL_TYPE";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_CURRENT_CLK:
Packit 1fb8d4
			return "SCARD_ATTR_CURRENT_CLK";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_CURRENT_F:
Packit 1fb8d4
			return "SCARD_ATTR_CURRENT_F";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_CURRENT_D:
Packit 1fb8d4
			return "SCARD_ATTR_CURRENT_D";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_CURRENT_N:
Packit 1fb8d4
			return "SCARD_ATTR_CURRENT_N";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_CURRENT_W:
Packit 1fb8d4
			return "SCARD_ATTR_CURRENT_W";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_CURRENT_IFSC:
Packit 1fb8d4
			return "SCARD_ATTR_CURRENT_IFSC";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_CURRENT_IFSD:
Packit 1fb8d4
			return "SCARD_ATTR_CURRENT_IFSD";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_CURRENT_BWT:
Packit 1fb8d4
			return "SCARD_ATTR_CURRENT_BWT";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_CURRENT_CWT:
Packit 1fb8d4
			return "SCARD_ATTR_CURRENT_CWT";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_CURRENT_EBC_ENCODING:
Packit 1fb8d4
			return "SCARD_ATTR_CURRENT_EBC_ENCODING";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_EXTENDED_BWT:
Packit 1fb8d4
			return "SCARD_ATTR_EXTENDED_BWT";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_ICC_PRESENCE:
Packit 1fb8d4
			return "SCARD_ATTR_ICC_PRESENCE";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_ICC_INTERFACE_STATUS:
Packit 1fb8d4
			return "SCARD_ATTR_ICC_INTERFACE_STATUS";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_CURRENT_IO_STATE:
Packit 1fb8d4
			return "SCARD_ATTR_CURRENT_IO_STATE";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_ATR_STRING:
Packit 1fb8d4
			return "SCARD_ATTR_ATR_STRING";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_ICC_TYPE_PER_ATR:
Packit 1fb8d4
			return "SCARD_ATTR_ICC_TYPE_PER_ATR";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_ESC_RESET:
Packit 1fb8d4
			return "SCARD_ATTR_ESC_RESET";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_ESC_CANCEL:
Packit 1fb8d4
			return "SCARD_ATTR_ESC_CANCEL";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_ESC_AUTHREQUEST:
Packit 1fb8d4
			return "SCARD_ATTR_ESC_AUTHREQUEST";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_MAXINPUT:
Packit 1fb8d4
			return "SCARD_ATTR_MAXINPUT";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_DEVICE_UNIT:
Packit 1fb8d4
			return "SCARD_ATTR_DEVICE_UNIT";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_DEVICE_IN_USE:
Packit 1fb8d4
			return "SCARD_ATTR_DEVICE_IN_USE";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_DEVICE_FRIENDLY_NAME_A:
Packit 1fb8d4
			return "SCARD_ATTR_DEVICE_FRIENDLY_NAME_A";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_DEVICE_SYSTEM_NAME_A:
Packit 1fb8d4
			return "SCARD_ATTR_DEVICE_SYSTEM_NAME_A";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_DEVICE_FRIENDLY_NAME_W:
Packit 1fb8d4
			return "SCARD_ATTR_DEVICE_FRIENDLY_NAME_W";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_DEVICE_SYSTEM_NAME_W:
Packit 1fb8d4
			return "SCARD_ATTR_DEVICE_SYSTEM_NAME_W";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ATTR_SUPRESS_T1_IFS_REQUEST:
Packit 1fb8d4
			return "SCARD_ATTR_SUPRESS_T1_IFS_REQUEST";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		default:
Packit 1fb8d4
			return "SCARD_ATTR_UNKNOWN";
Packit 1fb8d4
			break;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return "SCARD_ATTR_UNKNOWN";
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
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_SHARE_SHARED:
Packit 1fb8d4
			return "SCARD_SHARE_SHARED";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_SHARE_DIRECT:
Packit 1fb8d4
			return "SCARD_SHARE_DIRECT";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		default:
Packit 1fb8d4
			return "SCARD_SHARE_UNKNOWN";
Packit 1fb8d4
			break;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return "SCARD_SHARE_UNKNOWN";
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
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_RESET_CARD:
Packit 1fb8d4
			return "SCARD_RESET_CARD";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_UNPOWER_CARD:
Packit 1fb8d4
			return "SCARD_UNPOWER_CARD";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		default:
Packit 1fb8d4
			return "SCARD_UNKNOWN_CARD";
Packit 1fb8d4
			break;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return "SCARD_UNKNOWN_CARD";
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
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_SCOPE_TERMINAL:
Packit 1fb8d4
			return "SCARD_SCOPE_TERMINAL";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_SCOPE_SYSTEM:
Packit 1fb8d4
			return "SCARD_SCOPE_SYSTEM";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		default:
Packit 1fb8d4
			return "SCARD_SCOPE_UNKNOWN";
Packit 1fb8d4
			break;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return "SCARD_SCOPE_UNKNOWN";
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
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_ABSENT:
Packit 1fb8d4
			return "SCARD_ABSENT";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_PRESENT:
Packit 1fb8d4
			return "SCARD_PRESENT";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_SWALLOWED:
Packit 1fb8d4
			return "SCARD_SWALLOWED";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_POWERED:
Packit 1fb8d4
			return "SCARD_POWERED";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_NEGOTIABLE:
Packit 1fb8d4
			return "SCARD_NEGOTIABLE";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SCARD_SPECIFIC:
Packit 1fb8d4
			return "SCARD_SPECIFIC";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		default:
Packit 1fb8d4
			return "SCARD_UNKNOWN";
Packit 1fb8d4
			break;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return "SCARD_UNKNOWN";
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
}