diff --git a/client/common/cmdline.c b/client/common/cmdline.c index 9d06c909e..c32616dd5 100644 --- a/client/common/cmdline.c +++ b/client/common/cmdline.c @@ -2890,6 +2890,11 @@ static int freerdp_client_settings_parse_command_line_arguments_int(rdpSettings* if (!freerdp_settings_set_string(settings, FreeRDP_SspiModule, arg->Value)) return COMMAND_LINE_ERROR_MEMORY; } + CommandLineSwitchCase(arg, "winscard-module") + { + if (!freerdp_settings_set_string(settings, FreeRDP_WinSCardModule, arg->Value)) + return COMMAND_LINE_ERROR_MEMORY; + } CommandLineSwitchCase(arg, "redirect-prefer") { size_t count = 0; diff --git a/client/common/cmdline.h b/client/common/cmdline.h index 6972658b8..c7e841e44 100644 --- a/client/common/cmdline.h +++ b/client/common/cmdline.h @@ -435,6 +435,8 @@ static const COMMAND_LINE_ARGUMENT_A global_cmd_args[] = { "SSH Agent forwarding channel" }, { "sspi-module", COMMAND_LINE_VALUE_REQUIRED, "", NULL, NULL, -1, NULL, "SSPI shared library module file path" }, + { "winscard-module", COMMAND_LINE_VALUE_REQUIRED, "", NULL, NULL, -1, + NULL, "WinSCard shared library module file path" }, { "disable-output", COMMAND_LINE_VALUE_FLAG, NULL, NULL, NULL, -1, NULL, "Deactivate all graphics decoding in the client session. Useful for load tests with many " "simultaneous connections" }, diff --git a/include/freerdp/settings.h b/include/freerdp/settings.h index 1c050ba80..0aaa89b60 100644 --- a/include/freerdp/settings.h +++ b/include/freerdp/settings.h @@ -647,6 +647,7 @@ extern "C" #define FreeRDP_AuthenticationPackageList (1110) #define FreeRDP_RdstlsSecurity (1111) #define FreeRDP_AadSecurity (1112) +#define FreeRDP_WinSCardModule (1113) #define FreeRDP_MstscCookieMode (1152) #define FreeRDP_CookieMaxLength (1153) #define FreeRDP_PreconnectionId (1154) @@ -1168,7 +1169,8 @@ extern "C" ALIGN64 char* AuthenticationPackageList; /* 1110 */ ALIGN64 BOOL RdstlsSecurity; /* 1111 */ ALIGN64 BOOL AadSecurity; /* 1112 */ - UINT64 padding1152[1152 - 1113]; /* 1113 */ + ALIGN64 char* WinSCardModule; /* 1113 */ + UINT64 padding1152[1152 - 1114]; /* 1114 */ /* Connection Cookie */ ALIGN64 BOOL MstscCookieMode; /* 1152 */ diff --git a/libfreerdp/common/settings_getters.c b/libfreerdp/common/settings_getters.c index ac971c2c1..67a118da8 100644 --- a/libfreerdp/common/settings_getters.c +++ b/libfreerdp/common/settings_getters.c @@ -2828,6 +2828,9 @@ const char* freerdp_settings_get_string(const rdpSettings* settings, size_t id) case FreeRDP_Username: return settings->Username; + case FreeRDP_WinSCardModule: + return settings->WinSCardModule; + case FreeRDP_WindowTitle: return settings->WindowTitle; @@ -3106,6 +3109,9 @@ char* freerdp_settings_get_string_writable(rdpSettings* settings, size_t id) case FreeRDP_Username: return settings->Username; + case FreeRDP_WinSCardModule: + return settings->WinSCardModule; + case FreeRDP_WindowTitle: return settings->WindowTitle; @@ -3393,6 +3399,9 @@ BOOL freerdp_settings_set_string_(rdpSettings* settings, size_t id, char* val, s case FreeRDP_Username: return update_string_(&settings->Username, cnv.c, len); + case FreeRDP_WinSCardModule: + return update_string_(&settings->WinSCardModule, cnv.c, len); + case FreeRDP_WindowTitle: return update_string_(&settings->WindowTitle, cnv.c, len); @@ -3698,6 +3707,9 @@ BOOL freerdp_settings_set_string_copy_(rdpSettings* settings, size_t id, const c case FreeRDP_Username: return update_string_copy_(&settings->Username, cnv.cc, len, cleanup); + case FreeRDP_WinSCardModule: + return update_string_copy_(&settings->WinSCardModule, cnv.cc, len, cleanup); + case FreeRDP_WindowTitle: return update_string_copy_(&settings->WindowTitle, cnv.cc, len, cleanup); diff --git a/libfreerdp/common/settings_str.c b/libfreerdp/common/settings_str.c index c9f57e72c..756d937b9 100644 --- a/libfreerdp/common/settings_str.c +++ b/libfreerdp/common/settings_str.c @@ -540,6 +540,7 @@ static const struct settings_str_entry settings_map[] = { { FreeRDP_UserSpecifiedServerName, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_UserSpecifiedServerName" }, { FreeRDP_Username, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_Username" }, + { FreeRDP_WinSCardModule, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_WinSCardModule" }, { FreeRDP_WindowTitle, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_WindowTitle" }, { FreeRDP_WmClass, FREERDP_SETTINGS_TYPE_STRING, "FreeRDP_WmClass" }, { FreeRDP_BitmapCacheV2CellInfo, FREERDP_SETTINGS_TYPE_POINTER, diff --git a/libfreerdp/core/test/settings_property_lists.h b/libfreerdp/core/test/settings_property_lists.h index b4a695295..b4e53a097 100644 --- a/libfreerdp/core/test/settings_property_lists.h +++ b/libfreerdp/core/test/settings_property_lists.h @@ -430,6 +430,7 @@ static const size_t string_list_indices[] = { FreeRDP_TransportDumpFile, FreeRDP_UserSpecifiedServerName, FreeRDP_Username, + FreeRDP_WinSCardModule, FreeRDP_WindowTitle, FreeRDP_WmClass, }; diff --git a/libfreerdp/utils/smartcard_call.c b/libfreerdp/utils/smartcard_call.c index df4b6639a..0b8718ee1 100644 --- a/libfreerdp/utils/smartcard_call.c +++ b/libfreerdp/utils/smartcard_call.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -47,10 +48,12 @@ #include #define str(x) #x -#define wrap(ctx, fkt, ...) \ - ctx->useEmulatedCard ? Emulate_##fkt(ctx->emulation, ##__VA_ARGS__) : fkt(__VA_ARGS__) +#define wrap(ctx, fkt, ...) \ + ctx->useEmulatedCard ? Emulate_##fkt(ctx->emulation, ##__VA_ARGS__) \ + : ctx->pWinSCardApi->pfn##fkt(__VA_ARGS__) #else -#define wrap(ctx, fkt, ...) ctx->useEmulatedCard ? SCARD_F_INTERNAL_ERROR : fkt(__VA_ARGS__) +#define wrap(ctx, fkt, ...) \ + ctx->useEmulatedCard ? SCARD_F_INTERNAL_ERROR : ctx->pWinSCardApi->pfn##fkt(__VA_ARGS__) #endif #define SCARD_MAX_TIMEOUT 60000 @@ -64,6 +67,9 @@ struct s_scard_call_context #if defined(WITH_SMARTCARD_EMULATE) SmartcardEmulationContext* emulation; #endif + HANDLE hWinSCardLibrary; + SCardApiFunctionTable WinSCardApi; + SCardApiFunctionTable const* pWinSCardApi; HANDLE stopEvent; void* userdata; @@ -1855,6 +1861,32 @@ scard_call_context* smartcard_call_context_new(const rdpSettings* settings) goto fail; #endif } + else + { + if (settings->WinSCardModule) + { + ctx->hWinSCardLibrary = LoadLibraryX(settings->WinSCardModule); + + if (!ctx->hWinSCardLibrary) + { + WLog_ERR(TAG, "Failed to load WinSCard library: '%s'", settings->WinSCardModule); + goto fail; + } + + ctx->pWinSCardApi = &ctx->WinSCardApi; + WinSCard_LoadApiTableFunctions(ctx->pWinSCardApi, ctx->hWinSCardLibrary); + } + else + { + ctx->pWinSCardApi = WinPR_GetSCardApiFunctionTable(); + } + + if (!ctx->pWinSCardApi) + { + WLog_ERR(TAG, "Failed to load WinSCard API!"); + goto fail; + } + } ctx->rgSCardContextList = HashTable_New(FALSE); if (!ctx->rgSCardContextList) @@ -1893,6 +1925,16 @@ void smartcard_call_context_free(scard_call_context* ctx) } #endif } + + if (ctx->hWinSCardLibrary) + { + ZeroMemory(&ctx->WinSCardApi, sizeof(SCardApiFunctionTable)); + FreeLibrary(ctx->hWinSCardLibrary); + ctx->hWinSCardLibrary = NULL; + } + + ctx->pWinSCardApi = NULL; + HashTable_Free(ctx->rgSCardContextList); CloseHandle(ctx->stopEvent); free(ctx); diff --git a/winpr/include/winpr/smartcard.h b/winpr/include/winpr/smartcard.h index 4a9b966ea..2b7d09713 100644 --- a/winpr/include/winpr/smartcard.h +++ b/winpr/include/winpr/smartcard.h @@ -1209,6 +1209,10 @@ extern "C" WINSCARDAPI const char* WINAPI SCardGetCardStateString(DWORD dwCardState); WINSCARDAPI char* WINAPI SCardGetReaderStateString(DWORD dwReaderState); + WINPR_API bool WinSCard_LoadApiTableFunctions(PSCardApiFunctionTable pWinSCardApiTable, + HMODULE hWinSCardLibrary); + WINPR_API SCardApiFunctionTable const* WinPR_GetSCardApiFunctionTable(void); + #ifdef __cplusplus } #endif diff --git a/winpr/libwinpr/smartcard/CMakeLists.txt b/winpr/libwinpr/smartcard/CMakeLists.txt index 0e2701ed1..68e5277f3 100644 --- a/winpr/libwinpr/smartcard/CMakeLists.txt +++ b/winpr/libwinpr/smartcard/CMakeLists.txt @@ -44,8 +44,8 @@ endif() if(WIN32) list(APPEND ${MODULE_PREFIX}_SRCS - smartcard_winscard.c - smartcard_winscard.h) + smartcard_windows.c + smartcard_windows.h) endif() winpr_module_add(${${MODULE_PREFIX}_SRCS}) diff --git a/winpr/libwinpr/smartcard/smartcard.c b/winpr/libwinpr/smartcard/smartcard.c index fe452e2bb..986c7ceb6 100644 --- a/winpr/libwinpr/smartcard/smartcard.c +++ b/winpr/libwinpr/smartcard/smartcard.c @@ -26,6 +26,7 @@ #include #include #include +#include #include "../log.h" @@ -83,19 +84,16 @@ const SCARD_IO_REQUEST g_rgSCardRawPci = { SCARD_PROTOCOL_RAW, 8 }; static BOOL CALLBACK InitializeSCardApiStubs(PINIT_ONCE once, PVOID param, PVOID* context) { +#ifdef _WIN32 + if (Windows_InitializeSCardApi() >= 0) + g_SCardApi = Windows_GetSCardApiFunctionTable(); +#else #if defined(WITH_SMARTCARD_PCSC) -#ifndef _WIN32 - if (PCSC_InitializeSCardApi() >= 0) g_SCardApi = PCSC_GetSCardApiFunctionTable(); - -#else - - if (WinSCard_InitializeSCardApi() >= 0) - g_SCardApi = WinSCard_GetSCardApiFunctionTable(); - #endif #endif + #if defined(WITH_SMARTCARD_INSPECT) g_SCardApi = Inspect_RegisterSCardApi(g_SCardApi); #endif @@ -1101,3 +1099,181 @@ WINSCARDAPI char* WINAPI SCardGetReaderStateString(DWORD dwReaderState) return buffer; } + +#define WINSCARD_LOAD_PROC(_name, ...) \ + pWinSCardApiTable->pfn##_name = (fn##_name)GetProcAddress(hWinSCardLibrary, #_name); + +bool WinSCard_LoadApiTableFunctions(PSCardApiFunctionTable pWinSCardApiTable, + HMODULE hWinSCardLibrary) +{ + WINPR_ASSERT(pWinSCardApiTable); + WINPR_ASSERT(hWinSCardLibrary); + + WINSCARD_LOAD_PROC(SCardEstablishContext); + WINSCARD_LOAD_PROC(SCardReleaseContext); + WINSCARD_LOAD_PROC(SCardIsValidContext); + WINSCARD_LOAD_PROC(SCardListReaderGroupsA); + WINSCARD_LOAD_PROC(SCardListReaderGroupsW); + WINSCARD_LOAD_PROC(SCardListReadersA); + WINSCARD_LOAD_PROC(SCardListReadersW); + WINSCARD_LOAD_PROC(SCardListCardsA); + WINSCARD_LOAD_PROC(SCardListCardsW); + WINSCARD_LOAD_PROC(SCardListInterfacesA); + WINSCARD_LOAD_PROC(SCardListInterfacesW); + WINSCARD_LOAD_PROC(SCardGetProviderIdA); + WINSCARD_LOAD_PROC(SCardGetProviderIdW); + WINSCARD_LOAD_PROC(SCardGetCardTypeProviderNameA); + WINSCARD_LOAD_PROC(SCardGetCardTypeProviderNameW); + WINSCARD_LOAD_PROC(SCardIntroduceReaderGroupA); + WINSCARD_LOAD_PROC(SCardIntroduceReaderGroupW); + WINSCARD_LOAD_PROC(SCardForgetReaderGroupA); + WINSCARD_LOAD_PROC(SCardForgetReaderGroupW); + WINSCARD_LOAD_PROC(SCardIntroduceReaderA); + WINSCARD_LOAD_PROC(SCardIntroduceReaderW); + WINSCARD_LOAD_PROC(SCardForgetReaderA); + WINSCARD_LOAD_PROC(SCardForgetReaderW); + WINSCARD_LOAD_PROC(SCardAddReaderToGroupA); + WINSCARD_LOAD_PROC(SCardAddReaderToGroupW); + WINSCARD_LOAD_PROC(SCardRemoveReaderFromGroupA); + WINSCARD_LOAD_PROC(SCardRemoveReaderFromGroupW); + WINSCARD_LOAD_PROC(SCardIntroduceCardTypeA); + WINSCARD_LOAD_PROC(SCardIntroduceCardTypeW); + WINSCARD_LOAD_PROC(SCardSetCardTypeProviderNameA); + WINSCARD_LOAD_PROC(SCardSetCardTypeProviderNameW); + WINSCARD_LOAD_PROC(SCardForgetCardTypeA); + WINSCARD_LOAD_PROC(SCardForgetCardTypeW); + WINSCARD_LOAD_PROC(SCardFreeMemory); + WINSCARD_LOAD_PROC(SCardAccessStartedEvent); + WINSCARD_LOAD_PROC(SCardReleaseStartedEvent); + WINSCARD_LOAD_PROC(SCardLocateCardsA); + WINSCARD_LOAD_PROC(SCardLocateCardsW); + WINSCARD_LOAD_PROC(SCardLocateCardsByATRA); + WINSCARD_LOAD_PROC(SCardLocateCardsByATRW); + WINSCARD_LOAD_PROC(SCardGetStatusChangeA); + WINSCARD_LOAD_PROC(SCardGetStatusChangeW); + WINSCARD_LOAD_PROC(SCardCancel); + WINSCARD_LOAD_PROC(SCardConnectA); + WINSCARD_LOAD_PROC(SCardConnectW); + WINSCARD_LOAD_PROC(SCardReconnect); + WINSCARD_LOAD_PROC(SCardDisconnect); + WINSCARD_LOAD_PROC(SCardBeginTransaction); + WINSCARD_LOAD_PROC(SCardEndTransaction); + WINSCARD_LOAD_PROC(SCardCancelTransaction); + WINSCARD_LOAD_PROC(SCardState); + WINSCARD_LOAD_PROC(SCardStatusA); + WINSCARD_LOAD_PROC(SCardStatusW); + WINSCARD_LOAD_PROC(SCardTransmit); + WINSCARD_LOAD_PROC(SCardGetTransmitCount); + WINSCARD_LOAD_PROC(SCardControl); + WINSCARD_LOAD_PROC(SCardGetAttrib); + WINSCARD_LOAD_PROC(SCardSetAttrib); + WINSCARD_LOAD_PROC(SCardUIDlgSelectCardA); + WINSCARD_LOAD_PROC(SCardUIDlgSelectCardW); + WINSCARD_LOAD_PROC(GetOpenCardNameA); + WINSCARD_LOAD_PROC(GetOpenCardNameW); + WINSCARD_LOAD_PROC(SCardDlgExtendedError); + WINSCARD_LOAD_PROC(SCardReadCacheA); + WINSCARD_LOAD_PROC(SCardReadCacheW); + WINSCARD_LOAD_PROC(SCardWriteCacheA); + WINSCARD_LOAD_PROC(SCardWriteCacheW); + WINSCARD_LOAD_PROC(SCardGetReaderIconA); + WINSCARD_LOAD_PROC(SCardGetReaderIconW); + WINSCARD_LOAD_PROC(SCardGetDeviceTypeIdA); + WINSCARD_LOAD_PROC(SCardGetDeviceTypeIdW); + WINSCARD_LOAD_PROC(SCardGetReaderDeviceInstanceIdA); + WINSCARD_LOAD_PROC(SCardGetReaderDeviceInstanceIdW); + WINSCARD_LOAD_PROC(SCardListReadersWithDeviceInstanceIdA); + WINSCARD_LOAD_PROC(SCardListReadersWithDeviceInstanceIdW); + WINSCARD_LOAD_PROC(SCardAudit); + + return true; +} + +static const SCardApiFunctionTable WinPR_SCardApiFunctionTable = { + 0, /* dwVersion */ + 0, /* dwFlags */ + + SCardEstablishContext, /* SCardEstablishContext */ + SCardReleaseContext, /* SCardReleaseContext */ + SCardIsValidContext, /* SCardIsValidContext */ + SCardListReaderGroupsA, /* SCardListReaderGroupsA */ + SCardListReaderGroupsW, /* SCardListReaderGroupsW */ + SCardListReadersA, /* SCardListReadersA */ + SCardListReadersW, /* SCardListReadersW */ + SCardListCardsA, /* SCardListCardsA */ + SCardListCardsW, /* SCardListCardsW */ + SCardListInterfacesA, /* SCardListInterfacesA */ + SCardListInterfacesW, /* SCardListInterfacesW */ + SCardGetProviderIdA, /* SCardGetProviderIdA */ + SCardGetProviderIdW, /* SCardGetProviderIdW */ + SCardGetCardTypeProviderNameA, /* SCardGetCardTypeProviderNameA */ + SCardGetCardTypeProviderNameW, /* SCardGetCardTypeProviderNameW */ + SCardIntroduceReaderGroupA, /* SCardIntroduceReaderGroupA */ + SCardIntroduceReaderGroupW, /* SCardIntroduceReaderGroupW */ + SCardForgetReaderGroupA, /* SCardForgetReaderGroupA */ + SCardForgetReaderGroupW, /* SCardForgetReaderGroupW */ + SCardIntroduceReaderA, /* SCardIntroduceReaderA */ + SCardIntroduceReaderW, /* SCardIntroduceReaderW */ + SCardForgetReaderA, /* SCardForgetReaderA */ + SCardForgetReaderW, /* SCardForgetReaderW */ + SCardAddReaderToGroupA, /* SCardAddReaderToGroupA */ + SCardAddReaderToGroupW, /* SCardAddReaderToGroupW */ + SCardRemoveReaderFromGroupA, /* SCardRemoveReaderFromGroupA */ + SCardRemoveReaderFromGroupW, /* SCardRemoveReaderFromGroupW */ + SCardIntroduceCardTypeA, /* SCardIntroduceCardTypeA */ + SCardIntroduceCardTypeW, /* SCardIntroduceCardTypeW */ + SCardSetCardTypeProviderNameA, /* SCardSetCardTypeProviderNameA */ + SCardSetCardTypeProviderNameW, /* SCardSetCardTypeProviderNameW */ + SCardForgetCardTypeA, /* SCardForgetCardTypeA */ + SCardForgetCardTypeW, /* SCardForgetCardTypeW */ + SCardFreeMemory, /* SCardFreeMemory */ + SCardAccessStartedEvent, /* SCardAccessStartedEvent */ + SCardReleaseStartedEvent, /* SCardReleaseStartedEvent */ + SCardLocateCardsA, /* SCardLocateCardsA */ + SCardLocateCardsW, /* SCardLocateCardsW */ + SCardLocateCardsByATRA, /* SCardLocateCardsByATRA */ + SCardLocateCardsByATRW, /* SCardLocateCardsByATRW */ + SCardGetStatusChangeA, /* SCardGetStatusChangeA */ + SCardGetStatusChangeW, /* SCardGetStatusChangeW */ + SCardCancel, /* SCardCancel */ + SCardConnectA, /* SCardConnectA */ + SCardConnectW, /* SCardConnectW */ + SCardReconnect, /* SCardReconnect */ + SCardDisconnect, /* SCardDisconnect */ + SCardBeginTransaction, /* SCardBeginTransaction */ + SCardEndTransaction, /* SCardEndTransaction */ + SCardCancelTransaction, /* SCardCancelTransaction */ + SCardState, /* SCardState */ + SCardStatusA, /* SCardStatusA */ + SCardStatusW, /* SCardStatusW */ + SCardTransmit, /* SCardTransmit */ + SCardGetTransmitCount, /* SCardGetTransmitCount */ + SCardControl, /* SCardControl */ + SCardGetAttrib, /* SCardGetAttrib */ + SCardSetAttrib, /* SCardSetAttrib */ + SCardUIDlgSelectCardA, /* SCardUIDlgSelectCardA */ + SCardUIDlgSelectCardW, /* SCardUIDlgSelectCardW */ + GetOpenCardNameA, /* GetOpenCardNameA */ + GetOpenCardNameW, /* GetOpenCardNameW */ + SCardDlgExtendedError, /* SCardDlgExtendedError */ + SCardReadCacheA, /* SCardReadCacheA */ + SCardReadCacheW, /* SCardReadCacheW */ + SCardWriteCacheA, /* SCardWriteCacheA */ + SCardWriteCacheW, /* SCardWriteCacheW */ + SCardGetReaderIconA, /* SCardGetReaderIconA */ + SCardGetReaderIconW, /* SCardGetReaderIconW */ + SCardGetDeviceTypeIdA, /* SCardGetDeviceTypeIdA */ + SCardGetDeviceTypeIdW, /* SCardGetDeviceTypeIdW */ + SCardGetReaderDeviceInstanceIdA, /* SCardGetReaderDeviceInstanceIdA */ + SCardGetReaderDeviceInstanceIdW, /* SCardGetReaderDeviceInstanceIdW */ + SCardListReadersWithDeviceInstanceIdA, /* SCardListReadersWithDeviceInstanceIdA */ + SCardListReadersWithDeviceInstanceIdW, /* SCardListReadersWithDeviceInstanceIdW */ + SCardAudit /* SCardAudit */ +}; + +static SCardApiFunctionTable const* pWinPR_SCardApiFunctionTable = &WinPR_SCardApiFunctionTable; + +SCardApiFunctionTable const* WinPR_GetSCardApiFunctionTable(void) +{ + return pWinPR_SCardApiFunctionTable; +} diff --git a/winpr/libwinpr/smartcard/smartcard.h b/winpr/libwinpr/smartcard/smartcard.h index a9787de30..e9279bc6f 100644 --- a/winpr/libwinpr/smartcard/smartcard.h +++ b/winpr/libwinpr/smartcard/smartcard.h @@ -25,7 +25,7 @@ #ifndef _WIN32 #include "smartcard_pcsc.h" #else -#include "smartcard_winscard.h" +#include "smartcard_windows.h" #endif #endif /* WINPR_SMARTCARD_PRIVATE_H */ diff --git a/winpr/libwinpr/smartcard/smartcard_winscard.c b/winpr/libwinpr/smartcard/smartcard_windows.c similarity index 50% rename from winpr/libwinpr/smartcard/smartcard_winscard.c rename to winpr/libwinpr/smartcard/smartcard_windows.c index 439a20672..967a2a0d0 100644 --- a/winpr/libwinpr/smartcard/smartcard_winscard.c +++ b/winpr/libwinpr/smartcard/smartcard_windows.c @@ -19,17 +19,15 @@ #include -#ifdef _WIN32 - #include #include #include -#include "smartcard_winscard.h" +#include "smartcard_windows.h" static HMODULE g_WinSCardModule = NULL; -SCardApiFunctionTable WinSCard_SCardApiFunctionTable = { +static SCardApiFunctionTable Windows_SCardApiFunctionTable = { 0, /* dwVersion */ 0, /* dwFlags */ @@ -111,95 +109,18 @@ SCardApiFunctionTable WinSCard_SCardApiFunctionTable = { NULL /* SCardAudit */ }; -PSCardApiFunctionTable WinSCard_GetSCardApiFunctionTable(void) +const SCardApiFunctionTable* Windows_GetSCardApiFunctionTable(void) { - return &WinSCard_SCardApiFunctionTable; + return &Windows_SCardApiFunctionTable; } -int WinSCard_InitializeSCardApi(void) +int Windows_InitializeSCardApi(void) { g_WinSCardModule = LoadLibraryA("WinSCard.dll"); if (!g_WinSCardModule) return -1; - WINSCARD_LOAD_PROC(SCardEstablishContext); - WINSCARD_LOAD_PROC(SCardReleaseContext); - WINSCARD_LOAD_PROC(SCardIsValidContext); - WINSCARD_LOAD_PROC(SCardListReaderGroupsA); - WINSCARD_LOAD_PROC(SCardListReaderGroupsW); - WINSCARD_LOAD_PROC(SCardListReadersA); - WINSCARD_LOAD_PROC(SCardListReadersW); - WINSCARD_LOAD_PROC(SCardListCardsA); - WINSCARD_LOAD_PROC(SCardListCardsW); - WINSCARD_LOAD_PROC(SCardListInterfacesA); - WINSCARD_LOAD_PROC(SCardListInterfacesW); - WINSCARD_LOAD_PROC(SCardGetProviderIdA); - WINSCARD_LOAD_PROC(SCardGetProviderIdW); - WINSCARD_LOAD_PROC(SCardGetCardTypeProviderNameA); - WINSCARD_LOAD_PROC(SCardGetCardTypeProviderNameW); - WINSCARD_LOAD_PROC(SCardIntroduceReaderGroupA); - WINSCARD_LOAD_PROC(SCardIntroduceReaderGroupW); - WINSCARD_LOAD_PROC(SCardForgetReaderGroupA); - WINSCARD_LOAD_PROC(SCardForgetReaderGroupW); - WINSCARD_LOAD_PROC(SCardIntroduceReaderA); - WINSCARD_LOAD_PROC(SCardIntroduceReaderW); - WINSCARD_LOAD_PROC(SCardForgetReaderA); - WINSCARD_LOAD_PROC(SCardForgetReaderW); - WINSCARD_LOAD_PROC(SCardAddReaderToGroupA); - WINSCARD_LOAD_PROC(SCardAddReaderToGroupW); - WINSCARD_LOAD_PROC(SCardRemoveReaderFromGroupA); - WINSCARD_LOAD_PROC(SCardRemoveReaderFromGroupW); - WINSCARD_LOAD_PROC(SCardIntroduceCardTypeA); - WINSCARD_LOAD_PROC(SCardIntroduceCardTypeW); - WINSCARD_LOAD_PROC(SCardSetCardTypeProviderNameA); - WINSCARD_LOAD_PROC(SCardSetCardTypeProviderNameW); - WINSCARD_LOAD_PROC(SCardForgetCardTypeA); - WINSCARD_LOAD_PROC(SCardForgetCardTypeW); - WINSCARD_LOAD_PROC(SCardFreeMemory); - WINSCARD_LOAD_PROC(SCardAccessStartedEvent); - WINSCARD_LOAD_PROC(SCardReleaseStartedEvent); - WINSCARD_LOAD_PROC(SCardLocateCardsA); - WINSCARD_LOAD_PROC(SCardLocateCardsW); - WINSCARD_LOAD_PROC(SCardLocateCardsByATRA); - WINSCARD_LOAD_PROC(SCardLocateCardsByATRW); - WINSCARD_LOAD_PROC(SCardGetStatusChangeA); - WINSCARD_LOAD_PROC(SCardGetStatusChangeW); - WINSCARD_LOAD_PROC(SCardCancel); - WINSCARD_LOAD_PROC(SCardConnectA); - WINSCARD_LOAD_PROC(SCardConnectW); - WINSCARD_LOAD_PROC(SCardReconnect); - WINSCARD_LOAD_PROC(SCardDisconnect); - WINSCARD_LOAD_PROC(SCardBeginTransaction); - WINSCARD_LOAD_PROC(SCardEndTransaction); - WINSCARD_LOAD_PROC(SCardCancelTransaction); - WINSCARD_LOAD_PROC(SCardState); - WINSCARD_LOAD_PROC(SCardStatusA); - WINSCARD_LOAD_PROC(SCardStatusW); - WINSCARD_LOAD_PROC(SCardTransmit); - WINSCARD_LOAD_PROC(SCardGetTransmitCount); - WINSCARD_LOAD_PROC(SCardControl); - WINSCARD_LOAD_PROC(SCardGetAttrib); - WINSCARD_LOAD_PROC(SCardSetAttrib); - WINSCARD_LOAD_PROC(SCardUIDlgSelectCardA); - WINSCARD_LOAD_PROC(SCardUIDlgSelectCardW); - WINSCARD_LOAD_PROC(GetOpenCardNameA); - WINSCARD_LOAD_PROC(GetOpenCardNameW); - WINSCARD_LOAD_PROC(SCardDlgExtendedError); - WINSCARD_LOAD_PROC(SCardReadCacheA); - WINSCARD_LOAD_PROC(SCardReadCacheW); - WINSCARD_LOAD_PROC(SCardWriteCacheA); - WINSCARD_LOAD_PROC(SCardWriteCacheW); - WINSCARD_LOAD_PROC(SCardGetReaderIconA); - WINSCARD_LOAD_PROC(SCardGetReaderIconW); - WINSCARD_LOAD_PROC(SCardGetDeviceTypeIdA); - WINSCARD_LOAD_PROC(SCardGetDeviceTypeIdW); - WINSCARD_LOAD_PROC(SCardGetReaderDeviceInstanceIdA); - WINSCARD_LOAD_PROC(SCardGetReaderDeviceInstanceIdW); - WINSCARD_LOAD_PROC(SCardListReadersWithDeviceInstanceIdA); - WINSCARD_LOAD_PROC(SCardListReadersWithDeviceInstanceIdW); - WINSCARD_LOAD_PROC(SCardAudit); + WinSCard_LoadApiTableFunctions(&Windows_SCardApiFunctionTable, g_WinSCardModule); return 1; } - -#endif diff --git a/winpr/libwinpr/smartcard/smartcard_winscard.h b/winpr/libwinpr/smartcard/smartcard_windows.h similarity index 76% rename from winpr/libwinpr/smartcard/smartcard_winscard.h rename to winpr/libwinpr/smartcard/smartcard_windows.h index 82eeb8fbe..4df72b0af 100644 --- a/winpr/libwinpr/smartcard/smartcard_winscard.h +++ b/winpr/libwinpr/smartcard/smartcard_windows.h @@ -20,16 +20,9 @@ #ifndef WINPR_SMARTCARD_WINSCARD_PRIVATE_H #define WINPR_SMARTCARD_WINSCARD_PRIVATE_H -#ifdef _WIN32 - #include -#define WINSCARD_LOAD_PROC(_name, ...) \ - WinSCard_SCardApiFunctionTable.pfn##_name = (fn##_name)GetProcAddress(g_WinSCardModule, #_name); - -int WinSCard_InitializeSCardApi(void); -PSCardApiFunctionTable WinSCard_GetSCardApiFunctionTable(void); - -#endif +int Windows_InitializeSCardApi(void); +const SCardApiFunctionTable* Windows_GetSCardApiFunctionTable(void); #endif /* WINPR_SMARTCARD_WINSCARD_PRIVATE_H */