Module: wine Branch: master Commit: 836974d4d8f506391b76e0d4e10cb4b14bbe56e7 URL: https://gitlab.winehq.org/wine/wine/-/commit/836974d4d8f506391b76e0d4e10cb4b...
Author: Hans Leidekker hans@codeweavers.com Date: Thu Feb 16 12:36:13 2023 +0100
winscard: Implement SCardStatusA/W().
---
dlls/winscard/unixlib.c | 9 +++++ dlls/winscard/unixlib.h | 12 +++++++ dlls/winscard/winscard.c | 90 +++++++++++++++++++++++++++++++++++++++++++----- 3 files changed, 103 insertions(+), 8 deletions(-)
diff --git a/dlls/winscard/unixlib.c b/dlls/winscard/unixlib.c index df852548805..4f975ef40f9 100644 --- a/dlls/winscard/unixlib.c +++ b/dlls/winscard/unixlib.c @@ -39,6 +39,7 @@ LONG SCardCancel( UINT64 ); LONG SCardListReaders( UINT64, const char *, char *, UINT64 * ); LONG SCardListReaderGroups( UINT64, char *, UINT64 * ); LONG SCardConnect( UINT64, const char *, UINT64, UINT64, UINT64 *, UINT64 * ); +LONG SCardStatus( UINT64, char *, UINT64 *, UINT64 *, UINT64 *, BYTE *, UINT64 * );
static NTSTATUS scard_establish_context( void *args ) { @@ -89,6 +90,13 @@ static NTSTATUS scard_connect( void *args ) params->connect_handle, params->protocol ); }
+static NTSTATUS scard_status( void *args ) +{ + struct scard_status_params *params = args; + return SCardStatus( params->handle, params->names, params->names_len, params->state, params->protocol, + params->atr, params->atr_len ); +} + const unixlib_entry_t __wine_unix_call_funcs[] = { scard_establish_context, @@ -99,4 +107,5 @@ const unixlib_entry_t __wine_unix_call_funcs[] = scard_list_readers, scard_list_reader_groups, scard_connect, + scard_status, }; diff --git a/dlls/winscard/unixlib.h b/dlls/winscard/unixlib.h index d750c23f07b..dd069efab58 100644 --- a/dlls/winscard/unixlib.h +++ b/dlls/winscard/unixlib.h @@ -84,6 +84,17 @@ struct scard_connect_params UINT64 *protocol; };
+struct scard_status_params +{ + UINT64 handle; + char *names; + UINT64 *names_len; + UINT64 *state; + UINT64 *protocol; + BYTE *atr; + UINT64 *atr_len; +}; + enum winscard_funcs { unix_scard_establish_context, @@ -94,4 +105,5 @@ enum winscard_funcs unix_scard_list_readers, unix_scard_list_reader_groups, unix_scard_connect, + unix_scard_status, }; diff --git a/dlls/winscard/winscard.c b/dlls/winscard/winscard.c index aff6012cb83..6cded4387f6 100644 --- a/dlls/winscard/winscard.c +++ b/dlls/winscard/winscard.c @@ -231,11 +231,48 @@ static LONG copy_multiszA( const char *src, char *dst, DWORD *dst_len ) return SCARD_S_SUCCESS; }
-LONG WINAPI SCardStatusA(SCARDHANDLE context, LPSTR szReaderName, LPDWORD pcchReaderLen, LPDWORD pdwState, LPDWORD pdwProtocol, LPBYTE pbAtr, LPDWORD pcbAtrLen) +LONG WINAPI SCardStatusA( SCARDHANDLE connect, char *names, DWORD *names_len, DWORD *state, DWORD *protocol, + BYTE *atr, DWORD *atr_len ) { - FIXME("(%Ix) stub\n", context); - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return SCARD_F_INTERNAL_ERROR; + struct handle *handle = (struct handle *)connect; + struct scard_status_params params; + UINT64 state64, protocol64, atr_len64, names_len_utf8 = 0; + LONG ret; + + TRACE( "%Ix, %p, %p, %p, %p, %p, %p\n", connect, names, names_len, state, protocol, atr, atr_len ); + + if (!handle || handle->magic != CONNECT_MAGIC) return ERROR_INVALID_HANDLE; + if ((names_len && *names_len == SCARD_AUTOALLOCATE) || (atr_len && *atr_len == SCARD_AUTOALLOCATE)) + { + FIXME( "SCARD_AUTOALLOCATE not supported\n" ); + return SCARD_F_INTERNAL_ERROR; + } + + params.handle = handle->unix_handle; + params.names = NULL; + params.names_len = &names_len_utf8; + params.state = &state64; + params.protocol = &protocol64; + params.atr = NULL; + if (!atr_len) params.atr_len = NULL; + else + { + atr_len64 = *atr_len; + params.atr_len = &atr_len64; + } + if ((ret = UNIX_CALL( scard_status, ¶ms ))) return ret; + + if (!(params.names = malloc( names_len_utf8 ))) return SCARD_E_NO_MEMORY; + if (!(ret = UNIX_CALL( scard_status, ¶ms )) && !(ret = copy_multiszA( params.names, names, names_len ))) + { + if (state) *state = state64; + if (protocol) *protocol = protocol64; + if (atr_len) *atr_len = atr_len64; + } + + free( params.names ); + TRACE( "returning %#lx\n", ret ); + return ret; }
static LONG copy_multiszW( const char *src, WCHAR *dst, DWORD *dst_len ) @@ -259,11 +296,48 @@ static LONG copy_multiszW( const char *src, WCHAR *dst, DWORD *dst_len ) return SCARD_S_SUCCESS; }
-LONG WINAPI SCardStatusW(SCARDHANDLE context, LPWSTR szReaderName, LPDWORD pcchReaderLen, LPDWORD pdwState,LPDWORD pdwProtocol,LPBYTE pbAtr,LPDWORD pcbArtLen) +LONG WINAPI SCardStatusW( SCARDHANDLE connect, WCHAR *names, DWORD *names_len, DWORD *state, DWORD *protocol, + BYTE *atr, DWORD *atr_len ) { - FIXME("(%Ix) stub\n", context); - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return SCARD_F_INTERNAL_ERROR; + struct handle *handle = (struct handle *)connect; + struct scard_status_params params; + UINT64 state64, protocol64, atr_len64, names_len_utf8 = 0; + LONG ret; + + TRACE( "%Ix, %p, %p, %p, %p, %p, %p\n", connect, names, names_len, state, protocol, atr, atr_len ); + + if (!handle || handle->magic != CONNECT_MAGIC) return ERROR_INVALID_HANDLE; + if ((names_len && *names_len == SCARD_AUTOALLOCATE) || (atr_len && *atr_len == SCARD_AUTOALLOCATE)) + { + FIXME( "SCARD_AUTOALLOCATE not supported\n" ); + return SCARD_F_INTERNAL_ERROR; + } + + params.handle = handle->unix_handle; + params.names = NULL; + params.names_len = &names_len_utf8; + params.state = &state64; + params.protocol = &protocol64; + params.atr = atr; + if (!atr_len) params.atr_len = NULL; + else + { + atr_len64 = *atr_len; + params.atr_len = &atr_len64; + } + if ((ret = UNIX_CALL( scard_status, ¶ms ))) return ret; + + if (!(params.names = malloc( names_len_utf8 ))) return SCARD_E_NO_MEMORY; + if (!(ret = UNIX_CALL( scard_status, ¶ms )) && !(ret = copy_multiszW( params.names, names, names_len ))) + { + if (state) *state = state64; + if (protocol) *protocol = protocol64; + if (atr_len) *atr_len = atr_len64; + } + + free( params.names ); + TRACE( "returning %#lx\n", ret ); + return ret; }
void WINAPI SCardReleaseStartedEvent(void)