Module: wine Branch: master Commit: abb7f7500235db362376634256490fbdd391cd00 URL: https://gitlab.winehq.org/wine/wine/-/commit/abb7f7500235db362376634256490fb...
Author: Hans Leidekker hans@codeweavers.com Date: Thu Feb 16 12:13:48 2023 +0100
winscard: Implement SCardListReaderGroupsA/W().
---
dlls/winscard/unixlib.c | 8 ++++++ dlls/winscard/unixlib.h | 8 ++++++ dlls/winscard/winscard.c | 69 +++++++++++++++++++++++++++++++++++++++++++++ dlls/winscard/winscard.spec | 4 +-- 4 files changed, 87 insertions(+), 2 deletions(-)
diff --git a/dlls/winscard/unixlib.c b/dlls/winscard/unixlib.c index 61f179b2eb9..aa223382514 100644 --- a/dlls/winscard/unixlib.c +++ b/dlls/winscard/unixlib.c @@ -37,6 +37,7 @@ LONG SCardIsValidContext( UINT64 ); LONG SCardGetStatusChange( UINT64, UINT64, struct reader_state *, UINT64 ); LONG SCardCancel( UINT64 ); LONG SCardListReaders( UINT64, const char *, char *, UINT64 * ); +LONG SCardListReaderGroups( UINT64, char *, UINT64 * );
static NTSTATUS scard_establish_context( void *args ) { @@ -74,6 +75,12 @@ static NTSTATUS scard_list_readers( void *args ) return SCardListReaders( params->handle, params->groups, params->readers, params->readers_len ); }
+static NTSTATUS scard_list_reader_groups( void *args ) +{ + struct scard_list_reader_groups_params *params = args; + return SCardListReaderGroups( params->handle, params->groups, params->groups_len ); +} + const unixlib_entry_t __wine_unix_call_funcs[] = { scard_establish_context, @@ -82,4 +89,5 @@ const unixlib_entry_t __wine_unix_call_funcs[] = scard_get_status_change, scard_cancel, scard_list_readers, + scard_list_reader_groups, }; diff --git a/dlls/winscard/unixlib.h b/dlls/winscard/unixlib.h index 1be9fe7cf77..05514d3f68b 100644 --- a/dlls/winscard/unixlib.h +++ b/dlls/winscard/unixlib.h @@ -67,6 +67,13 @@ struct scard_list_readers_params UINT64 *readers_len; };
+struct scard_list_reader_groups_params +{ + UINT64 handle; + char *groups; + UINT64 *groups_len; +}; + enum winscard_funcs { unix_scard_establish_context, @@ -75,4 +82,5 @@ enum winscard_funcs unix_scard_get_status_change, unix_scard_cancel, unix_scard_list_readers, + unix_scard_list_reader_groups, }; diff --git a/dlls/winscard/winscard.c b/dlls/winscard/winscard.c index a242de9ccce..92c621baed0 100644 --- a/dlls/winscard/winscard.c +++ b/dlls/winscard/winscard.c @@ -369,6 +369,75 @@ LONG WINAPI SCardCancel( SCARDCONTEXT context ) return ret; }
+LONG WINAPI SCardListReaderGroupsA( SCARDCONTEXT context, char *groups, DWORD *groups_len ) +{ + struct handle *handle = (struct handle *)context; + struct scard_list_reader_groups_params params; + UINT64 groups_len_utf8; + LONG ret; + + TRACE( "%Ix, %p, %p\n", context, groups, groups_len ); + + if (!handle || handle->magic != CONTEXT_MAGIC) return ERROR_INVALID_HANDLE; + if (!groups_len) return SCARD_E_INVALID_PARAMETER; + if (*groups_len == SCARD_AUTOALLOCATE) + { + FIXME( "SCARD_AUTOALLOCATE not supported\n" ); + return SCARD_F_INTERNAL_ERROR; + } + + params.handle = handle->unix_handle; + params.groups = NULL; + params.groups_len = &groups_len_utf8; + if ((ret = UNIX_CALL( scard_list_reader_groups, ¶ms ))) goto done; + + params.handle = handle->unix_handle; + if (!(params.groups = malloc( groups_len_utf8 ))) return SCARD_E_NO_MEMORY; + if (!(ret = UNIX_CALL( scard_list_reader_groups, ¶ms ))) + { + ret = copy_multiszA( params.groups, groups, groups_len ); + } + +done: + free( params.groups ); + TRACE( "returning %#lx\n", ret ); + return ret; +} + +LONG WINAPI SCardListReaderGroupsW( SCARDCONTEXT context, WCHAR *groups, DWORD *groups_len ) +{ + struct handle *handle = (struct handle *)context; + struct scard_list_reader_groups_params params; + UINT64 groups_len_utf8; + LONG ret; + + TRACE( "%Ix, %p, %p\n", context, groups, groups_len ); + + if (!handle || handle->magic != CONTEXT_MAGIC) return ERROR_INVALID_HANDLE; + if (!groups_len) return SCARD_E_INVALID_PARAMETER; + if (*groups_len == SCARD_AUTOALLOCATE) + { + FIXME( "SCARD_AUTOALLOCATE not supported\n" ); + return SCARD_F_INTERNAL_ERROR; + } + + params.handle = handle->unix_handle; + params.groups = NULL; + params.groups_len = &groups_len_utf8; + if ((ret = UNIX_CALL( scard_list_reader_groups, ¶ms ))) goto done; + + if (!(params.groups = malloc( groups_len_utf8 ))) return SCARD_E_NO_MEMORY; + if (!(ret = UNIX_CALL( scard_list_reader_groups, ¶ms ))) + { + ret = copy_multiszW( params.groups, groups, groups_len ); + } + +done: + TRACE( "returning %#lx\n", ret ); + free( params.groups ); + return ret; +} + static LONG map_states_inA( const SCARD_READERSTATEA *src, struct reader_state *dst, DWORD count ) { DWORD i; diff --git a/dlls/winscard/winscard.spec b/dlls/winscard/winscard.spec index ff320bae424..6eb70ffa325 100644 --- a/dlls/winscard/winscard.spec +++ b/dlls/winscard/winscard.spec @@ -38,8 +38,8 @@ @ stub SCardListCardsW @ stub SCardListInterfacesA @ stub SCardListInterfacesW -@ stub SCardListReaderGroupsA -@ stub SCardListReaderGroupsW +@ stdcall SCardListReaderGroupsA(long ptr ptr) +@ stdcall SCardListReaderGroupsW(long ptr ptr) @ stdcall SCardListReadersA(long str ptr ptr) @ stdcall SCardListReadersW(long wstr ptr ptr) @ stub SCardLocateCardsA