From: akallabeth Date: Sat, 6 Feb 2021 14:55:21 +0000 (+0100) Subject: Fixed SCardState wrapper X-Git-Tag: 2.3.0~27 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fupstream%2Ffreerdp.git;a=commitdiff_plain;h=12737094ee28bbf1f7365d11d1a40f0351dfb016 Fixed SCardState wrapper (cherry picked from commit e5a1dae34f018d45049304a10a22658d853b1cc0) --- diff --git a/winpr/libwinpr/smartcard/smartcard_pcsc.c b/winpr/libwinpr/smartcard/smartcard_pcsc.c index abe2b08..c290792 100644 --- a/winpr/libwinpr/smartcard/smartcard_pcsc.c +++ b/winpr/libwinpr/smartcard/smartcard_pcsc.c @@ -1765,45 +1765,6 @@ static LONG WINAPI PCSC_SCardCancelTransaction(SCARDHANDLE hCard) return SCARD_S_SUCCESS; } -static LONG WINAPI PCSC_SCardState(SCARDHANDLE hCard, LPDWORD pdwState, LPDWORD pdwProtocol, - LPBYTE pbAtr, LPDWORD pcbAtrLen) -{ - PCSC_DWORD cchReaderLen; - SCARDCONTEXT hContext = 0; - LPSTR mszReaderNames = NULL; - PCSC_LONG status = SCARD_S_SUCCESS; - PCSC_SCARDHANDLE* pCard = NULL; - PCSC_DWORD pcsc_dwState = 0; - PCSC_DWORD pcsc_dwProtocol = 0; - PCSC_DWORD pcsc_cbAtrLen = (PCSC_DWORD)*pcbAtrLen; - - if (!g_PCSC.pfnSCardStatus) - return PCSC_SCard_LogError("g_PCSC.pfnSCardStatus"); - - pCard = PCSC_GetCardHandleData(hCard); - - if (!pCard) - return SCARD_E_INVALID_VALUE; - - PCSC_WaitForCardAccess(0, hCard, pCard->shared); - hContext = PCSC_GetCardContextFromHandle(hCard); - - if (!hContext) - return SCARD_E_INVALID_VALUE; - - cchReaderLen = SCARD_AUTOALLOCATE; - status = g_PCSC.pfnSCardStatus(hCard, (LPSTR)&mszReaderNames, &cchReaderLen, &pcsc_dwState, - &pcsc_dwProtocol, pbAtr, &pcsc_cbAtrLen); - - if (mszReaderNames) - PCSC_SCardFreeMemory_Internal(hContext, mszReaderNames); - - *pdwState = (DWORD)pcsc_dwState; - *pdwProtocol = PCSC_ConvertProtocolsToWinSCard((DWORD)pcsc_dwProtocol); - *pcbAtrLen = (DWORD)pcsc_cbAtrLen; - return PCSC_MapErrorCodeToWinSCard(status); -} - /* * PCSC returns a string but Windows SCardStatus requires the return to be a multi string. * Therefore extra length checks and additional buffer allocation is required @@ -1979,6 +1940,48 @@ out_fail: return (LONG)status; } +static LONG WINAPI PCSC_SCardState(SCARDHANDLE hCard, LPDWORD pdwState, LPDWORD pdwProtocol, + LPBYTE pbAtr, LPDWORD pcbAtrLen) +{ + DWORD cchReaderLen; + SCARDCONTEXT hContext = 0; + LPSTR mszReaderNames = NULL; + PCSC_LONG status = SCARD_S_SUCCESS; + PCSC_SCARDHANDLE* pCard = NULL; + DWORD pcsc_dwState = 0; + DWORD pcsc_dwProtocol = 0; + DWORD pcsc_cbAtrLen = 0; + if (pcbAtrLen) + pcsc_cbAtrLen = (PCSC_DWORD)*pcbAtrLen; + + if (!g_PCSC.pfnSCardStatus) + return PCSC_SCard_LogError("g_PCSC.pfnSCardStatus"); + + pCard = PCSC_GetCardHandleData(hCard); + + if (!pCard) + return SCARD_E_INVALID_VALUE; + + PCSC_WaitForCardAccess(0, hCard, pCard->shared); + hContext = PCSC_GetCardContextFromHandle(hCard); + + if (!hContext) + return SCARD_E_INVALID_VALUE; + + cchReaderLen = SCARD_AUTOALLOCATE; + status = PCSC_SCardStatus_Internal(hCard, (LPSTR)&mszReaderNames, &cchReaderLen, &pcsc_dwState, + &pcsc_dwProtocol, pbAtr, &pcsc_cbAtrLen, FALSE); + + if (mszReaderNames) + PCSC_SCardFreeMemory_Internal(hContext, mszReaderNames); + + *pdwState = (DWORD)pcsc_dwState; + *pdwProtocol = PCSC_ConvertProtocolsToWinSCard((DWORD)pcsc_dwProtocol); + if (pcbAtrLen) + *pcbAtrLen = (DWORD)pcsc_cbAtrLen; + return PCSC_MapErrorCodeToWinSCard(status); +} + static LONG WINAPI PCSC_SCardStatusA(SCARDHANDLE hCard, LPSTR mszReaderNames, LPDWORD pcchReaderLen, LPDWORD pdwState, LPDWORD pdwProtocol, LPBYTE pbAtr, LPDWORD pcbAtrLen)