From f85bbd79d4f2769d30afbafcc9c3dff4663d94d9 Mon Sep 17 00:00:00 2001 From: akallabeth Date: Sat, 6 Feb 2021 15:08:57 +0100 Subject: [PATCH] Unified smartcard handle converstion (cherry picked from commit 69d33da061ff15d2c016de1569b54ca68a578f05) --- channels/smartcard/client/smartcard_operations.c | 257 +++++++---------------- channels/smartcard/client/smartcard_operations.h | 19 +- channels/smartcard/client/smartcard_pack.c | 3 + winpr/libwinpr/smartcard/smartcard_pcsc.c | 13 +- 4 files changed, 108 insertions(+), 184 deletions(-) diff --git a/channels/smartcard/client/smartcard_operations.c b/channels/smartcard/client/smartcard_operations.c index ee813f7..8279bea 100644 --- a/channels/smartcard/client/smartcard_operations.c +++ b/channels/smartcard/client/smartcard_operations.c @@ -40,6 +40,19 @@ #include "smartcard_operations.h" #include "smartcard_main.h" +static LONG smartcard_call_to_operation_handle(SMARTCARD_DEVICE* smartcard, + SMARTCARD_OPERATION* operation) +{ + if (!smartcard || !operation) + return SCARD_E_INVALID_HANDLE; + operation->hContext = + smartcard_scard_context_native_from_redir(smartcard, &(operation->call.handles.hContext)); + operation->hCard = + smartcard_scard_handle_native_from_redir(smartcard, &(operation->call.handles.hCard)); + + return SCARD_S_SUCCESS; +} + static LONG log_status_error(const char* tag, const char* what, LONG status) { if (status != SCARD_S_SUCCESS) @@ -219,19 +232,18 @@ static LONG smartcard_EstablishContext_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { LONG status; - EstablishContext_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = smartcard_unpack_establish_context_call(smartcard, irp->input, &call); + status = smartcard_unpack_establish_context_call(smartcard, irp->input, + &operation->call.establishContext); if (status != SCARD_S_SUCCESS) { return log_status_error(TAG, "smartcard_unpack_establish_context_call", status); } - operation->call.establishContext = call; return SCARD_S_SUCCESS; } @@ -285,19 +297,17 @@ static LONG smartcard_ReleaseContext_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { LONG status; - Context_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = smartcard_unpack_context_call(smartcard, irp->input, &call, "ReleaseContext"); + status = smartcard_unpack_context_call(smartcard, irp->input, &operation->call.context, + "ReleaseContext"); if (status != SCARD_S_SUCCESS) log_status_error(TAG, "smartcard_unpack_context_call", status); - operation->hContext = smartcard_scard_context_native_from_redir(smartcard, &(call.hContext)); - operation->call.context = call; return status; } @@ -327,17 +337,15 @@ static LONG smartcard_IsValidContext_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { LONG status; - Context_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = smartcard_unpack_context_call(smartcard, irp->input, &call, "IsValidContext"); + status = smartcard_unpack_context_call(smartcard, irp->input, &operation->call.context, + "IsValidContext"); - operation->hContext = smartcard_scard_context_native_from_redir(smartcard, &(call.hContext)); - operation->call.context = call; return status; } @@ -355,17 +363,14 @@ static LONG smartcard_ListReaderGroupsA_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { LONG status; - ListReaderGroups_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = smartcard_unpack_list_reader_groups_call(smartcard, irp->input, &call, FALSE); + status = smartcard_unpack_list_reader_groups_call(smartcard, irp->input, + &operation->call.listReaderGroups, FALSE); - operation->hContext = smartcard_scard_context_native_from_redir(smartcard, &(call.hContext)); - operation->call.listReaderGroups = call; - operation->call.listReaderGroups = call; return status; } @@ -401,16 +406,14 @@ static LONG smartcard_ListReaderGroupsW_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { LONG status; - ListReaderGroups_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = smartcard_unpack_list_reader_groups_call(smartcard, irp->input, &call, TRUE); + status = smartcard_unpack_list_reader_groups_call(smartcard, irp->input, + &operation->call.listReaderGroups, TRUE); - operation->hContext = smartcard_scard_context_native_from_redir(smartcard, &(call.hContext)); - operation->call.listReaderGroups = call; return status; } @@ -535,16 +538,14 @@ static LONG smartcard_ListReadersA_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { LONG status; - ListReaders_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = smartcard_unpack_list_readers_call(smartcard, irp->input, &call, FALSE); + status = smartcard_unpack_list_readers_call(smartcard, irp->input, &operation->call.listReaders, + FALSE); - operation->hContext = smartcard_scard_context_native_from_redir(smartcard, &(call.hContext)); - operation->call.listReaders = call; return status; } @@ -594,16 +595,14 @@ static LONG smartcard_ListReadersW_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { LONG status; - ListReaders_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = smartcard_unpack_list_readers_call(smartcard, irp->input, &call, TRUE); + status = smartcard_unpack_list_readers_call(smartcard, irp->input, &operation->call.listReaders, + TRUE); - operation->hContext = smartcard_scard_context_native_from_redir(smartcard, &(call.hContext)); - operation->call.listReaders = call; return status; } @@ -611,16 +610,14 @@ static LONG smartcard_context_and_two_strings_a_Decode(SMARTCARD_DEVICE* smartca SMARTCARD_OPERATION* operation) { LONG status; - ContextAndTwoStringA_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = smartcard_unpack_context_and_two_strings_a_call(smartcard, irp->input, &call); + status = smartcard_unpack_context_and_two_strings_a_call(smartcard, irp->input, + &operation->call.contextAndTwoStringA); - operation->hContext = smartcard_scard_context_native_from_redir(smartcard, &(call.hContext)); - operation->call.contextAndTwoStringA = call; return status; } @@ -628,16 +625,14 @@ static LONG smartcard_context_and_two_strings_w_Decode(SMARTCARD_DEVICE* smartca SMARTCARD_OPERATION* operation) { LONG status; - ContextAndTwoStringW_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = smartcard_unpack_context_and_two_strings_w_call(smartcard, irp->input, &call); + status = smartcard_unpack_context_and_two_strings_w_call(smartcard, irp->input, + &operation->call.contextAndTwoStringW); - operation->hContext = smartcard_scard_context_native_from_redir(smartcard, &(call.hContext)); - operation->call.contextAndTwoStringW = call; return status; } @@ -645,16 +640,14 @@ static LONG smartcard_context_and_string_a_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { LONG status; - ContextAndStringA_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = smartcard_unpack_context_and_string_a_call(smartcard, irp->input, &call); + status = smartcard_unpack_context_and_string_a_call(smartcard, irp->input, + &operation->call.contextAndStringA); - operation->hContext = smartcard_scard_context_native_from_redir(smartcard, &(call.hContext)); - operation->call.contextAndStringA = call; return status; } @@ -662,16 +655,14 @@ static LONG smartcard_context_and_string_w_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { LONG status; - ContextAndStringW_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = smartcard_unpack_context_and_string_w_call(smartcard, irp->input, &call); + status = smartcard_unpack_context_and_string_w_call(smartcard, irp->input, + &operation->call.contextAndStringW); - operation->hContext = smartcard_scard_context_native_from_redir(smartcard, &(call.hContext)); - operation->call.contextAndStringW = call; return status; } @@ -679,16 +670,14 @@ static LONG smartcard_LocateCardsA_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { LONG status; - LocateCardsA_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = smartcard_unpack_locate_cards_a_call(smartcard, irp->input, &call); + status = + smartcard_unpack_locate_cards_a_call(smartcard, irp->input, &operation->call.locateCardsA); - operation->hContext = smartcard_scard_context_native_from_redir(smartcard, &(call.hContext)); - operation->call.locateCardsA = call; return status; } @@ -696,16 +685,14 @@ static LONG smartcard_LocateCardsW_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { LONG status; - LocateCardsW_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = smartcard_unpack_locate_cards_w_call(smartcard, irp->input, &call); + status = + smartcard_unpack_locate_cards_w_call(smartcard, irp->input, &operation->call.locateCardsW); - operation->hContext = smartcard_scard_context_native_from_redir(smartcard, &(call.hContext)); - operation->call.locateCardsW = call; return status; } @@ -1215,16 +1202,14 @@ static LONG smartcard_GetStatusChangeA_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { LONG status; - GetStatusChangeA_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = smartcard_unpack_get_status_change_a_call(smartcard, irp->input, &call); + status = smartcard_unpack_get_status_change_a_call(smartcard, irp->input, + &operation->call.getStatusChangeA); - operation->hContext = smartcard_scard_context_native_from_redir(smartcard, &(call.hContext)); - operation->call.getStatusChangeA = call; return status; } @@ -1280,16 +1265,14 @@ static LONG smartcard_GetStatusChangeW_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { LONG status; - GetStatusChangeW_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = smartcard_unpack_get_status_change_w_call(smartcard, irp->input, &call); + status = smartcard_unpack_get_status_change_w_call(smartcard, irp->input, + &operation->call.getStatusChangeW); - operation->hContext = smartcard_scard_context_native_from_redir(smartcard, &(call.hContext)); - operation->call.getStatusChangeW = call; return status; } @@ -1344,16 +1327,14 @@ static LONG smartcard_GetStatusChangeW_Call(SMARTCARD_DEVICE* smartcard, static LONG smartcard_Cancel_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { LONG status; - Context_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = smartcard_unpack_context_call(smartcard, irp->input, &call, "Cancel"); + status = + smartcard_unpack_context_call(smartcard, irp->input, &operation->call.context, "Cancel"); - operation->hContext = smartcard_scard_context_native_from_redir(smartcard, &(call.hContext)); - operation->call.context = call; return status; } @@ -1370,17 +1351,13 @@ static LONG smartcard_Cancel_Call(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATI static LONG smartcard_ConnectA_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { LONG status; - ConnectA_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = smartcard_unpack_connect_a_call(smartcard, irp->input, &call); + status = smartcard_unpack_connect_a_call(smartcard, irp->input, &operation->call.connectA); - operation->hContext = - smartcard_scard_context_native_from_redir(smartcard, &(call.Common.hContext)); - operation->call.connectA = call; return status; } @@ -1417,17 +1394,13 @@ out_fail: static LONG smartcard_ConnectW_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { LONG status; - ConnectW_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = smartcard_unpack_connect_w_call(smartcard, irp->input, &call); + status = smartcard_unpack_connect_w_call(smartcard, irp->input, &operation->call.connectW); - operation->hContext = - smartcard_scard_context_native_from_redir(smartcard, &(call.Common.hContext)); - operation->call.connectW = call; return status; } @@ -1464,17 +1437,13 @@ out_fail: static LONG smartcard_Reconnect_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { LONG status; - Reconnect_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = smartcard_unpack_reconnect_call(smartcard, irp->input, &call); + status = smartcard_unpack_reconnect_call(smartcard, irp->input, &operation->call.reconnect); - operation->hContext = smartcard_scard_context_native_from_redir(smartcard, &(call.hContext)); - operation->hCard = smartcard_scard_handle_native_from_redir(smartcard, &(call.hCard)); - operation->call.reconnect = call; return status; } @@ -1497,18 +1466,14 @@ static LONG smartcard_Reconnect_Call(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPER static LONG smartcard_Disconnect_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { LONG status; - HCardAndDisposition_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = - smartcard_unpack_hcard_and_disposition_call(smartcard, irp->input, &call, "Disconnect"); + status = smartcard_unpack_hcard_and_disposition_call( + smartcard, irp->input, &operation->call.hCardAndDisposition, "Disconnect"); - operation->hContext = smartcard_scard_context_native_from_redir(smartcard, &(call.hContext)); - operation->hCard = smartcard_scard_handle_native_from_redir(smartcard, &(call.hCard)); - operation->call.hCardAndDisposition = call; return status; } @@ -1528,18 +1493,14 @@ static LONG smartcard_BeginTransaction_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { LONG status; - HCardAndDisposition_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = smartcard_unpack_hcard_and_disposition_call(smartcard, irp->input, &call, - "BeginTransaction"); + status = smartcard_unpack_hcard_and_disposition_call( + smartcard, irp->input, &operation->call.hCardAndDisposition, "BeginTransaction"); - operation->hContext = smartcard_scard_context_native_from_redir(smartcard, &(call.hContext)); - operation->hCard = smartcard_scard_handle_native_from_redir(smartcard, &(call.hCard)); - operation->call.hCardAndDisposition = call; return status; } @@ -1558,18 +1519,14 @@ static LONG smartcard_EndTransaction_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { LONG status; - HCardAndDisposition_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = - smartcard_unpack_hcard_and_disposition_call(smartcard, irp->input, &call, "EndTransaction"); + status = smartcard_unpack_hcard_and_disposition_call( + smartcard, irp->input, &operation->call.hCardAndDisposition, "EndTransaction"); - operation->hContext = smartcard_scard_context_native_from_redir(smartcard, &(call.hContext)); - operation->hCard = smartcard_scard_handle_native_from_redir(smartcard, &(call.hCard)); - operation->call.hCardAndDisposition = call; return status; } @@ -1588,17 +1545,13 @@ static LONG smartcard_EndTransaction_Call(SMARTCARD_DEVICE* smartcard, static LONG smartcard_State_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { LONG status; - State_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = smartcard_unpack_state_call(smartcard, irp->input, &call); + status = smartcard_unpack_state_call(smartcard, irp->input, &operation->call.state); - operation->hContext = smartcard_scard_context_native_from_redir(smartcard, &(call.hContext)); - operation->hCard = smartcard_scard_handle_native_from_redir(smartcard, &(call.hCard)); - operation->call.state = call; return status; } @@ -1622,17 +1575,13 @@ static LONG smartcard_State_Call(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATIO static LONG smartcard_StatusA_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { LONG status; - Status_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = smartcard_unpack_status_call(smartcard, irp->input, &call, FALSE); + status = smartcard_unpack_status_call(smartcard, irp->input, &operation->call.status, FALSE); - operation->hContext = smartcard_scard_context_native_from_redir(smartcard, &(call.hContext)); - operation->hCard = smartcard_scard_handle_native_from_redir(smartcard, &(call.hCard)); - operation->call.status = call; return status; } @@ -1684,17 +1633,13 @@ static LONG smartcard_StatusA_Call(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERAT static LONG smartcard_StatusW_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { LONG status; - Status_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = smartcard_unpack_status_call(smartcard, irp->input, &call, TRUE); + status = smartcard_unpack_status_call(smartcard, irp->input, &operation->call.status, TRUE); - operation->hContext = smartcard_scard_context_native_from_redir(smartcard, &(call.hContext)); - operation->hCard = smartcard_scard_handle_native_from_redir(smartcard, &(call.hCard)); - operation->call.status = call; return status; } @@ -1746,17 +1691,13 @@ static LONG smartcard_StatusW_Call(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERAT static LONG smartcard_Transmit_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { LONG status; - Transmit_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = smartcard_unpack_transmit_call(smartcard, irp->input, &call); + status = smartcard_unpack_transmit_call(smartcard, irp->input, &operation->call.transmit); - operation->hContext = smartcard_scard_context_native_from_redir(smartcard, &(call.hContext)); - operation->hCard = smartcard_scard_handle_native_from_redir(smartcard, &(call.hCard)); - operation->call.transmit = call; return status; } @@ -1802,17 +1743,13 @@ static LONG smartcard_Transmit_Call(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERA static LONG smartcard_Control_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { LONG status; - Control_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = smartcard_unpack_control_call(smartcard, irp->input, &call); + status = smartcard_unpack_control_call(smartcard, irp->input, &operation->call.control); - operation->hContext = smartcard_scard_context_native_from_redir(smartcard, &(call.hContext)); - operation->hCard = smartcard_scard_handle_native_from_redir(smartcard, &(call.hCard)); - operation->call.control = call; return status; } @@ -1844,34 +1781,26 @@ static LONG smartcard_Control_Call(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERAT static LONG smartcard_GetAttrib_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { LONG status; - GetAttrib_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = smartcard_unpack_get_attrib_call(smartcard, irp->input, &call); + status = smartcard_unpack_get_attrib_call(smartcard, irp->input, &operation->call.getAttrib); - operation->hContext = smartcard_scard_context_native_from_redir(smartcard, &(call.hContext)); - operation->hCard = smartcard_scard_handle_native_from_redir(smartcard, &(call.hCard)); - operation->call.getAttrib = call; return status; } static LONG smartcard_SetAttrib_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { LONG status; - SetAttrib_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = smartcard_unpack_set_attrib_call(smartcard, irp->input, &call); + status = smartcard_unpack_set_attrib_call(smartcard, irp->input, &operation->call.setAttrib); - operation->hContext = smartcard_scard_context_native_from_redir(smartcard, &(call.hContext)); - operation->hCard = smartcard_scard_handle_native_from_redir(smartcard, &(call.hCard)); - operation->call.setAttrib = call; return status; } @@ -1930,7 +1859,6 @@ static LONG smartcard_SetAttrib_Call(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPER static LONG smartcard_AccessStartedEvent_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { - Long_Call call = { 0 }; IRP* irp; WINPR_UNUSED(smartcard); irp = operation->irp; @@ -1945,8 +1873,8 @@ static LONG smartcard_AccessStartedEvent_Decode(SMARTCARD_DEVICE* smartcard, return SCARD_F_INTERNAL_ERROR; } - Stream_Read_INT32(irp->input, call.LongValue); /* Unused (4 bytes) */ - operation->call.lng = call; + Stream_Read_INT32(irp->input, operation->call.lng.LongValue); /* Unused (4 bytes) */ + return SCARD_S_SUCCESS; } @@ -1969,16 +1897,14 @@ static LONG smartcard_LocateCardsByATRA_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { LONG status; - LocateCardsByATRA_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = smartcard_unpack_locate_cards_by_atr_a_call(smartcard, irp->input, &call); + status = smartcard_unpack_locate_cards_by_atr_a_call(smartcard, irp->input, + &operation->call.locateCardsByATRA); - operation->hContext = smartcard_scard_context_native_from_redir(smartcard, &(call.hContext)); - operation->call.locateCardsByATRA = call; return status; } @@ -1986,51 +1912,41 @@ static LONG smartcard_LocateCardsByATRW_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { LONG status; - LocateCardsByATRW_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = smartcard_unpack_locate_cards_by_atr_w_call(smartcard, irp->input, &call); + status = smartcard_unpack_locate_cards_by_atr_w_call(smartcard, irp->input, + &operation->call.locateCardsByATRW); - operation->hContext = smartcard_scard_context_native_from_redir(smartcard, &(call.hContext)); - operation->call.locateCardsByATRW = call; return status; } static LONG smartcard_ReadCacheA_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { LONG status; - ReadCacheA_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = smartcard_unpack_read_cache_a_call(smartcard, irp->input, &call); + status = smartcard_unpack_read_cache_a_call(smartcard, irp->input, &operation->call.readCacheA); - operation->hContext = - smartcard_scard_context_native_from_redir(smartcard, &(call.Common.hContext)); - operation->call.readCacheA = call; return status; } static LONG smartcard_ReadCacheW_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { LONG status; - ReadCacheW_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = smartcard_unpack_read_cache_w_call(smartcard, irp->input, &call); + status = smartcard_unpack_read_cache_w_call(smartcard, irp->input, &operation->call.readCacheW); - operation->hContext = - smartcard_scard_context_native_from_redir(smartcard, &(call.Common.hContext)); - operation->call.readCacheW = call; return status; } @@ -2038,17 +1954,14 @@ static LONG smartcard_WriteCacheA_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { LONG status; - WriteCacheA_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = smartcard_unpack_write_cache_a_call(smartcard, irp->input, &call); + status = + smartcard_unpack_write_cache_a_call(smartcard, irp->input, &operation->call.writeCacheA); - operation->hContext = - smartcard_scard_context_native_from_redir(smartcard, &(call.Common.hContext)); - operation->call.writeCacheA = call; return status; } @@ -2056,17 +1969,14 @@ static LONG smartcard_WriteCacheW_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { LONG status; - WriteCacheW_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = smartcard_unpack_write_cache_w_call(smartcard, irp->input, &call); + status = + smartcard_unpack_write_cache_w_call(smartcard, irp->input, &operation->call.writeCacheW); - operation->hContext = - smartcard_scard_context_native_from_redir(smartcard, &(call.Common.hContext)); - operation->call.writeCacheW = call; return status; } @@ -2074,17 +1984,14 @@ static LONG smartcard_GetTransmitCount_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { LONG status; - GetTransmitCount_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = smartcard_unpack_get_transmit_count_call(smartcard, irp->input, &call); + status = smartcard_unpack_get_transmit_count_call(smartcard, irp->input, + &operation->call.getTransmitCount); - operation->hContext = smartcard_scard_context_native_from_redir(smartcard, &(call.hContext)); - operation->hCard = smartcard_scard_handle_native_from_redir(smartcard, &(call.hCard)); - operation->call.getTransmitCount = call; return status; } @@ -2102,17 +2009,15 @@ static LONG smartcard_GetReaderIcon_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { LONG status; - GetReaderIcon_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = smartcard_unpack_get_reader_icon_call(smartcard, irp->input, &call); + status = smartcard_unpack_get_reader_icon_call(smartcard, irp->input, + &operation->call.getReaderIcon); - operation->hContext = smartcard_scard_context_native_from_redir(smartcard, &(call.hContext)); - operation->call.getReaderIcon = call; return status; } @@ -2120,16 +2025,14 @@ static LONG smartcard_GetDeviceTypeId_Decode(SMARTCARD_DEVICE* smartcard, SMARTCARD_OPERATION* operation) { LONG status; - GetDeviceTypeId_Call call = { 0 }; IRP* irp; if (!operation || !operation->irp) return STATUS_NO_MEMORY; irp = operation->irp; - status = smartcard_unpack_get_device_type_id_call(smartcard, irp->input, &call); + status = smartcard_unpack_get_device_type_id_call(smartcard, irp->input, + &operation->call.getDeviceTypeId); - operation->hContext = smartcard_scard_context_native_from_redir(smartcard, &(call.hContext)); - operation->call.getDeviceTypeId = call; return status; } @@ -2484,6 +2387,8 @@ LONG smartcard_irp_device_control_decode(SMARTCARD_DEVICE* smartcard, break; } + smartcard_call_to_operation_handle(smartcard, operation); + if ((ioControlCode != SCARD_IOCTL_ACCESSSTARTEDEVENT) && (ioControlCode != SCARD_IOCTL_RELEASETARTEDEVENT)) { diff --git a/channels/smartcard/client/smartcard_operations.h b/channels/smartcard/client/smartcard_operations.h index 19f0fd1..1c30d84 100644 --- a/channels/smartcard/client/smartcard_operations.h +++ b/channels/smartcard/client/smartcard_operations.h @@ -285,14 +285,14 @@ typedef struct _Connect_Common typedef struct _ConnectA_Call { - /* [string] */ CHAR* szReader; Connect_Common Common; + /* [string] */ CHAR* szReader; } ConnectA_Call; typedef struct _ConnectW_Call { - /* [string] */ WCHAR* szReader; Connect_Common Common; + /* [string] */ WCHAR* szReader; } ConnectW_Call; typedef struct _Connect_Return @@ -455,14 +455,14 @@ typedef struct _ReadCache_Common typedef struct _ReadCacheA_Call { - /* [string] */ char* szLookupName; ReadCache_Common Common; + /* [string] */ char* szLookupName; } ReadCacheA_Call; typedef struct _ReadCacheW_Call { - /* [string] */ WCHAR* szLookupName; ReadCache_Common Common; + /* [string] */ WCHAR* szLookupName; } ReadCacheW_Call; typedef struct _ReadCache_Return @@ -483,16 +483,22 @@ typedef struct _WriteCache_Common typedef struct _WriteCacheA_Call { - /* [string] */ char* szLookupName; WriteCache_Common Common; + /* [string] */ char* szLookupName; } WriteCacheA_Call; typedef struct _WriteCacheW_Call { - /* [string] */ WCHAR* szLookupName; WriteCache_Common Common; + /* [string] */ WCHAR* szLookupName; } WriteCacheW_Call; +typedef struct _Handles_Call +{ + REDIR_SCARDCONTEXT hContext; + REDIR_SCARDHANDLE hCard; +} Handles_Call; + #pragma pack(pop) struct _SMARTCARD_OPERATION @@ -500,6 +506,7 @@ struct _SMARTCARD_OPERATION IRP* irp; union { + Handles_Call handles; Long_Call lng; Context_Call context; ContextAndStringA_Call contextAndStringA; diff --git a/channels/smartcard/client/smartcard_pack.c b/channels/smartcard/client/smartcard_pack.c index 16200bf..d387038 100644 --- a/channels/smartcard/client/smartcard_pack.c +++ b/channels/smartcard/client/smartcard_pack.c @@ -1706,6 +1706,9 @@ SCARDHANDLE smartcard_scard_handle_native_from_redir(SMARTCARD_DEVICE* smartcard SCARDHANDLE hCard = 0; WINPR_UNUSED(smartcard); + if (handle->cbHandle == 0) + return hCard; + if (handle->cbHandle != sizeof(ULONG_PTR)) { WLog_WARN(TAG, diff --git a/winpr/libwinpr/smartcard/smartcard_pcsc.c b/winpr/libwinpr/smartcard/smartcard_pcsc.c index 60c5051..abe2b08 100644 --- a/winpr/libwinpr/smartcard/smartcard_pcsc.c +++ b/winpr/libwinpr/smartcard/smartcard_pcsc.c @@ -2768,7 +2768,12 @@ static LONG WINAPI PCSC_SCardWriteCacheA(SCARDCONTEXT hContext, UUID* CardIdenti { PCSC_CACHE_ITEM* data; PCSC_SCARDCONTEXT* ctx = PCSC_GetCardContextData(hContext); - char* id = card_id_and_name_a(CardIdentifier, LookupName); + char* id; + + if (!ctx) + return SCARD_E_FILE_NOT_FOUND; + + id = card_id_and_name_a(CardIdentifier, LookupName); if (!id) return SCARD_E_NO_MEMORY; @@ -2802,7 +2807,11 @@ static LONG WINAPI PCSC_SCardWriteCacheW(SCARDCONTEXT hContext, UUID* CardIdenti { PCSC_CACHE_ITEM* data; PCSC_SCARDCONTEXT* ctx = PCSC_GetCardContextData(hContext); - char* id = card_id_and_name_w(CardIdentifier, LookupName); + char* id; + if (!ctx) + return SCARD_E_FILE_NOT_FOUND; + + id = card_id_and_name_w(CardIdentifier, LookupName); if (!id) return SCARD_E_NO_MEMORY; -- 2.7.4