Module: wine Branch: master Commit: 094161f33f6bc8d6fcb33f4c67da9cc822f01973 URL: https://gitlab.winehq.org/wine/wine/-/commit/094161f33f6bc8d6fcb33f4c67da9cc...
Author: Hans Leidekker hans@codeweavers.com Date: Thu Feb 16 12:54:22 2023 +0100
winscard: Implement SCardBegin/EndTransaction().
---
dlls/winscard/unixlib.c | 16 ++++++++++++++++ dlls/winscard/unixlib.h | 13 +++++++++++++ dlls/winscard/winscard.c | 33 +++++++++++++++++++++++++++++++++ dlls/winscard/winscard.spec | 4 ++-- 4 files changed, 64 insertions(+), 2 deletions(-)
diff --git a/dlls/winscard/unixlib.c b/dlls/winscard/unixlib.c index c9afe13d796..e1cdf673c92 100644 --- a/dlls/winscard/unixlib.c +++ b/dlls/winscard/unixlib.c @@ -42,6 +42,8 @@ LONG SCardConnect( UINT64, const char *, UINT64, UINT64, UINT64 *, UINT64 * ); LONG SCardStatus( UINT64, char *, UINT64 *, UINT64 *, UINT64 *, BYTE *, UINT64 * ); LONG SCardDisconnect( UINT64, UINT64 ); LONG SCardReconnect( UINT64, UINT64, UINT64, UINT64, UINT64 * ); +LONG SCardBeginTransaction( UINT64 ); +LONG SCardEndTransaction( UINT64, UINT64 );
static NTSTATUS scard_establish_context( void *args ) { @@ -112,6 +114,18 @@ static NTSTATUS scard_disconnect( void *args ) return SCardDisconnect( params->handle, params->disposition ); }
+static NTSTATUS scard_begin_transaction( void *args ) +{ + struct scard_begin_transaction_params *params = args; + return SCardBeginTransaction( params->handle ); +} + +static NTSTATUS scard_end_transaction( void *args ) +{ + struct scard_end_transaction_params *params = args; + return SCardEndTransaction( params->handle, params->disposition ); +} + const unixlib_entry_t __wine_unix_call_funcs[] = { scard_establish_context, @@ -125,4 +139,6 @@ const unixlib_entry_t __wine_unix_call_funcs[] = scard_status, scard_reconnect, scard_disconnect, + scard_begin_transaction, + scard_end_transaction, }; diff --git a/dlls/winscard/unixlib.h b/dlls/winscard/unixlib.h index 2c7007a1f12..6c7576220f9 100644 --- a/dlls/winscard/unixlib.h +++ b/dlls/winscard/unixlib.h @@ -110,6 +110,17 @@ struct scard_disconnect_params UINT64 disposition; };
+struct scard_begin_transaction_params +{ + UINT64 handle; +}; + +struct scard_end_transaction_params +{ + UINT64 handle; + UINT64 disposition; +}; + enum winscard_funcs { unix_scard_establish_context, @@ -123,4 +134,6 @@ enum winscard_funcs unix_scard_status, unix_scard_reconnect, unix_scard_disconnect, + unix_scard_begin_transaction, + unix_scard_end_transaction, }; diff --git a/dlls/winscard/winscard.c b/dlls/winscard/winscard.c index d6bf81ecbc0..a5b9cc75af5 100644 --- a/dlls/winscard/winscard.c +++ b/dlls/winscard/winscard.c @@ -753,6 +753,39 @@ LONG WINAPI SCardDisconnect( SCARDHANDLE connect, DWORD disposition ) return ret; }
+LONG WINAPI SCardBeginTransaction( SCARDHANDLE connect ) +{ + struct handle *handle = (struct handle *)connect; + struct scard_begin_transaction_params params; + LONG ret; + + TRACE( "%Ix\n", connect ); + + if (!handle || handle->magic != CONNECT_MAGIC) return ERROR_INVALID_HANDLE; + + params.handle = handle->unix_handle; + ret = UNIX_CALL( scard_begin_transaction, ¶ms ); + TRACE( "returning %#lx\n", ret ); + return ret; +} + +LONG WINAPI SCardEndTransaction( SCARDHANDLE connect, DWORD disposition ) +{ + struct handle *handle = (struct handle *)connect; + struct scard_end_transaction_params params; + LONG ret; + + TRACE( "%Ix, %#lx\n", connect, disposition ); + + if (!handle || handle->magic != CONNECT_MAGIC) return ERROR_INVALID_HANDLE; + + params.handle = handle->unix_handle; + params.disposition = disposition; + ret = UNIX_CALL( scard_end_transaction, ¶ms ); + TRACE( "returning %#lx\n", ret ); + return ret; +} + BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, void *reserved ) { switch (reason) diff --git a/dlls/winscard/winscard.spec b/dlls/winscard/winscard.spec index c9f903ed483..828df2416c9 100644 --- a/dlls/winscard/winscard.spec +++ b/dlls/winscard/winscard.spec @@ -5,13 +5,13 @@ @ stdcall SCardAccessStartedEvent() @ stdcall SCardAddReaderToGroupA(long str str) @ stdcall SCardAddReaderToGroupW(long wstr wstr) -@ stub SCardBeginTransaction +@ stdcall SCardBeginTransaction(long) @ stdcall SCardCancel(long) @ stdcall SCardConnectA(long str long long ptr ptr) @ stdcall SCardConnectW(long wstr long long ptr ptr) @ stub SCardControl @ stdcall SCardDisconnect(long long) -@ stub SCardEndTransaction +@ stdcall SCardEndTransaction(long long) @ stdcall SCardEstablishContext(long ptr ptr ptr) @ stub SCardForgetCardTypeA @ stub SCardForgetCardTypeW