24#include <freerdp/config.h>
27#include <winpr/print.h>
29#include <freerdp/channels/scard.h>
30#include <freerdp/utils/smartcard_pack.h>
31#include "smartcard_pack.h"
33#include <freerdp/log.h>
34#define SCARD_TAG FREERDP_TAG("scard.pack")
36static const DWORD g_LogLevel = WLOG_DEBUG;
38static wLog* scard_log(
void)
40 static wLog* log =
nullptr;
42 log = WLog_Get(SCARD_TAG);
46#define smartcard_unpack_redir_scard_context(log, s, context, index, ndr) \
47 smartcard_unpack_redir_scard_context_((log), (s), (context), (index), (ndr), __FILE__, \
49#define smartcard_unpack_redir_scard_handle(log, s, context, index) \
50 smartcard_unpack_redir_scard_handle_((log), (s), (context), (index), __FILE__, __func__, \
53WINPR_ATTR_NODISCARD
static LONG
55 UINT32* index, UINT32* ppbContextNdrPtr,
const char* file,
56 const char* function,
size_t line);
57WINPR_ATTR_NODISCARD
static LONG
60WINPR_ATTR_NODISCARD
static LONG
62 UINT32* index,
const char* file,
const char* function,
64WINPR_ATTR_NODISCARD
static LONG smartcard_pack_redir_scard_handle(wLog* log,
wStream* s,
67WINPR_ATTR_NODISCARD
static LONG
68smartcard_unpack_redir_scard_context_ref(wLog* log,
wStream* s, UINT32 pbContextNdrPtr,
70WINPR_ATTR_NODISCARD
static LONG
73WINPR_ATTR_NODISCARD
static LONG smartcard_unpack_redir_scard_handle_ref(wLog* log,
wStream* s,
75WINPR_ATTR_NODISCARD
static LONG
87#define smartcard_ndr_pointer_read(log, s, index, ptr) \
88 smartcard_ndr_pointer_read_((log), (s), (index), (ptr), __FILE__, __func__, __LINE__)
89static BOOL smartcard_ndr_pointer_read_(wLog* log,
wStream* s, UINT32* index, UINT32* ptr,
90 const char* file,
const char* fkt,
size_t line)
92 const UINT32 expect = 0x20000 + (*index) * 4;
97 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
100 Stream_Read_UINT32(s, ndrPtr);
103 if (expect != ndrPtr)
106 if (ptr && (ndrPtr == 0))
108 WLog_Print(log, WLOG_WARN,
109 "[%s:%" PRIuz
"] Read context pointer 0x%08" PRIx32
", expected 0x%08" PRIx32,
110 fkt, line, ndrPtr, expect);
114 (*index) = (*index) + 1;
118WINPR_ATTR_NODISCARD
static LONG smartcard_ndr_read_ex(wLog* log,
wStream* s, BYTE** data,
119 size_t min,
size_t elementSize,
120 const ndr_ptr_t type,
size_t* plen)
144 return STATUS_INVALID_PARAMETER;
147 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, required))
148 return STATUS_BUFFER_TOO_SMALL;
153 Stream_Read_UINT32(s, len);
154 Stream_Read_UINT32(s, offset);
155 Stream_Read_UINT32(s, len2);
156 if (len != offset + len2)
158 WLog_Print(log, WLOG_ERROR,
159 "Invalid data when reading full NDR pointer: total=%" PRIuz
160 ", offset=%" PRIuz
", remaining=%" PRIuz,
162 return STATUS_BUFFER_TOO_SMALL;
166 Stream_Read_UINT32(s, len);
168 if ((len != min) && (min > 0))
170 WLog_Print(log, WLOG_ERROR,
171 "Invalid data when reading simple NDR pointer: total=%" PRIuz
172 ", expected=%" PRIuz,
174 return STATUS_BUFFER_TOO_SMALL;
181 return STATUS_INVALID_PARAMETER;
186 WLog_Print(log, WLOG_ERROR,
187 "Invalid length read from NDR pointer, minimum %" PRIuz
", got %" PRIuz, min,
189 return STATUS_DATA_ERROR;
192 if (len > SIZE_MAX / 2)
193 return STATUS_BUFFER_TOO_SMALL;
195 if (!Stream_CheckAndLogRequiredLengthOfSizeWLog(log, s, len, elementSize))
196 return STATUS_BUFFER_TOO_SMALL;
203 r = calloc(len +
sizeof(WCHAR),
sizeof(CHAR));
205 return SCARD_E_NO_MEMORY;
206 Stream_Read(s, r, len);
207 const LONG pad = smartcard_unpack_read_size_align(s, len, 4);
211 return STATUS_INVALID_PARAMETER;
216 return STATUS_SUCCESS;
219WINPR_ATTR_NODISCARD
static LONG smartcard_ndr_read(wLog* log,
wStream* s, BYTE** data,
size_t min,
220 size_t elementSize,
const ndr_ptr_t type)
222 return smartcard_ndr_read_ex(log, s, data, min, elementSize, type,
nullptr);
225static BOOL smartcard_ndr_pointer_write(
wStream* s, UINT32* index, UINT32 length)
227 const UINT32 ndrPtr = 0x20000 + (*index) * 4;
231 if (!Stream_EnsureRemainingCapacity(s, 4))
236 Stream_Write_UINT32(s, ndrPtr);
237 (*index) = (*index) + 1;
240 Stream_Write_UINT32(s, 0);
244WINPR_ATTR_NODISCARD
static LONG smartcard_ndr_write(
wStream* s,
const BYTE* data, UINT32 size,
245 UINT32 elementSize,
const ndr_ptr_t type)
247 const UINT32 offset = 0;
248 const UINT32 len = size;
249 const UINT32 dataLen = size * elementSize;
253 return SCARD_S_SUCCESS;
267 return SCARD_E_INVALID_PARAMETER;
270 if (!Stream_EnsureRemainingCapacity(s, required + dataLen + 4))
271 return STATUS_BUFFER_TOO_SMALL;
276 Stream_Write_UINT32(s, len);
277 Stream_Write_UINT32(s, offset);
278 Stream_Write_UINT32(s, len);
281 Stream_Write_UINT32(s, len);
286 return SCARD_E_INVALID_PARAMETER;
290 Stream_Write(s, data, dataLen);
292 Stream_Zero(s, dataLen);
293 return smartcard_pack_write_size_align(s, dataLen, 4);
296WINPR_ATTR_NODISCARD
static LONG smartcard_ndr_write_state(
wStream* s,
298 UINT32 size,
const ndr_ptr_t type)
306 WINPR_ASSERT(data || (size == 0));
309 for (
size_t x = 0; x < size; x++)
312 if (!smartcard_reader_state_return_is_valid(x, cur))
313 return SCARD_E_INVALID_ATR;
318WINPR_ATTR_NODISCARD
static LONG smartcard_ndr_read_state(wLog* log,
wStream* s,
320 const ndr_ptr_t type)
334 if (status != SCARD_S_SUCCESS)
338 return SCARD_E_INVALID_VALUE;
340 for (
size_t x = 0; x < min; x++)
343 if (!smartcard_reader_state_return_is_valid(x, cur))
344 return SCARD_E_INVALID_ATR;
349WINPR_ATTR_NODISCARD
static LONG smartcard_ndr_read_atrmask(wLog* log,
wStream* s,
351 const ndr_ptr_t type)
359 const LONG status = smartcard_ndr_read(log, s, u.ppv, min,
sizeof(
LocateCards_ATRMask), type);
360 if (status != SCARD_S_SUCCESS)
367 for (
size_t x = 0; x < min; x++)
369 const UINT32 val = winpr_Data_Get_UINT32(&masks[x].cbAtr);
370 if (val > ARRAYSIZE(masks[x].rgbAtr))
372 WLog_Print(log, WLOG_ERROR,
373 "LocateCards_ATRMask[%" PRIuz
"]::cbAtr %" PRIu32
" exceeds %" PRIuz, x, val,
374 (
size_t)ARRAYSIZE(masks[x].rgbAtr));
377 return STATUS_DATA_ERROR;
380 return SCARD_S_SUCCESS;
383WINPR_ATTR_NODISCARD
static LONG smartcard_ndr_read_fixed_string_a(wLog* log,
wStream* s,
384 CHAR** data,
size_t min,
385 const ndr_ptr_t type)
393 return smartcard_ndr_read(log, s, u.ppv, min,
sizeof(CHAR), type);
396WINPR_ATTR_NODISCARD
static LONG smartcard_ndr_read_fixed_string_w(wLog* log,
wStream* s,
397 WCHAR** data,
size_t min,
398 const ndr_ptr_t type)
406 return smartcard_ndr_read(log, s, u.ppv, min,
sizeof(WCHAR), type);
409WINPR_ATTR_NODISCARD
static LONG smartcard_ndr_read_a(wLog* log,
wStream* s, CHAR** data,
410 const ndr_ptr_t type)
418 return smartcard_ndr_read(log, s, u.ppv, 0,
sizeof(CHAR), type);
421WINPR_ATTR_NODISCARD
static LONG smartcard_ndr_read_w(wLog* log,
wStream* s, WCHAR** data,
422 const ndr_ptr_t type)
430 return smartcard_ndr_read(log, s, u.ppv, 0,
sizeof(WCHAR), type);
433WINPR_ATTR_NODISCARD
static LONG smartcard_ndr_write_w(
wStream* s,
const WCHAR* data, UINT32 size,
434 const ndr_ptr_t type)
442 return smartcard_ndr_write(s, cnv.bp, size,
sizeof(WCHAR), type);
445WINPR_ATTR_NODISCARD
static LONG smartcard_ndr_write_a(
wStream* s,
const CHAR* data, UINT32 size,
446 const ndr_ptr_t type)
454 return smartcard_ndr_write(s, cnv.bp, size,
sizeof(CHAR), type);
457WINPR_ATTR_NODISCARD
static LONG smartcard_ndr_read_u(wLog* log,
wStream* s,
UUID** data)
465 return smartcard_ndr_read(log, s, u.ppv, 1,
sizeof(
UUID), NDR_PTR_FIXED);
468static char* smartcard_convert_string_list(
const void* in,
size_t bytes, BOOL unicode)
477 char* mszA =
nullptr;
489 mszA = ConvertMszWCharNToUtf8Alloc(
string.wz, bytes /
sizeof(WCHAR), &length);
495 mszA = (
char*)calloc(bytes,
sizeof(
char));
498 CopyMemory(mszA,
string.sz, bytes - 1);
507 for (
size_t index = 0; index < length - 1; index++)
509 if (mszA[index] ==
'\0')
516WINPR_ATTR_MALLOC(free, 1)
517static
char* smartcard_create_msz_dump(const
char* msz,
size_t len)
519 size_t bufferLen = len;
520 char* buffer = calloc(len + 1, 1);
525 const char* cur = msz;
527 while ((len > 0) && cur && cur[0] !=
'\0' && (bufferLen > 0))
529 size_t clen = strnlen(cur, len);
530 int rc = _snprintf(buf, bufferLen,
"%s", cur);
531 bufferLen -= (size_t)rc;
540static void smartcard_msz_dump(wLog* log, DWORD level,
const char* prefix,
const void* data,
541 size_t len, UINT32 wchar)
543 if (!WLog_IsLevelActive(log, level))
547 const char* msz = WINPR_CXX_COMPAT_CAST(
const char*, data);
551 tmp = ConvertMszWCharNToUtf8Alloc(data, len, &mszlen);
555 char* array = smartcard_create_msz_dump(msz, mszlen);
556 WLog_Print(log, level,
"%s%s", prefix, array);
561WINPR_ATTR_MALLOC(free, 1)
562static
char* smartcard_create_array_dump(const
void* pd,
size_t len)
564 const BYTE* data = pd;
567 size_t bufferLen = len * 4;
570 char* buffer = calloc(bufferLen + 1, 1);
573 char* start = buffer;
575 WINPR_ASSERT(buffer || (bufferLen == 0));
577 if (!data && (len > 0))
579 (void)_snprintf(buffer, bufferLen,
"{ nullptr [%" PRIuz
"] }", len);
583 rc = _snprintf(buffer, bufferLen,
"{ ");
584 if ((rc < 0) || ((
size_t)rc >= bufferLen))
587 bufferLen -= (size_t)rc;
589 for (
size_t x = 0; x < len; x++)
591 rc = _snprintf(buffer, bufferLen,
"%02X", data[x]);
592 if ((rc < 0) || ((
size_t)rc >= bufferLen))
595 bufferLen -= (size_t)rc;
598 rc = _snprintf(buffer, bufferLen,
" }");
599 if ((rc < 0) || ((
size_t)rc >= bufferLen))
606WINPR_ATTR_FORMAT_ARG(3, 7)
607static
void smartcard_dump_array(wLog* log, DWORD level, WINPR_FORMAT_ARG const
char* prefix,
608 const
char* postfix, const
void* data,
size_t len, ...)
610 if (!WLog_IsLevelActive(log, level))
613 char* buffer = smartcard_create_array_dump(data, len);
615 char* fprefix =
nullptr;
617 va_list ap = WINPR_C_ARRAY_INIT;
619 winpr_vasprintf(&fprefix, &flen, prefix, ap);
621 WLog_Print(log, level,
"%s%s%s", fprefix, buffer, postfix);
626static void smartcard_log_redir_handle(wLog* log,
const REDIR_SCARDHANDLE* pHandle)
628 WINPR_ASSERT(pHandle);
629 smartcard_dump_array(log, g_LogLevel,
"handle: ",
"", pHandle->pbHandle, pHandle->cbHandle);
634 WINPR_ASSERT(phContext);
635 smartcard_dump_array(log, g_LogLevel,
"hContext: ",
"", phContext->pbContext,
636 phContext->cbContext);
639static void smartcard_trace_context_and_string_call_a(wLog* log,
const char* name,
643 if (!WLog_IsLevelActive(log, g_LogLevel))
646 WLog_Print(log, g_LogLevel,
"%s {", name);
647 smartcard_log_context(log, phContext);
648 WLog_Print(log, g_LogLevel,
" sz=%s", sz);
650 WLog_Print(log, g_LogLevel,
"}");
653static void smartcard_trace_context_and_string_call_w(wLog* log,
const char* name,
659 if (!WLog_IsLevelActive(log, g_LogLevel))
663 tmp = ConvertWCharToUtf8Alloc(sz,
nullptr);
665 WLog_Print(log, g_LogLevel,
"%s {", name);
666 smartcard_log_context(log, phContext);
667 WLog_Print(log, g_LogLevel,
" sz=%s", tmp);
668 WLog_Print(log, g_LogLevel,
"}");
672static void smartcard_trace_context_call(wLog* log,
const Context_Call* call,
const char* name)
676 if (!WLog_IsLevelActive(log, g_LogLevel))
679 WLog_Print(log, g_LogLevel,
"%s_Call {", name);
680 smartcard_log_context(log, &call->handles.hContext);
682 WLog_Print(log, g_LogLevel,
"}");
690 if (!WLog_IsLevelActive(log, g_LogLevel))
693 WLog_Print(log, g_LogLevel,
"ListReaderGroups%s_Call {", unicode ?
"W" :
"A");
694 smartcard_log_context(log, &call->handles.hContext);
696 WLog_Print(log, g_LogLevel,
"fmszGroupsIsNULL: %" PRId32
" cchGroups: 0x%08" PRIx32,
697 call->fmszGroupsIsNULL, call->cchGroups);
698 WLog_Print(log, g_LogLevel,
"}");
701static void dump_reader_states_return(wLog* log,
const ReaderState_Return* rgReaderStates,
704 WINPR_ASSERT(rgReaderStates || (cReaders == 0));
705 for (UINT32 index = 0; index < cReaders; index++)
708 char* szCurrentState = SCardGetReaderStateString(readerState->dwCurrentState);
709 char* szEventState = SCardGetReaderStateString(readerState->dwEventState);
710 WLog_Print(log, g_LogLevel,
"\t[%" PRIu32
"]: dwCurrentState: %s (0x%08" PRIX32
")", index,
711 szCurrentState, readerState->dwCurrentState);
712 WLog_Print(log, g_LogLevel,
"\t[%" PRIu32
"]: dwEventState: %s (0x%08" PRIX32
")", index,
713 szEventState, readerState->dwEventState);
714 free(szCurrentState);
717 smartcard_dump_array(log, g_LogLevel,
"\t[%" PRIu32
"]: cbAttr: %" PRIu32
" { ",
" }",
718 readerState->rgbAtr, readerState->cbAtr, index, readerState->cbAtr);
725 WINPR_ASSERT(rgReaderStates || (cReaders == 0));
726 for (UINT32 index = 0; index < cReaders; index++)
730 WLog_Print(log, g_LogLevel,
"\t[%" PRIu32
"]: szReader: %s cbAtr: %" PRIu32
"", index,
731 readerState->szReader, readerState->cbAtr);
732 char* szCurrentState = SCardGetReaderStateString(readerState->dwCurrentState);
733 char* szEventState = SCardGetReaderStateString(readerState->dwEventState);
734 WLog_Print(log, g_LogLevel,
"\t[%" PRIu32
"]: dwCurrentState: %s (0x%08" PRIX32
")", index,
735 szCurrentState, readerState->dwCurrentState);
736 WLog_Print(log, g_LogLevel,
"\t[%" PRIu32
"]: dwEventState: %s (0x%08" PRIX32
")", index,
737 szEventState, readerState->dwEventState);
738 free(szCurrentState);
741 smartcard_dump_array(log, g_LogLevel,
"\t[%" PRIu32
"]: cbAttr: %" PRIu32
" { ",
" }",
742 readerState->rgbAtr, readerState->cbAtr, index, readerState->cbAtr);
749 WINPR_ASSERT(rgReaderStates || (cReaders == 0));
750 for (UINT32 index = 0; index < cReaders; index++)
753 char* buffer = ConvertWCharToUtf8Alloc(readerState->szReader,
nullptr);
754 WLog_Print(log, g_LogLevel,
"\t[%" PRIu32
"]: szReader: %s cbAtr: %" PRIu32
"", index,
755 buffer, readerState->cbAtr);
757 char* szCurrentState = SCardGetReaderStateString(readerState->dwCurrentState);
758 char* szEventState = SCardGetReaderStateString(readerState->dwEventState);
759 WLog_Print(log, g_LogLevel,
"\t[%" PRIu32
"]: dwCurrentState: %s (0x%08" PRIX32
")", index,
760 szCurrentState, readerState->dwCurrentState);
761 WLog_Print(log, g_LogLevel,
"\t[%" PRIu32
"]: dwEventState: %s (0x%08" PRIX32
")", index,
762 szEventState, readerState->dwEventState);
763 free(szCurrentState);
766 smartcard_dump_array(log, g_LogLevel,
"\t[%" PRIu32
"]: cbAttr: %" PRIu32
" { ",
" }",
767 readerState->rgbAtr, readerState->cbAtr, index, readerState->cbAtr);
775 if (!WLog_IsLevelActive(log, g_LogLevel))
778 WLog_Print(log, g_LogLevel,
"GetStatusChangeW_Call {");
779 smartcard_log_context(log, &call->handles.hContext);
781 WLog_Print(log, g_LogLevel,
"dwTimeOut: 0x%08" PRIX32
" cReaders: %" PRIu32
"", call->dwTimeOut,
784 dump_reader_states_w(log, call->rgReaderStates, call->cReaders);
786 WLog_Print(log, g_LogLevel,
"}");
794 if (!WLog_IsLevelActive(log, g_LogLevel))
797 char* mszA = smartcard_convert_string_list(ret->msz, ret->cBytes, unicode);
799 WLog_Print(log, g_LogLevel,
"ListReaderGroups%s_Return {", unicode ?
"W" :
"A");
800 WLog_Print(log, g_LogLevel,
" ReturnCode: %s (0x%08" PRIx32
")",
801 SCardGetErrorString(ret->ReturnCode),
802 WINPR_CXX_COMPAT_CAST(UINT32, ret->ReturnCode));
803 WLog_Print(log, g_LogLevel,
" cBytes: %" PRIu32
" msz: %s", ret->cBytes, mszA);
804 WLog_Print(log, g_LogLevel,
"}");
808static void smartcard_trace_list_readers_call(wLog* log,
const ListReaders_Call* call, BOOL unicode)
812 if (!WLog_IsLevelActive(log, g_LogLevel))
815 char* mszGroupsA = smartcard_convert_string_list(call->mszGroups, call->cBytes, unicode);
817 WLog_Print(log, g_LogLevel,
"ListReaders%s_Call {", unicode ?
"W" :
"A");
818 smartcard_log_context(log, &call->handles.hContext);
820 WLog_Print(log, g_LogLevel,
821 "cBytes: %" PRIu32
" mszGroups: %s fmszReadersIsNULL: %" PRId32
822 " cchReaders: 0x%08" PRIX32
"",
823 call->cBytes, mszGroupsA, call->fmszReadersIsNULL, call->cchReaders);
824 WLog_Print(log, g_LogLevel,
"}");
829static void smartcard_trace_locate_cards_by_atr_a_call(wLog* log,
834 if (!WLog_IsLevelActive(log, g_LogLevel))
837 WLog_Print(log, g_LogLevel,
"LocateCardsByATRA_Call {");
838 smartcard_log_context(log, &call->handles.hContext);
840 dump_reader_states_a(log, call->rgReaderStates, call->cReaders);
842 WLog_Print(log, g_LogLevel,
"}");
845static void smartcard_trace_locate_cards_a_call(wLog* log,
const LocateCardsA_Call* call)
849 if (!WLog_IsLevelActive(log, g_LogLevel))
852 WLog_Print(log, g_LogLevel,
"LocateCardsA_Call {");
853 smartcard_log_context(log, &call->handles.hContext);
854 WLog_Print(log, g_LogLevel,
" cBytes=%" PRIu32, call->cBytes);
855 smartcard_msz_dump(log, g_LogLevel,
" mszCards=", call->mszCards, call->cBytes, FALSE);
856 WLog_Print(log, g_LogLevel,
" cReaders=%" PRIu32, call->cReaders);
857 dump_reader_states_a(log, call->rgReaderStates, call->cReaders);
859 WLog_Print(log, g_LogLevel,
"}");
862static void smartcard_trace_locate_cards_return(wLog* log,
const LocateCards_Return* ret)
866 if (!WLog_IsLevelActive(log, g_LogLevel))
869 WLog_Print(log, g_LogLevel,
"LocateCards_Return {");
870 WLog_Print(log, g_LogLevel,
" ReturnCode: %s (0x%08" PRIX32
")",
871 SCardGetErrorString(ret->ReturnCode),
872 WINPR_CXX_COMPAT_CAST(UINT32, ret->ReturnCode));
874 if (ret->ReturnCode == SCARD_S_SUCCESS)
876 WLog_Print(log, g_LogLevel,
" cReaders=%" PRIu32, ret->cReaders);
878 WLog_Print(log, g_LogLevel,
"}");
885 if (!WLog_IsLevelActive(log, g_LogLevel))
888 WLog_Print(log, g_LogLevel,
"GetReaderIcon_Return {");
889 WLog_Print(log, g_LogLevel,
" ReturnCode: %s (0x%08" PRIX32
")",
890 SCardGetErrorString(ret->ReturnCode),
891 WINPR_CXX_COMPAT_CAST(UINT32, ret->ReturnCode));
893 if (ret->ReturnCode == SCARD_S_SUCCESS)
895 WLog_Print(log, g_LogLevel,
" cbDataLen=%" PRIu32, ret->cbDataLen);
897 WLog_Print(log, g_LogLevel,
"}");
904 if (!WLog_IsLevelActive(log, g_LogLevel))
907 WLog_Print(log, g_LogLevel,
"GetTransmitCount_Return {");
908 WLog_Print(log, g_LogLevel,
" ReturnCode: %s (0x%08" PRIX32
")",
909 SCardGetErrorString(ret->ReturnCode),
910 WINPR_CXX_COMPAT_CAST(UINT32, ret->ReturnCode));
912 WLog_Print(log, g_LogLevel,
" cTransmitCount=%" PRIu32, ret->cTransmitCount);
913 WLog_Print(log, g_LogLevel,
"}");
916static void smartcard_trace_read_cache_return(wLog* log,
const ReadCache_Return* ret)
920 if (!WLog_IsLevelActive(log, g_LogLevel))
923 WLog_Print(log, g_LogLevel,
"ReadCache_Return {");
924 WLog_Print(log, g_LogLevel,
" ReturnCode: %s (0x%08" PRIX32
")",
925 SCardGetErrorString(ret->ReturnCode),
926 WINPR_CXX_COMPAT_CAST(UINT32, ret->ReturnCode));
928 if (ret->ReturnCode == SCARD_S_SUCCESS)
930 WLog_Print(log, g_LogLevel,
" cbDataLen=%" PRIu32, ret->cbDataLen);
931 smartcard_dump_array(log, g_LogLevel,
" cbData: ",
"", ret->pbData, ret->cbDataLen);
933 WLog_Print(log, g_LogLevel,
"}");
936static void smartcard_trace_locate_cards_w_call(wLog* log,
const LocateCardsW_Call* call)
940 if (!WLog_IsLevelActive(log, g_LogLevel))
943 WLog_Print(log, g_LogLevel,
"LocateCardsW_Call {");
944 smartcard_log_context(log, &call->handles.hContext);
945 WLog_Print(log, g_LogLevel,
" cBytes=%" PRIu32, call->cBytes);
946 smartcard_msz_dump(log, g_LogLevel,
" sz2=", call->mszCards, call->cBytes, TRUE);
947 WLog_Print(log, g_LogLevel,
" cReaders=%" PRIu32, call->cReaders);
948 dump_reader_states_w(log, call->rgReaderStates, call->cReaders);
949 WLog_Print(log, g_LogLevel,
"}");
952static void smartcard_trace_list_readers_return(wLog* log,
const ListReaders_Return* ret,
957 if (!WLog_IsLevelActive(log, g_LogLevel))
960 WLog_Print(log, g_LogLevel,
"ListReaders%s_Return {", unicode ?
"W" :
"A");
961 WLog_Print(log, g_LogLevel,
" ReturnCode: %s (0x%08" PRIX32
")",
962 SCardGetErrorString(ret->ReturnCode),
963 WINPR_CXX_COMPAT_CAST(UINT32, ret->ReturnCode));
965 if (ret->ReturnCode != SCARD_S_SUCCESS)
967 WLog_Print(log, g_LogLevel,
"}");
971 char* mszA = smartcard_convert_string_list(ret->msz, ret->cBytes, unicode);
973 WLog_Print(log, g_LogLevel,
" cBytes: %" PRIu32
" msz: %s", ret->cBytes, mszA);
974 WLog_Print(log, g_LogLevel,
"}");
983 if (!WLog_IsLevelActive(log, g_LogLevel))
986 WLog_Print(log, g_LogLevel,
"GetStatusChange%s_Return {", unicode ?
"W" :
"A");
987 WLog_Print(log, g_LogLevel,
" ReturnCode: %s (0x%08" PRIX32
")",
988 SCardGetErrorString(ret->ReturnCode),
989 WINPR_CXX_COMPAT_CAST(UINT32, ret->ReturnCode));
990 WLog_Print(log, g_LogLevel,
" cReaders: %" PRIu32
"", ret->cReaders);
992 dump_reader_states_return(log, ret->rgReaderStates, ret->cReaders);
994 if (!ret->rgReaderStates && (ret->cReaders > 0))
996 WLog_Print(log, g_LogLevel,
" [INVALID STATE] rgReaderStates=nullptr, cReaders=%" PRIu32,
999 else if (ret->ReturnCode != SCARD_S_SUCCESS)
1001 WLog_Print(log, g_LogLevel,
" [INVALID RETURN] rgReaderStates, cReaders=%" PRIu32,
1006 for (UINT32 index = 0; index < ret->cReaders; index++)
1009 char* szCurrentState = SCardGetReaderStateString(rgReaderState->dwCurrentState);
1010 char* szEventState = SCardGetReaderStateString(rgReaderState->dwEventState);
1011 WLog_Print(log, g_LogLevel,
" [%" PRIu32
"]: dwCurrentState: %s (0x%08" PRIX32
")",
1012 index, szCurrentState, rgReaderState->dwCurrentState);
1013 WLog_Print(log, g_LogLevel,
" [%" PRIu32
"]: dwEventState: %s (0x%08" PRIX32
")",
1014 index, szEventState, rgReaderState->dwEventState);
1015 smartcard_dump_array(
1016 log, g_LogLevel,
" [%" PRIu32
"]: cbAtr: %" PRIu32
" rgbAtr: ",
"",
1017 rgReaderState->rgbAtr, rgReaderState->cbAtr, index, rgReaderState->cbAtr);
1018 free(szCurrentState);
1023 WLog_Print(log, g_LogLevel,
"}");
1026static void smartcard_trace_context_and_two_strings_a_call(wLog* log,
1031 if (!WLog_IsLevelActive(log, g_LogLevel))
1034 WLog_Print(log, g_LogLevel,
"ContextAndTwoStringW_Call {");
1035 smartcard_log_context(log, &call->handles.hContext);
1036 WLog_Print(log, g_LogLevel,
" sz1=%s", call->sz1);
1037 WLog_Print(log, g_LogLevel,
" sz2=%s", call->sz2);
1038 WLog_Print(log, g_LogLevel,
"}");
1041static void smartcard_trace_context_and_two_strings_w_call(wLog* log,
1045 char sz1[1024] = WINPR_C_ARRAY_INIT;
1046 char sz2[1024] = WINPR_C_ARRAY_INIT;
1048 if (!WLog_IsLevelActive(log, g_LogLevel))
1051 (void)ConvertWCharToUtf8(call->sz1, sz1, ARRAYSIZE(sz1));
1053 (void)ConvertWCharToUtf8(call->sz2, sz2, ARRAYSIZE(sz2));
1055 WLog_Print(log, g_LogLevel,
"ContextAndTwoStringW_Call {");
1056 smartcard_log_context(log, &call->handles.hContext);
1057 WLog_Print(log, g_LogLevel,
" sz1=%s", sz1);
1058 WLog_Print(log, g_LogLevel,
" sz2=%s", sz2);
1059 WLog_Print(log, g_LogLevel,
"}");
1066 if (!WLog_IsLevelActive(log, g_LogLevel))
1069 WLog_Print(log, g_LogLevel,
"GetTransmitCount_Call {");
1070 smartcard_log_context(log, &call->handles.hContext);
1071 smartcard_log_redir_handle(log, &call->handles.hCard);
1073 WLog_Print(log, g_LogLevel,
"}");
1076static void smartcard_trace_write_cache_a_call(wLog* log,
const WriteCacheA_Call* call)
1080 if (!WLog_IsLevelActive(log, g_LogLevel))
1083 WLog_Print(log, g_LogLevel,
"WriteCacheA_Call {");
1085 WLog_Print(log, g_LogLevel,
" szLookupName=%s", call->szLookupName);
1087 smartcard_log_context(log, &call->Common.handles.hContext);
1088 smartcard_dump_array(log, g_LogLevel,
"..CardIdentifier=",
"", call->Common.CardIdentifier,
1090 WLog_Print(log, g_LogLevel,
" FreshnessCounter=%" PRIu32, call->Common.FreshnessCounter);
1091 WLog_Print(log, g_LogLevel,
" cbDataLen=%" PRIu32, call->Common.cbDataLen);
1092 smartcard_dump_array(log, g_LogLevel,
" pbData=",
"", call->Common.pbData,
1093 call->Common.cbDataLen);
1094 WLog_Print(log, g_LogLevel,
"}");
1097static void smartcard_trace_write_cache_w_call(wLog* log,
const WriteCacheW_Call* call)
1100 char tmp[1024] = WINPR_C_ARRAY_INIT;
1102 if (!WLog_IsLevelActive(log, g_LogLevel))
1105 WLog_Print(log, g_LogLevel,
"WriteCacheW_Call {");
1107 if (call->szLookupName)
1108 (void)ConvertWCharToUtf8(call->szLookupName, tmp, ARRAYSIZE(tmp));
1109 WLog_Print(log, g_LogLevel,
" szLookupName=%s", tmp);
1111 smartcard_log_context(log, &call->Common.handles.hContext);
1112 smartcard_dump_array(log, g_LogLevel,
"..CardIdentifier=",
"", call->Common.CardIdentifier,
1114 WLog_Print(log, g_LogLevel,
" FreshnessCounter=%" PRIu32, call->Common.FreshnessCounter);
1115 WLog_Print(log, g_LogLevel,
" cbDataLen=%" PRIu32, call->Common.cbDataLen);
1116 smartcard_dump_array(log, g_LogLevel,
" pbData=",
"", call->Common.pbData,
1117 call->Common.cbDataLen);
1118 WLog_Print(log, g_LogLevel,
"}");
1121static void smartcard_trace_read_cache_a_call(wLog* log,
const ReadCacheA_Call* call)
1125 if (!WLog_IsLevelActive(log, g_LogLevel))
1128 WLog_Print(log, g_LogLevel,
"ReadCacheA_Call {");
1130 WLog_Print(log, g_LogLevel,
" szLookupName=%s", call->szLookupName);
1131 smartcard_log_context(log, &call->Common.handles.hContext);
1132 smartcard_dump_array(log, g_LogLevel,
"..CardIdentifier=",
"", call->Common.CardIdentifier,
1134 WLog_Print(log, g_LogLevel,
" FreshnessCounter=%" PRIu32, call->Common.FreshnessCounter);
1135 WLog_Print(log, g_LogLevel,
" fPbDataIsNULL=%" PRId32, call->Common.fPbDataIsNULL);
1136 WLog_Print(log, g_LogLevel,
" cbDataLen=%" PRIu32, call->Common.cbDataLen);
1138 WLog_Print(log, g_LogLevel,
"}");
1141static void smartcard_trace_read_cache_w_call(wLog* log,
const ReadCacheW_Call* call)
1144 char tmp[1024] = WINPR_C_ARRAY_INIT;
1146 if (!WLog_IsLevelActive(log, g_LogLevel))
1149 WLog_Print(log, g_LogLevel,
"ReadCacheW_Call {");
1150 if (call->szLookupName)
1151 (void)ConvertWCharToUtf8(call->szLookupName, tmp, ARRAYSIZE(tmp));
1152 WLog_Print(log, g_LogLevel,
" szLookupName=%s", tmp);
1154 smartcard_log_context(log, &call->Common.handles.hContext);
1155 smartcard_dump_array(log, g_LogLevel,
"..CardIdentifier=",
"", call->Common.CardIdentifier,
1157 WLog_Print(log, g_LogLevel,
" FreshnessCounter=%" PRIu32, call->Common.FreshnessCounter);
1158 WLog_Print(log, g_LogLevel,
" fPbDataIsNULL=%" PRId32, call->Common.fPbDataIsNULL);
1159 WLog_Print(log, g_LogLevel,
" cbDataLen=%" PRIu32, call->Common.cbDataLen);
1161 WLog_Print(log, g_LogLevel,
"}");
1164static void smartcard_trace_transmit_call(wLog* log,
const Transmit_Call* call)
1167 UINT32 cbExtraBytes = 0;
1168 BYTE* pbExtraBytes =
nullptr;
1170 if (!WLog_IsLevelActive(log, g_LogLevel))
1173 WLog_Print(log, g_LogLevel,
"Transmit_Call {");
1174 smartcard_log_context(log, &call->handles.hContext);
1175 smartcard_log_redir_handle(log, &call->handles.hCard);
1177 if (call->pioSendPci)
1179 cbExtraBytes = (UINT32)(call->pioSendPci->cbPciLength -
sizeof(
SCARD_IO_REQUEST));
1181 WLog_Print(log, g_LogLevel,
"pioSendPci: dwProtocol: %" PRIu32
" cbExtraBytes: %" PRIu32
"",
1182 call->pioSendPci->dwProtocol, cbExtraBytes);
1186 smartcard_dump_array(log, g_LogLevel,
"pbExtraBytes: ",
"", pbExtraBytes, cbExtraBytes);
1191 WLog_Print(log, g_LogLevel,
"pioSendPci: null");
1194 WLog_Print(log, g_LogLevel,
"cbSendLength: %" PRIu32
"", call->cbSendLength);
1196 if (call->pbSendBuffer)
1198 smartcard_dump_array(log, g_LogLevel,
"pbSendBuffer: ",
"", call->pbSendBuffer,
1199 call->cbSendLength);
1203 WLog_Print(log, g_LogLevel,
"pbSendBuffer: null");
1206 if (call->pioRecvPci)
1208 cbExtraBytes = (UINT32)(call->pioRecvPci->cbPciLength -
sizeof(
SCARD_IO_REQUEST));
1210 WLog_Print(log, g_LogLevel,
"pioRecvPci: dwProtocol: %" PRIu32
" cbExtraBytes: %" PRIu32
"",
1211 call->pioRecvPci->dwProtocol, cbExtraBytes);
1215 smartcard_dump_array(log, g_LogLevel,
"pbExtraBytes: ",
"", pbExtraBytes, cbExtraBytes);
1220 WLog_Print(log, g_LogLevel,
"pioRecvPci: null");
1223 WLog_Print(log, g_LogLevel,
"fpbRecvBufferIsNULL: %" PRId32
" cbRecvLength: %" PRIu32
"",
1224 call->fpbRecvBufferIsNULL, call->cbRecvLength);
1225 WLog_Print(log, g_LogLevel,
"}");
1228static void smartcard_trace_locate_cards_by_atr_w_call(wLog* log,
1233 if (!WLog_IsLevelActive(log, g_LogLevel))
1236 WLog_Print(log, g_LogLevel,
"LocateCardsByATRW_Call {");
1237 smartcard_log_context(log, &call->handles.hContext);
1239 dump_reader_states_w(log, call->rgReaderStates, call->cReaders);
1241 WLog_Print(log, g_LogLevel,
"}");
1244static void smartcard_trace_transmit_return(wLog* log,
const Transmit_Return* ret)
1247 UINT32 cbExtraBytes = 0;
1248 BYTE* pbExtraBytes =
nullptr;
1250 if (!WLog_IsLevelActive(log, g_LogLevel))
1253 WLog_Print(log, g_LogLevel,
"Transmit_Return {");
1254 WLog_Print(log, g_LogLevel,
" ReturnCode: %s (0x%08" PRIX32
")",
1255 SCardGetErrorString(ret->ReturnCode),
1256 WINPR_CXX_COMPAT_CAST(UINT32, ret->ReturnCode));
1258 if (ret->pioRecvPci)
1260 cbExtraBytes = (UINT32)(ret->pioRecvPci->cbPciLength -
sizeof(
SCARD_IO_REQUEST));
1262 WLog_Print(log, g_LogLevel,
1263 " pioRecvPci: dwProtocol: %" PRIu32
" cbExtraBytes: %" PRIu32
"",
1264 ret->pioRecvPci->dwProtocol, cbExtraBytes);
1268 smartcard_dump_array(log, g_LogLevel,
" pbExtraBytes: ",
"", pbExtraBytes,
1274 WLog_Print(log, g_LogLevel,
" pioRecvPci: null");
1277 WLog_Print(log, g_LogLevel,
" cbRecvLength: %" PRIu32
"", ret->cbRecvLength);
1279 if (ret->pbRecvBuffer)
1281 smartcard_dump_array(log, g_LogLevel,
" pbRecvBuffer: ",
"", ret->pbRecvBuffer,
1286 WLog_Print(log, g_LogLevel,
" pbRecvBuffer: null");
1289 WLog_Print(log, g_LogLevel,
"}");
1292static void smartcard_trace_control_return(wLog* log,
const Control_Return* ret)
1296 if (!WLog_IsLevelActive(log, g_LogLevel))
1299 WLog_Print(log, g_LogLevel,
"Control_Return {");
1300 WLog_Print(log, g_LogLevel,
" ReturnCode: %s (0x%08" PRIX32
")",
1301 SCardGetErrorString(ret->ReturnCode),
1302 WINPR_CXX_COMPAT_CAST(UINT32, ret->ReturnCode));
1303 WLog_Print(log, g_LogLevel,
" cbOutBufferSize: %" PRIu32
"", ret->cbOutBufferSize);
1305 if (ret->pvOutBuffer)
1307 smartcard_dump_array(log, g_LogLevel,
"pvOutBuffer: ",
"", ret->pvOutBuffer,
1308 ret->cbOutBufferSize);
1312 WLog_Print(log, g_LogLevel,
"pvOutBuffer: null");
1315 WLog_Print(log, g_LogLevel,
"}");
1318static void smartcard_trace_control_call(wLog* log,
const Control_Call* call)
1322 if (!WLog_IsLevelActive(log, g_LogLevel))
1325 WLog_Print(log, g_LogLevel,
"Control_Call {");
1326 smartcard_log_context(log, &call->handles.hContext);
1327 smartcard_log_redir_handle(log, &call->handles.hCard);
1329 WLog_Print(log, g_LogLevel,
1330 "dwControlCode: 0x%08" PRIX32
" cbInBufferSize: %" PRIu32
1331 " fpvOutBufferIsNULL: %" PRId32
" cbOutBufferSize: %" PRIu32
"",
1332 call->dwControlCode, call->cbInBufferSize, call->fpvOutBufferIsNULL,
1333 call->cbOutBufferSize);
1335 if (call->pvInBuffer)
1337 smartcard_dump_array(log, WLOG_DEBUG,
"pbInBuffer: ",
"", call->pvInBuffer,
1338 call->cbInBufferSize);
1342 WLog_Print(log, g_LogLevel,
"pvInBuffer: null");
1345 WLog_Print(log, g_LogLevel,
"}");
1348static void smartcard_trace_set_attrib_call(wLog* log,
const SetAttrib_Call* call)
1352 if (!WLog_IsLevelActive(log, g_LogLevel))
1355 WLog_Print(log, g_LogLevel,
"GetAttrib_Call {");
1356 smartcard_log_context(log, &call->handles.hContext);
1357 smartcard_log_redir_handle(log, &call->handles.hCard);
1358 WLog_Print(log, g_LogLevel,
"dwAttrId: 0x%08" PRIX32, call->dwAttrId);
1359 WLog_Print(log, g_LogLevel,
"cbAttrLen: 0x%08" PRIx32, call->cbAttrLen);
1360 smartcard_dump_array(log, g_LogLevel,
"pbAttr: ",
"", call->pbAttr, call->cbAttrLen);
1361 WLog_Print(log, g_LogLevel,
"}");
1364static void smartcard_trace_get_attrib_return(wLog* log,
const GetAttrib_Return* ret,
1369 if (!WLog_IsLevelActive(log, g_LogLevel))
1372 WLog_Print(log, g_LogLevel,
"GetAttrib_Return {");
1373 WLog_Print(log, g_LogLevel,
" ReturnCode: %s (0x%08" PRIX32
")",
1374 SCardGetErrorString(ret->ReturnCode),
1375 WINPR_CXX_COMPAT_CAST(UINT32, ret->ReturnCode));
1376 WLog_Print(log, g_LogLevel,
" dwAttrId: %s (0x%08" PRIX32
") cbAttrLen: 0x%08" PRIX32
"",
1377 SCardGetAttributeString(dwAttrId), dwAttrId, ret->cbAttrLen);
1378 smartcard_dump_array(log, g_LogLevel,
" ",
"", ret->pbAttr, ret->cbAttrLen);
1380 WLog_Print(log, g_LogLevel,
"}");
1383static void smartcard_trace_get_attrib_call(wLog* log,
const GetAttrib_Call* call)
1387 if (!WLog_IsLevelActive(log, g_LogLevel))
1390 WLog_Print(log, g_LogLevel,
"GetAttrib_Call {");
1391 smartcard_log_context(log, &call->handles.hContext);
1392 smartcard_log_redir_handle(log, &call->handles.hCard);
1394 WLog_Print(log, g_LogLevel,
1395 "dwAttrId: %s (0x%08" PRIX32
") fpbAttrIsNULL: %" PRId32
" cbAttrLen: 0x%08" PRIX32
1397 SCardGetAttributeString(call->dwAttrId), call->dwAttrId, call->fpbAttrIsNULL,
1399 WLog_Print(log, g_LogLevel,
"}");
1402static void smartcard_trace_status_call(wLog* log,
const Status_Call* call, BOOL unicode)
1406 if (!WLog_IsLevelActive(log, g_LogLevel))
1409 WLog_Print(log, g_LogLevel,
"Status%s_Call {", unicode ?
"W" :
"A");
1410 smartcard_log_context(log, &call->handles.hContext);
1411 smartcard_log_redir_handle(log, &call->handles.hCard);
1413 WLog_Print(log, g_LogLevel,
1414 "fmszReaderNamesIsNULL: %" PRId32
" cchReaderLen: %" PRIu32
" cbAtrLen: %" PRIu32
"",
1415 call->fmszReaderNamesIsNULL, call->cchReaderLen, call->cbAtrLen);
1416 WLog_Print(log, g_LogLevel,
"}");
1419static void smartcard_trace_status_return(wLog* log,
const Status_Return* ret, BOOL unicode)
1422 char* mszReaderNamesA =
nullptr;
1425 if (!WLog_IsLevelActive(log, g_LogLevel))
1427 cBytes = ret->cBytes;
1428 if (ret->ReturnCode != SCARD_S_SUCCESS)
1430 if (cBytes == SCARD_AUTOALLOCATE)
1432 mszReaderNamesA = smartcard_convert_string_list(ret->mszReaderNames, cBytes, unicode);
1434 WLog_Print(log, g_LogLevel,
"Status%s_Return {", unicode ?
"W" :
"A");
1435 WLog_Print(log, g_LogLevel,
" ReturnCode: %s (0x%08" PRIX32
")",
1436 SCardGetErrorString(ret->ReturnCode),
1437 WINPR_CXX_COMPAT_CAST(UINT32, ret->ReturnCode));
1438 WLog_Print(log, g_LogLevel,
" dwState: %s (0x%08" PRIX32
") dwProtocol: %s (0x%08" PRIX32
")",
1439 SCardGetCardStateString(ret->dwState), ret->dwState,
1440 SCardGetProtocolString(ret->dwProtocol), ret->dwProtocol);
1442 WLog_Print(log, g_LogLevel,
" cBytes: %" PRIu32
" mszReaderNames: %s", ret->cBytes,
1445 smartcard_dump_array(log, g_LogLevel,
" cbAtrLen: %" PRIu32
" pbAtr: ",
"", ret->pbAtr,
1446 ret->cbAtrLen, ret->cbAtrLen);
1447 WLog_Print(log, g_LogLevel,
"}");
1448 free(mszReaderNamesA);
1451static void smartcard_trace_state_return(wLog* log,
const State_Return* ret)
1454 char* state =
nullptr;
1456 if (!WLog_IsLevelActive(log, g_LogLevel))
1459 state = SCardGetReaderStateString(ret->dwState);
1460 WLog_Print(log, g_LogLevel,
"Reconnect_Return {");
1461 WLog_Print(log, g_LogLevel,
" ReturnCode: %s (0x%08" PRIX32
")",
1462 SCardGetErrorString(ret->ReturnCode),
1463 WINPR_CXX_COMPAT_CAST(UINT32, ret->ReturnCode));
1464 WLog_Print(log, g_LogLevel,
" dwState: %s (0x%08" PRIX32
")", state, ret->dwState);
1465 WLog_Print(log, g_LogLevel,
" dwProtocol: %s (0x%08" PRIX32
")",
1466 SCardGetProtocolString(ret->dwProtocol), ret->dwProtocol);
1467 WLog_Print(log, g_LogLevel,
" cbAtrLen: (0x%08" PRIX32
")", ret->cbAtrLen);
1468 smartcard_dump_array(log, g_LogLevel,
" rgAtr: ",
"", ret->rgAtr,
sizeof(ret->rgAtr));
1469 WLog_Print(log, g_LogLevel,
"}");
1473static void smartcard_trace_reconnect_return(wLog* log,
const Reconnect_Return* ret)
1477 if (!WLog_IsLevelActive(log, g_LogLevel))
1480 WLog_Print(log, g_LogLevel,
"Reconnect_Return {");
1481 WLog_Print(log, g_LogLevel,
" ReturnCode: %s (0x%08" PRIX32
")",
1482 SCardGetErrorString(ret->ReturnCode),
1483 WINPR_CXX_COMPAT_CAST(UINT32, ret->ReturnCode));
1484 WLog_Print(log, g_LogLevel,
" dwActiveProtocol: %s (0x%08" PRIX32
")",
1485 SCardGetProtocolString(ret->dwActiveProtocol), ret->dwActiveProtocol);
1486 WLog_Print(log, g_LogLevel,
"}");
1489static void smartcard_trace_connect_a_call(wLog* log,
const ConnectA_Call* call)
1493 if (!WLog_IsLevelActive(log, g_LogLevel))
1496 WLog_Print(log, g_LogLevel,
"ConnectA_Call {");
1497 smartcard_log_context(log, &call->Common.handles.hContext);
1499 WLog_Print(log, g_LogLevel,
1500 "szReader: %s dwShareMode: %s (0x%08" PRIX32
1501 ") dwPreferredProtocols: %s (0x%08" PRIX32
")",
1502 call->szReader, SCardGetShareModeString(call->Common.dwShareMode),
1503 call->Common.dwShareMode, SCardGetProtocolString(call->Common.dwPreferredProtocols),
1504 call->Common.dwPreferredProtocols);
1505 WLog_Print(log, g_LogLevel,
"}");
1508static void smartcard_trace_connect_w_call(wLog* log,
const ConnectW_Call* call)
1511 char szReaderA[1024] = WINPR_C_ARRAY_INIT;
1513 if (!WLog_IsLevelActive(log, g_LogLevel))
1517 (void)ConvertWCharToUtf8(call->szReader, szReaderA, ARRAYSIZE(szReaderA));
1518 WLog_Print(log, g_LogLevel,
"ConnectW_Call {");
1519 smartcard_log_context(log, &call->Common.handles.hContext);
1521 WLog_Print(log, g_LogLevel,
1522 "szReader: %s dwShareMode: %s (0x%08" PRIX32
1523 ") dwPreferredProtocols: %s (0x%08" PRIX32
")",
1524 szReaderA, SCardGetShareModeString(call->Common.dwShareMode),
1525 call->Common.dwShareMode, SCardGetProtocolString(call->Common.dwPreferredProtocols),
1526 call->Common.dwPreferredProtocols);
1527 WLog_Print(log, g_LogLevel,
"}");
1530static void smartcard_trace_hcard_and_disposition_call(wLog* log,
1536 if (!WLog_IsLevelActive(log, g_LogLevel))
1539 WLog_Print(log, g_LogLevel,
"%s_Call {", name);
1540 smartcard_log_context(log, &call->handles.hContext);
1541 smartcard_log_redir_handle(log, &call->handles.hCard);
1543 WLog_Print(log, g_LogLevel,
"dwDisposition: %s (0x%08" PRIX32
")",
1544 SCardGetDispositionString(call->dwDisposition), call->dwDisposition);
1545 WLog_Print(log, g_LogLevel,
"}");
1552 if (!WLog_IsLevelActive(log, g_LogLevel))
1555 WLog_Print(log, g_LogLevel,
"EstablishContext_Call {");
1556 WLog_Print(log, g_LogLevel,
"dwScope: %s (0x%08" PRIX32
")", SCardGetScopeString(call->dwScope),
1558 WLog_Print(log, g_LogLevel,
"}");
1565 if (!WLog_IsLevelActive(log, g_LogLevel))
1568 WLog_Print(log, g_LogLevel,
"EstablishContext_Return {");
1569 WLog_Print(log, g_LogLevel,
" ReturnCode: %s (0x%08" PRIX32
")",
1570 SCardGetErrorString(ret->ReturnCode),
1571 WINPR_CXX_COMPAT_CAST(UINT32, ret->ReturnCode));
1572 smartcard_log_context(log, &ret->hContext);
1574 WLog_Print(log, g_LogLevel,
"}");
1577void smartcard_trace_long_return(
const Long_Return* ret,
const char* name)
1579 wLog* log = scard_log();
1580 smartcard_trace_long_return_int(log, ret, name);
1583void smartcard_trace_long_return_int(wLog* log,
const Long_Return* ret,
const char* name)
1587 if (!WLog_IsLevelActive(log, g_LogLevel))
1590 WLog_Print(log, g_LogLevel,
"%s_Return {", name);
1591 WLog_Print(log, g_LogLevel,
" ReturnCode: %s (0x%08" PRIX32
")",
1592 SCardGetErrorString(ret->ReturnCode),
1593 WINPR_CXX_COMPAT_CAST(UINT32, ret->ReturnCode));
1594 WLog_Print(log, g_LogLevel,
"}");
1597static void smartcard_trace_connect_return(wLog* log,
const Connect_Return* ret)
1601 if (!WLog_IsLevelActive(log, g_LogLevel))
1604 WLog_Print(log, g_LogLevel,
"Connect_Return {");
1605 WLog_Print(log, g_LogLevel,
" ReturnCode: %s (0x%08" PRIX32
")",
1606 SCardGetErrorString(ret->ReturnCode),
1607 WINPR_CXX_COMPAT_CAST(UINT32, ret->ReturnCode));
1608 smartcard_log_context(log, &ret->hContext);
1609 smartcard_log_redir_handle(log, &ret->hCard);
1611 WLog_Print(log, g_LogLevel,
" dwActiveProtocol: %s (0x%08" PRIX32
")",
1612 SCardGetProtocolString(ret->dwActiveProtocol), ret->dwActiveProtocol);
1613 WLog_Print(log, g_LogLevel,
"}");
1616static void smartcard_trace_reconnect_call(wLog* log,
const Reconnect_Call* call)
1620 if (!WLog_IsLevelActive(log, g_LogLevel))
1623 WLog_Print(log, g_LogLevel,
"Reconnect_Call {");
1624 smartcard_log_context(log, &call->handles.hContext);
1625 smartcard_log_redir_handle(log, &call->handles.hCard);
1627 WLog_Print(log, g_LogLevel,
1628 "dwShareMode: %s (0x%08" PRIX32
") dwPreferredProtocols: %s (0x%08" PRIX32
1629 ") dwInitialization: %s (0x%08" PRIX32
")",
1630 SCardGetShareModeString(call->dwShareMode), call->dwShareMode,
1631 SCardGetProtocolString(call->dwPreferredProtocols), call->dwPreferredProtocols,
1632 SCardGetDispositionString(call->dwInitialization), call->dwInitialization);
1633 WLog_Print(log, g_LogLevel,
"}");
1640 if (!WLog_IsLevelActive(log, g_LogLevel))
1643 WLog_Print(log, g_LogLevel,
"GetDeviceTypeId_Return {");
1644 WLog_Print(log, g_LogLevel,
" ReturnCode: %s (0x%08" PRIX32
")",
1645 SCardGetErrorString(ret->ReturnCode),
1646 WINPR_CXX_COMPAT_CAST(UINT32, ret->ReturnCode));
1647 WLog_Print(log, g_LogLevel,
" dwDeviceId=%08" PRIx32, ret->dwDeviceId);
1649 WLog_Print(log, g_LogLevel,
"}");
1652WINPR_ATTR_NODISCARD
static LONG
1654 CHAR** pszReaderName)
1657 UINT32 pbContextNdrPtr = 0;
1658 LONG status = smartcard_unpack_redir_scard_context(log, s, phContext, &index, &pbContextNdrPtr);
1659 if (status != SCARD_S_SUCCESS)
1662 if (!smartcard_ndr_pointer_read(log, s, &index,
nullptr))
1663 return ERROR_INVALID_DATA;
1665 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr, phContext);
1666 if (status != SCARD_S_SUCCESS)
1669 status = smartcard_ndr_read_a(log, s, pszReaderName, NDR_PTR_FULL);
1670 if (status != SCARD_S_SUCCESS)
1673 smartcard_trace_context_and_string_call_a(log, __func__, phContext, *pszReaderName);
1674 return SCARD_S_SUCCESS;
1677WINPR_ATTR_NODISCARD
static LONG
1679 WCHAR** pszReaderName)
1682 UINT32 pbContextNdrPtr = 0;
1684 LONG status = smartcard_unpack_redir_scard_context(log, s, phContext, &index, &pbContextNdrPtr);
1685 if (status != SCARD_S_SUCCESS)
1688 if (!smartcard_ndr_pointer_read(log, s, &index,
nullptr))
1689 return ERROR_INVALID_DATA;
1691 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr, phContext);
1692 if (status != SCARD_S_SUCCESS)
1695 status = smartcard_ndr_read_w(log, s, pszReaderName, NDR_PTR_FULL);
1696 if (status != SCARD_S_SUCCESS)
1699 smartcard_trace_context_and_string_call_w(log, __func__, phContext, *pszReaderName);
1700 return SCARD_S_SUCCESS;
1703LONG smartcard_unpack_common_type_header(
wStream* s)
1705 wLog* log = scard_log();
1708 UINT8 endianness = 0;
1709 UINT16 commonHeaderLength = 0;
1711 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 8))
1712 return STATUS_BUFFER_TOO_SMALL;
1715 Stream_Read_UINT8(s, version);
1716 Stream_Read_UINT8(s, endianness);
1717 Stream_Read_UINT16(s, commonHeaderLength);
1718 Stream_Read_UINT32(s, filler);
1722 WLog_Print(log, WLOG_WARN,
"Unsupported CommonTypeHeader Version %" PRIu8
"", version);
1723 return STATUS_INVALID_PARAMETER;
1726 if (endianness != 0x10)
1728 WLog_Print(log, WLOG_WARN,
"Unsupported CommonTypeHeader Endianness %" PRIu8
"",
1730 return STATUS_INVALID_PARAMETER;
1733 if (commonHeaderLength != 8)
1735 WLog_Print(log, WLOG_WARN,
"Unsupported CommonTypeHeader CommonHeaderLength %" PRIu16
"",
1736 commonHeaderLength);
1737 return STATUS_INVALID_PARAMETER;
1740 if (filler != 0xCCCCCCCC)
1742 WLog_Print(log, WLOG_WARN,
"Unexpected CommonTypeHeader Filler 0x%08" PRIX32
"", filler);
1743 return STATUS_INVALID_PARAMETER;
1746 return SCARD_S_SUCCESS;
1749void smartcard_pack_common_type_header(
wStream* s)
1751 Stream_Write_UINT8(s, 1);
1752 Stream_Write_UINT8(s, 0x10);
1753 Stream_Write_UINT16(s, 8);
1754 Stream_Write_UINT32(s, 0xCCCCCCCC);
1757LONG smartcard_unpack_private_type_header(
wStream* s)
1759 wLog* log = scard_log();
1761 UINT32 objectBufferLength = 0;
1763 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 8))
1764 return STATUS_BUFFER_TOO_SMALL;
1766 Stream_Read_UINT32(s, objectBufferLength);
1767 Stream_Read_UINT32(s, filler);
1769 if (filler != 0x00000000)
1771 WLog_Print(log, WLOG_WARN,
"Unexpected PrivateTypeHeader Filler 0x%08" PRIX32
"", filler);
1772 return STATUS_INVALID_PARAMETER;
1775 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, objectBufferLength))
1776 return STATUS_INVALID_PARAMETER;
1778 return SCARD_S_SUCCESS;
1781void smartcard_pack_private_type_header(
wStream* s, UINT32 objectBufferLength)
1783 Stream_Write_UINT32(s, objectBufferLength);
1784 Stream_Write_UINT32(s, 0x00000000);
1787LONG smartcard_unpack_read_size_align(
wStream* s,
size_t size, UINT32 alignment)
1789 const size_t padsize = (size + alignment - 1) & ~(alignment - 1);
1790 const size_t pad = padsize - size;
1794 if (!Stream_SafeSeek(s, pad))
1801LONG smartcard_pack_write_size_align(
wStream* s,
size_t size, UINT32 alignment)
1803 const size_t padsize = (size + alignment - 1) & ~(alignment - 1);
1804 const size_t pad = padsize - size;
1808 if (!Stream_EnsureRemainingCapacity(s, pad))
1810 wLog* log = scard_log();
1811 WLog_Print(log, WLOG_ERROR,
"Stream_EnsureRemainingCapacity failed!");
1812 return SCARD_F_INTERNAL_ERROR;
1815 Stream_Zero(s, pad);
1818 return SCARD_S_SUCCESS;
1821SCARDCONTEXT smartcard_scard_context_native_from_redir(
const REDIR_SCARDCONTEXT* context)
1823 SCARDCONTEXT hContext = WINPR_C_ARRAY_INIT;
1825 WINPR_ASSERT(context);
1826 if ((context->cbContext !=
sizeof(ULONG_PTR)) && (context->cbContext != 0))
1828 wLog* log = scard_log();
1829 WLog_Print(log, WLOG_WARN,
1830 "REDIR_SCARDCONTEXT does not match native size: Actual: %" PRIu32
1831 ", Expected: %" PRIuz
"",
1832 context->cbContext,
sizeof(ULONG_PTR));
1836 if (context->cbContext)
1837 CopyMemory(&hContext, &(context->pbContext), context->cbContext);
1842void smartcard_scard_context_native_to_redir(
REDIR_SCARDCONTEXT* context, SCARDCONTEXT hContext)
1844 WINPR_ASSERT(context);
1846 context->cbContext =
sizeof(ULONG_PTR);
1847 CopyMemory(&(context->pbContext), &hContext, context->cbContext);
1850SCARDHANDLE smartcard_scard_handle_native_from_redir(
const REDIR_SCARDHANDLE* handle)
1852 SCARDHANDLE hCard = 0;
1854 WINPR_ASSERT(handle);
1855 if (handle->cbHandle == 0)
1858 if (handle->cbHandle !=
sizeof(ULONG_PTR))
1860 wLog* log = scard_log();
1861 WLog_Print(log, WLOG_WARN,
1862 "REDIR_SCARDHANDLE does not match native size: Actual: %" PRIu32
1863 ", Expected: %" PRIuz
"",
1864 handle->cbHandle,
sizeof(ULONG_PTR));
1868 if (handle->cbHandle)
1869 CopyMemory(&hCard, &(handle->pbHandle), handle->cbHandle);
1874void smartcard_scard_handle_native_to_redir(
REDIR_SCARDHANDLE* handle, SCARDHANDLE hCard)
1876 WINPR_ASSERT(handle);
1878 handle->cbHandle =
sizeof(ULONG_PTR);
1879 CopyMemory(&(handle->pbHandle), &hCard, handle->cbHandle);
1882#define smartcard_context_supported(log, size) \
1883 smartcard_context_supported_((log), (size), __FILE__, __func__, __LINE__)
1884WINPR_ATTR_NODISCARD
static LONG smartcard_context_supported_(wLog* log, uint32_t size,
1885 const char* file,
const char* fkt,
1893 return SCARD_S_SUCCESS;
1896 const uint32_t level = WLOG_WARN;
1897 if (WLog_IsLevelActive(log, level))
1899 WLog_PrintTextMessage(log, level, line, file, fkt,
1900 "REDIR_SCARDCONTEXT length is not 0, 4 or 8: %" PRIu32
"",
1903 return STATUS_INVALID_PARAMETER;
1909 UINT32* index, UINT32* ppbContextNdrPtr,
1910 const char* file,
const char* function,
size_t line)
1912 UINT32 pbContextNdrPtr = 0;
1915 WINPR_ASSERT(context);
1919 if (!Stream_CheckAndLogRequiredLengthWLogEx(log, WLOG_WARN, s, 4, 1,
"%s(%s:%" PRIuz
")", file,
1921 return STATUS_BUFFER_TOO_SMALL;
1923 const LONG status = smartcard_context_supported_(log, context->cbContext, file, function, line);
1924 if (status != SCARD_S_SUCCESS)
1927 Stream_Read_UINT32(s, context->cbContext);
1929 if (!smartcard_ndr_pointer_read_(log, s, index, &pbContextNdrPtr, file, function, line))
1930 return ERROR_INVALID_DATA;
1932 if (((context->cbContext == 0) && pbContextNdrPtr) ||
1933 ((context->cbContext != 0) && !pbContextNdrPtr))
1935 WLog_Print(log, WLOG_WARN,
1936 "REDIR_SCARDCONTEXT cbContext (%" PRIu32
") pbContextNdrPtr (%" PRIu32
1938 context->cbContext, pbContextNdrPtr);
1939 return STATUS_INVALID_PARAMETER;
1942 *ppbContextNdrPtr = pbContextNdrPtr;
1943 return SCARD_S_SUCCESS;
1946LONG smartcard_pack_redir_scard_context(WINPR_ATTR_UNUSED wLog* log,
wStream* s,
1949 const UINT32 pbContextNdrPtr = 0x00020000 + *index * 4;
1951 WINPR_ASSERT(context);
1952 if (context->cbContext != 0)
1954 Stream_Write_UINT32(s, context->cbContext);
1955 Stream_Write_UINT32(s, pbContextNdrPtr);
1956 *index = *index + 1;
1961 return SCARD_S_SUCCESS;
1964LONG smartcard_unpack_redir_scard_context_ref(wLog* log,
wStream* s,
1965 WINPR_ATTR_UNUSED UINT32 pbContextNdrPtr,
1970 WINPR_ASSERT(context);
1972 if (context->cbContext == 0)
1973 return SCARD_S_SUCCESS;
1975 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
1976 return STATUS_BUFFER_TOO_SMALL;
1978 Stream_Read_UINT32(s, length);
1980 if (length != context->cbContext)
1982 WLog_Print(log, WLOG_WARN,
1983 "REDIR_SCARDCONTEXT length (%" PRIu32
") cbContext (%" PRIu32
") mismatch",
1984 length, context->cbContext);
1985 return STATUS_INVALID_PARAMETER;
1988 const LONG status = smartcard_context_supported(log, context->cbContext);
1989 if (status != SCARD_S_SUCCESS)
1992 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, context->cbContext))
1993 return STATUS_BUFFER_TOO_SMALL;
1995 if (context->cbContext)
1996 Stream_Read(s, &(context->pbContext), context->cbContext);
1998 ZeroMemory(&(context->pbContext),
sizeof(context->pbContext));
2000 return SCARD_S_SUCCESS;
2003LONG smartcard_pack_redir_scard_context_ref(WINPR_ATTR_UNUSED wLog* log,
wStream* s,
2006 WINPR_ASSERT(context);
2008 if (context->cbContext == 0)
2009 return SCARD_S_SUCCESS;
2011 Stream_Write_UINT32(s, context->cbContext);
2012 Stream_Write(s, &(context->pbContext), context->cbContext);
2014 return SCARD_S_SUCCESS;
2018 UINT32* index,
const char* file,
const char* function,
2021 UINT32 pbHandleNdrPtr = 0;
2023 WINPR_ASSERT(handle);
2026 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
2027 return STATUS_BUFFER_TOO_SMALL;
2029 Stream_Read_UINT32(s, handle->cbHandle);
2031 if (!smartcard_ndr_pointer_read_(log, s, index, &pbHandleNdrPtr, file, function, line))
2032 return ERROR_INVALID_DATA;
2034 if (((handle->cbHandle == 0) && pbHandleNdrPtr) ||
2035 ((handle->cbHandle != 0) && !pbHandleNdrPtr))
2037 WLog_Print(log, WLOG_WARN,
2038 "REDIR_SCARDHANDLE cbHandle (%" PRIu32
") pbHandleNdrPtr (%" PRIu32
2040 handle->cbHandle, pbHandleNdrPtr);
2041 return STATUS_INVALID_PARAMETER;
2044 return SCARD_S_SUCCESS;
2047LONG smartcard_pack_redir_scard_handle(WINPR_ATTR_UNUSED wLog* log,
wStream* s,
2050 const UINT32 pbContextNdrPtr = 0x00020000 + *index * 4;
2052 WINPR_ASSERT(handle);
2053 if (handle->cbHandle != 0)
2055 Stream_Write_UINT32(s, handle->cbHandle);
2056 Stream_Write_UINT32(s, pbContextNdrPtr);
2057 *index = *index + 1;
2061 return SCARD_S_SUCCESS;
2068 WINPR_ASSERT(handle);
2070 if (handle->cbHandle == 0)
2071 return SCARD_S_SUCCESS;
2073 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
2074 return STATUS_BUFFER_TOO_SMALL;
2076 Stream_Read_UINT32(s, length);
2078 if (length != handle->cbHandle)
2080 WLog_Print(log, WLOG_WARN,
2081 "REDIR_SCARDHANDLE length (%" PRIu32
") cbHandle (%" PRIu32
") mismatch", length,
2083 return STATUS_INVALID_PARAMETER;
2086 if ((handle->cbHandle != 4) && (handle->cbHandle != 8))
2088 WLog_Print(log, WLOG_WARN,
"REDIR_SCARDHANDLE length is not 4 or 8: %" PRIu32
"",
2090 return STATUS_INVALID_PARAMETER;
2093 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, handle->cbHandle))
2094 return STATUS_BUFFER_TOO_SMALL;
2096 if (handle->cbHandle)
2097 Stream_Read(s, &(handle->pbHandle), handle->cbHandle);
2099 return SCARD_S_SUCCESS;
2102LONG smartcard_pack_redir_scard_handle_ref(WINPR_ATTR_UNUSED wLog* log,
wStream* s,
2105 WINPR_ASSERT(handle);
2107 if (handle->cbHandle == 0)
2108 return SCARD_S_SUCCESS;
2110 Stream_Write_UINT32(s, handle->cbHandle);
2111 Stream_Write(s, &(handle->pbHandle), handle->cbHandle);
2113 return SCARD_S_SUCCESS;
2119 wLog* log = scard_log();
2121 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
2122 return STATUS_BUFFER_TOO_SMALL;
2124 Stream_Read_UINT32(s, call->dwScope);
2125 smartcard_trace_establish_context_call(log, call);
2126 return SCARD_S_SUCCESS;
2132 wLog* log = scard_log();
2134 smartcard_trace_establish_context_call(log, call);
2136 if (!Stream_EnsureRemainingCapacity(s, 4))
2137 return SCARD_E_NO_MEMORY;
2139 Stream_Write_UINT32(s, call->dwScope);
2141 return SCARD_S_SUCCESS;
2147 wLog* log = scard_log();
2151 smartcard_trace_establish_context_return(log, ret);
2152 if (ret->ReturnCode != SCARD_S_SUCCESS)
2153 return ret->ReturnCode;
2155 status = smartcard_pack_redir_scard_context(log, s, &(ret->hContext), &index);
2156 if (status != SCARD_S_SUCCESS)
2159 return smartcard_pack_redir_scard_context_ref(log, s, &(ret->hContext));
2165 wLog* log = scard_log();
2167 UINT32 pbContextNdrPtr = 0;
2170 smartcard_unpack_redir_scard_context(log, s, &(ret->hContext), &index, &pbContextNdrPtr);
2171 if (status != SCARD_S_SUCCESS)
2174 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr, &(ret->hContext));
2175 if (status != SCARD_S_SUCCESS)
2178 smartcard_trace_establish_context_return(log, ret);
2179 return SCARD_S_SUCCESS;
2185 UINT32 pbContextNdrPtr = 0;
2186 wLog* log = scard_log();
2189 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
2191 if (status != SCARD_S_SUCCESS)
2194 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
2195 &(call->handles.hContext));
2196 if (status != SCARD_S_SUCCESS)
2197 WLog_Print(log, WLOG_ERROR,
2198 "smartcard_unpack_redir_scard_context_ref failed with error %" PRId32
"",
2201 smartcard_trace_context_call(log, call, name);
2208 UINT32 pbContextNdrPtr = 0;
2209 wLog* log = scard_log();
2212 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
2215 if (status != SCARD_S_SUCCESS)
2218 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 8))
2219 return STATUS_BUFFER_TOO_SMALL;
2221 Stream_Read_INT32(s, call->fmszGroupsIsNULL);
2222 Stream_Read_UINT32(s, call->cchGroups);
2223 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
2224 &(call->handles.hContext));
2226 if (status != SCARD_S_SUCCESS)
2229 smartcard_trace_list_reader_groups_call(log, call, unicode);
2230 return SCARD_S_SUCCESS;
2237 wLog* log = scard_log();
2240 smartcard_trace_list_reader_groups_call(log, call, unicode);
2242 LONG status = smartcard_pack_redir_scard_context(log, s, &call->handles.hContext, &index);
2243 if (status != SCARD_S_SUCCESS)
2246 if (!Stream_EnsureRemainingCapacity(s, 8))
2247 return SCARD_E_NO_MEMORY;
2249 Stream_Write_INT32(s, call->fmszGroupsIsNULL);
2250 Stream_Write_UINT32(s, call->cchGroups);
2252 return smartcard_pack_redir_scard_context_ref(log, s, &call->handles.hContext);
2259 wLog* log = scard_log();
2261 UINT32 cBytes = ret->cBytes;
2264 smartcard_trace_list_reader_groups_return(log, ret, unicode);
2265 if (ret->ReturnCode != SCARD_S_SUCCESS)
2267 if (cBytes == SCARD_AUTOALLOCATE)
2270 if (!Stream_EnsureRemainingCapacity(s, 4))
2271 return SCARD_E_NO_MEMORY;
2273 Stream_Write_UINT32(s, cBytes);
2274 if (!smartcard_ndr_pointer_write(s, &index, cBytes))
2275 return SCARD_E_NO_MEMORY;
2277 status = smartcard_ndr_write(s, ret->msz, cBytes, 1, NDR_PTR_SIMPLE);
2278 if (status != SCARD_S_SUCCESS)
2280 return ret->ReturnCode;
2287 wLog* log = scard_log();
2289 UINT32 mszNdrPtr = 0;
2291 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
2292 return STATUS_BUFFER_TOO_SMALL;
2294 const UINT32 cBytes = Stream_Get_UINT32(s);
2296 if (!smartcard_ndr_pointer_read(log, s, &index, &mszNdrPtr))
2297 return ERROR_INVALID_DATA;
2301 LONG status = smartcard_ndr_read(log, s, &ret->msz, cBytes, 1, NDR_PTR_SIMPLE);
2302 if (status != SCARD_S_SUCCESS)
2304 ret->cBytes = cBytes;
2307 smartcard_trace_list_reader_groups_return(log, ret, unicode);
2308 return SCARD_S_SUCCESS;
2314 UINT32 mszGroupsNdrPtr = 0;
2315 UINT32 pbContextNdrPtr = 0;
2316 wLog* log = scard_log();
2319 call->mszGroups =
nullptr;
2321 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
2323 if (status != SCARD_S_SUCCESS)
2326 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
2327 return STATUS_BUFFER_TOO_SMALL;
2329 const UINT32 cBytes = Stream_Get_UINT32(s);
2330 if (!smartcard_ndr_pointer_read(log, s, &index, &mszGroupsNdrPtr))
2331 return ERROR_INVALID_DATA;
2333 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 8))
2334 return STATUS_BUFFER_TOO_SMALL;
2335 Stream_Read_INT32(s, call->fmszReadersIsNULL);
2336 Stream_Read_UINT32(s, call->cchReaders);
2338 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
2339 &(call->handles.hContext));
2340 if (status != SCARD_S_SUCCESS)
2343 if (mszGroupsNdrPtr)
2345 status = smartcard_ndr_read(log, s, &call->mszGroups, cBytes, 1, NDR_PTR_SIMPLE);
2346 if (status != SCARD_S_SUCCESS)
2348 call->cBytes = cBytes;
2351 smartcard_trace_list_readers_call(log, call, unicode);
2352 return SCARD_S_SUCCESS;
2358 wLog* log = scard_log();
2361 UINT32 size = ret->cBytes;
2363 smartcard_trace_list_readers_return(log, ret, unicode);
2364 if (ret->ReturnCode != SCARD_S_SUCCESS)
2367 if (!Stream_EnsureRemainingCapacity(s, 4))
2369 WLog_Print(log, WLOG_ERROR,
"Stream_EnsureRemainingCapacity failed!");
2370 return SCARD_F_INTERNAL_ERROR;
2373 Stream_Write_UINT32(s, size);
2374 if (!smartcard_ndr_pointer_write(s, &index, size))
2375 return SCARD_E_NO_MEMORY;
2377 status = smartcard_ndr_write(s, ret->msz, size, 1, NDR_PTR_SIMPLE);
2378 if (status != SCARD_S_SUCCESS)
2380 return ret->ReturnCode;
2383WINPR_ATTR_NODISCARD
static LONG smartcard_unpack_connect_common(wLog* log,
wStream* s,
2386 UINT32* ppbContextNdrPtr)
2388 WINPR_ASSERT(common);
2389 LONG status = smartcard_unpack_redir_scard_context(log, s, &(common->handles.hContext), index,
2391 if (status != SCARD_S_SUCCESS)
2394 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 8))
2395 return STATUS_BUFFER_TOO_SMALL;
2397 Stream_Read_UINT32(s, common->dwShareMode);
2398 Stream_Read_UINT32(s, common->dwPreferredProtocols);
2399 return SCARD_S_SUCCESS;
2406 UINT32 pbContextNdrPtr = 0;
2409 wLog* log = scard_log();
2411 call->szReader =
nullptr;
2413 if (!smartcard_ndr_pointer_read(log, s, &index,
nullptr))
2414 return ERROR_INVALID_DATA;
2416 status = smartcard_unpack_connect_common(log, s, &(call->Common), &index, &pbContextNdrPtr);
2417 if (status != SCARD_S_SUCCESS)
2419 WLog_Print(log, WLOG_ERROR,
"smartcard_unpack_connect_common failed with error %" PRId32
"",
2424 status = smartcard_ndr_read_a(log, s, &call->szReader, NDR_PTR_FULL);
2425 if (status != SCARD_S_SUCCESS)
2428 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
2429 &(call->Common.handles.hContext));
2430 if (status != SCARD_S_SUCCESS)
2431 WLog_Print(log, WLOG_ERROR,
2432 "smartcard_unpack_redir_scard_context_ref failed with error %" PRId32
"",
2435 smartcard_trace_connect_a_call(log, call);
2443 UINT32 pbContextNdrPtr = 0;
2446 wLog* log = scard_log();
2447 call->szReader =
nullptr;
2449 if (!smartcard_ndr_pointer_read(log, s, &index,
nullptr))
2450 return ERROR_INVALID_DATA;
2452 status = smartcard_unpack_connect_common(log, s, &(call->Common), &index, &pbContextNdrPtr);
2453 if (status != SCARD_S_SUCCESS)
2455 WLog_Print(log, WLOG_ERROR,
"smartcard_unpack_connect_common failed with error %" PRId32
"",
2460 status = smartcard_ndr_read_w(log, s, &call->szReader, NDR_PTR_FULL);
2461 if (status != SCARD_S_SUCCESS)
2464 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
2465 &(call->Common.handles.hContext));
2466 if (status != SCARD_S_SUCCESS)
2467 WLog_Print(log, WLOG_ERROR,
2468 "smartcard_unpack_redir_scard_context_ref failed with error %" PRId32
"",
2471 smartcard_trace_connect_w_call(log, call);
2481 wLog* log = scard_log();
2482 smartcard_trace_connect_return(log, ret);
2484 status = smartcard_pack_redir_scard_context(log, s, &ret->hContext, &index);
2485 if (status != SCARD_S_SUCCESS)
2488 status = smartcard_pack_redir_scard_handle(log, s, &ret->hCard, &index);
2489 if (status != SCARD_S_SUCCESS)
2492 if (!Stream_EnsureRemainingCapacity(s, 4))
2493 return SCARD_E_NO_MEMORY;
2495 Stream_Write_UINT32(s, ret->dwActiveProtocol);
2496 status = smartcard_pack_redir_scard_context_ref(log, s, &ret->hContext);
2497 if (status != SCARD_S_SUCCESS)
2499 return smartcard_pack_redir_scard_handle_ref(log, s, &(ret->hCard));
2505 UINT32 pbContextNdrPtr = 0;
2508 wLog* log = scard_log();
2509 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
2511 if (status != SCARD_S_SUCCESS)
2514 status = smartcard_unpack_redir_scard_handle(log, s, &(call->handles.hCard), &index);
2515 if (status != SCARD_S_SUCCESS)
2518 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 12))
2519 return STATUS_BUFFER_TOO_SMALL;
2521 Stream_Read_UINT32(s, call->dwShareMode);
2522 Stream_Read_UINT32(s, call->dwPreferredProtocols);
2523 Stream_Read_UINT32(s, call->dwInitialization);
2525 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
2526 &(call->handles.hContext));
2527 if (status != SCARD_S_SUCCESS)
2529 WLog_Print(log, WLOG_ERROR,
2530 "smartcard_unpack_redir_scard_context_ref failed with error %" PRId32
"",
2535 status = smartcard_unpack_redir_scard_handle_ref(log, s, &(call->handles.hCard));
2536 if (status != SCARD_S_SUCCESS)
2537 WLog_Print(log, WLOG_ERROR,
2538 "smartcard_unpack_redir_scard_handle_ref failed with error %" PRId32
"", status);
2540 smartcard_trace_reconnect_call(log, call);
2547 wLog* log = scard_log();
2550 smartcard_trace_reconnect_call(log, call);
2552 LONG status = smartcard_pack_redir_scard_context(log, s, &call->handles.hContext, &index);
2553 if (status != SCARD_S_SUCCESS)
2556 status = smartcard_pack_redir_scard_handle(log, s, &call->handles.hCard, &index);
2557 if (status != SCARD_S_SUCCESS)
2560 if (!Stream_EnsureRemainingCapacity(s, 12))
2561 return SCARD_E_NO_MEMORY;
2563 Stream_Write_UINT32(s, call->dwShareMode);
2564 Stream_Write_UINT32(s, call->dwPreferredProtocols);
2565 Stream_Write_UINT32(s, call->dwInitialization);
2567 status = smartcard_pack_redir_scard_context_ref(log, s, &call->handles.hContext);
2568 if (status != SCARD_S_SUCCESS)
2571 return smartcard_pack_redir_scard_handle_ref(log, s, &call->handles.hCard);
2577 wLog* log = scard_log();
2578 smartcard_trace_reconnect_return(log, ret);
2580 if (!Stream_EnsureRemainingCapacity(s, 4))
2581 return SCARD_E_NO_MEMORY;
2582 Stream_Write_UINT32(s, ret->dwActiveProtocol);
2583 return ret->ReturnCode;
2589 wLog* log = scard_log();
2591 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
2592 return STATUS_BUFFER_TOO_SMALL;
2594 Stream_Read_UINT32(s, ret->dwActiveProtocol);
2596 smartcard_trace_reconnect_return(log, ret);
2597 return SCARD_S_SUCCESS;
2604 UINT32 pbContextNdrPtr = 0;
2607 wLog* log = scard_log();
2609 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
2611 if (status != SCARD_S_SUCCESS)
2614 status = smartcard_unpack_redir_scard_handle(log, s, &(call->handles.hCard), &index);
2615 if (status != SCARD_S_SUCCESS)
2618 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
2619 return STATUS_BUFFER_TOO_SMALL;
2621 Stream_Read_UINT32(s, call->dwDisposition);
2623 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
2624 &(call->handles.hContext));
2625 if (status != SCARD_S_SUCCESS)
2628 status = smartcard_unpack_redir_scard_handle_ref(log, s, &(call->handles.hCard));
2629 if (status != SCARD_S_SUCCESS)
2632 smartcard_trace_hcard_and_disposition_call(log, call, name);
2640 if (!WLog_IsLevelActive(log, g_LogLevel))
2643 WLog_Print(log, g_LogLevel,
"GetStatusChangeA_Call {");
2644 smartcard_log_context(log, &call->handles.hContext);
2646 WLog_Print(log, g_LogLevel,
"dwTimeOut: 0x%08" PRIX32
" cReaders: %" PRIu32
"", call->dwTimeOut,
2649 dump_reader_states_a(log, call->rgReaderStates, call->cReaders);
2651 WLog_Print(log, g_LogLevel,
"}");
2654WINPR_ATTR_NODISCARD
static LONG smartcard_unpack_reader_state_a(wLog* log,
wStream* s,
2656 UINT32 cReaders, UINT32* ptrIndex)
2658 LONG status = SCARD_E_NO_MEMORY;
2660 WINPR_ASSERT(ppcReaders || (cReaders == 0));
2661 if (cReaders > UINT8_MAX)
2663 WLog_Print(log, WLOG_ERROR,
2664 "Too many readers(%" PRIu32
"), rejecting request. Limited to <= %d", cReaders,
2666 return SCARD_E_WRITE_TOO_MANY;
2669 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
2672 const UINT32 len = Stream_Get_UINT32(s);
2673 if (len != cReaders)
2675 WLog_Print(log, WLOG_ERROR,
"Count mismatch when reading LPSCARD_READERSTATEA");
2681 BOOL* states = calloc(cReaders,
sizeof(BOOL));
2682 if (!rgReaderStates || !states)
2684 status = ERROR_INVALID_DATA;
2686 for (UINT32 index = 0; index < cReaders; index++)
2688 UINT32 ptr = UINT32_MAX;
2691 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 52))
2694 if (!smartcard_ndr_pointer_read(log, s, ptrIndex, &ptr))
2700 states[index] = ptr != 0;
2701 Stream_Read_UINT32(s, readerState->dwCurrentState);
2702 Stream_Read_UINT32(s, readerState->dwEventState);
2703 Stream_Read_UINT32(s, readerState->cbAtr);
2704 if (readerState->cbAtr > ARRAYSIZE(readerState->rgbAtr))
2706 WLog_Print(log, WLOG_ERROR,
2707 "SCARD_READERSTATEA[%" PRIu32
"]::cbAtr %" PRIu32
" exceeds %" PRIuz, index,
2708 readerState->cbAtr, (
size_t)ARRAYSIZE(readerState->rgbAtr));
2711 Stream_Read(s, readerState->rgbAtr, 36);
2714 for (UINT32 index = 0; index < cReaders; index++)
2721 status = smartcard_ndr_read_a(log, s, &readerState->szReader, NDR_PTR_FULL);
2722 if (status != SCARD_S_SUCCESS)
2726 *ppcReaders = rgReaderStates;
2728 return SCARD_S_SUCCESS;
2732 for (UINT32 index = 0; index < cReaders; index++)
2735 free(readerState->szReader);
2738 free(rgReaderStates);
2743WINPR_ATTR_NODISCARD
static LONG smartcard_unpack_reader_state_w(wLog* log,
wStream* s,
2745 UINT32 cReaders, UINT32* ptrIndex)
2747 LONG status = SCARD_E_NO_MEMORY;
2749 WINPR_ASSERT(ppcReaders || (cReaders == 0));
2751 if (cReaders > UINT8_MAX)
2753 WLog_Print(log, WLOG_ERROR,
2754 "Too many readers(%" PRIu32
"), rejecting request. Limited to <= %d", cReaders,
2756 return SCARD_E_WRITE_TOO_MANY;
2759 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
2762 const UINT32 len = Stream_Get_UINT32(s);
2763 if (len != cReaders)
2765 WLog_Print(log, WLOG_ERROR,
"Count mismatch when reading LPSCARD_READERSTATEW");
2771 BOOL* states = calloc(cReaders,
sizeof(BOOL));
2773 if (!rgReaderStates || !states)
2776 status = ERROR_INVALID_DATA;
2777 for (UINT32 index = 0; index < cReaders; index++)
2779 UINT32 ptr = UINT32_MAX;
2782 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 52))
2785 if (!smartcard_ndr_pointer_read(log, s, ptrIndex, &ptr))
2791 states[index] = ptr != 0;
2792 Stream_Read_UINT32(s, readerState->dwCurrentState);
2793 Stream_Read_UINT32(s, readerState->dwEventState);
2794 Stream_Read_UINT32(s, readerState->cbAtr);
2795 if (readerState->cbAtr > ARRAYSIZE(readerState->rgbAtr))
2797 WLog_Print(log, WLOG_ERROR,
2798 "SCARD_READERSTATEW[%" PRIu32
"]::cbAtr %" PRIu32
" exceeds %" PRIuz, index,
2799 readerState->cbAtr, (
size_t)ARRAYSIZE(readerState->rgbAtr));
2802 Stream_Read(s, readerState->rgbAtr, 36);
2805 for (UINT32 index = 0; index < cReaders; index++)
2813 status = smartcard_ndr_read_w(log, s, &readerState->szReader, NDR_PTR_FULL);
2814 if (status != SCARD_S_SUCCESS)
2818 *ppcReaders = rgReaderStates;
2820 return SCARD_S_SUCCESS;
2824 for (UINT32 index = 0; index < cReaders; index++)
2827 free(readerState->szReader);
2830 free(rgReaderStates);
2843 UINT32 pbContextNdrPtr = 0;
2846 wLog* log = scard_log();
2848 call->rgReaderStates =
nullptr;
2850 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
2852 if (status != SCARD_S_SUCCESS)
2855 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 8))
2856 return STATUS_BUFFER_TOO_SMALL;
2858 Stream_Read_UINT32(s, call->dwTimeOut);
2859 const UINT32 cReaders = Stream_Get_UINT32(s);
2860 if (!smartcard_ndr_pointer_read(log, s, &index, &ndrPtr))
2861 return ERROR_INVALID_DATA;
2863 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
2864 &(call->handles.hContext));
2865 if (status != SCARD_S_SUCCESS)
2870 status = smartcard_unpack_reader_state_a(log, s, &call->rgReaderStates, cReaders, &index);
2871 if (status != SCARD_S_SUCCESS)
2873 call->cReaders = cReaders;
2877 WLog_Print(log, WLOG_WARN,
"ndrPtr=0x%08" PRIx32
", can not read rgReaderStates", ndrPtr);
2878 return SCARD_E_UNEXPECTED;
2881 smartcard_trace_get_status_change_a_call(log, call);
2882 return SCARD_S_SUCCESS;
2889 UINT32 pbContextNdrPtr = 0;
2892 wLog* log = scard_log();
2893 call->rgReaderStates =
nullptr;
2895 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
2897 if (status != SCARD_S_SUCCESS)
2900 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 8))
2901 return STATUS_BUFFER_TOO_SMALL;
2903 Stream_Read_UINT32(s, call->dwTimeOut);
2904 const UINT32 cReaders = Stream_Get_UINT32(s);
2905 if (!smartcard_ndr_pointer_read(log, s, &index, &ndrPtr))
2906 return ERROR_INVALID_DATA;
2908 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
2909 &(call->handles.hContext));
2910 if (status != SCARD_S_SUCCESS)
2915 status = smartcard_unpack_reader_state_w(log, s, &call->rgReaderStates, cReaders, &index);
2916 if (status != SCARD_S_SUCCESS)
2918 call->cReaders = cReaders;
2922 WLog_Print(log, WLOG_WARN,
"ndrPtr=0x%08" PRIx32
", can not read rgReaderStates", ndrPtr);
2923 return SCARD_E_UNEXPECTED;
2926 smartcard_trace_get_status_change_w_call(log, call);
2927 return SCARD_S_SUCCESS;
2934 wLog* log = scard_log();
2937 UINT32 cReaders = ret->cReaders;
2940 smartcard_trace_get_status_change_return(log, ret, unicode);
2941 if ((ret->ReturnCode != SCARD_S_SUCCESS) && (ret->ReturnCode != SCARD_E_TIMEOUT))
2943 if (cReaders == SCARD_AUTOALLOCATE)
2946 if (!Stream_EnsureRemainingCapacity(s, 4))
2947 return SCARD_E_NO_MEMORY;
2949 Stream_Write_UINT32(s, cReaders);
2950 if (!smartcard_ndr_pointer_write(s, &index, cReaders))
2951 return SCARD_E_NO_MEMORY;
2952 status = smartcard_ndr_write_state(s, ret->rgReaderStates, cReaders, NDR_PTR_SIMPLE);
2953 if (status != SCARD_S_SUCCESS)
2955 return ret->ReturnCode;
2961 UINT32 pbContextNdrPtr = 0;
2963 wLog* log = scard_log();
2966 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
2968 if (status != SCARD_S_SUCCESS)
2971 status = smartcard_unpack_redir_scard_handle(log, s, &(call->handles.hCard), &index);
2972 if (status != SCARD_S_SUCCESS)
2975 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 8))
2976 return STATUS_BUFFER_TOO_SMALL;
2978 Stream_Read_INT32(s, call->fpbAtrIsNULL);
2979 Stream_Read_UINT32(s, call->cbAtrLen);
2981 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
2982 &(call->handles.hContext));
2983 if (status != SCARD_S_SUCCESS)
2986 status = smartcard_unpack_redir_scard_handle_ref(log, s, &(call->handles.hCard));
2987 if (status != SCARD_S_SUCCESS)
2996 wLog* log = scard_log();
2998 UINT32 cbAtrLen = ret->cbAtrLen;
3001 smartcard_trace_state_return(log, ret);
3002 if (ret->ReturnCode != SCARD_S_SUCCESS)
3004 if (cbAtrLen == SCARD_AUTOALLOCATE)
3007 Stream_Write_UINT32(s, ret->dwState);
3008 Stream_Write_UINT32(s, ret->dwProtocol);
3009 Stream_Write_UINT32(s, cbAtrLen);
3010 if (!smartcard_ndr_pointer_write(s, &index, cbAtrLen))
3011 return SCARD_E_NO_MEMORY;
3012 status = smartcard_ndr_write(s, ret->rgAtr, cbAtrLen, 1, NDR_PTR_SIMPLE);
3013 if (status != SCARD_S_SUCCESS)
3015 return ret->ReturnCode;
3021 UINT32 pbContextNdrPtr = 0;
3024 wLog* log = scard_log();
3026 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
3028 if (status != SCARD_S_SUCCESS)
3031 status = smartcard_unpack_redir_scard_handle(log, s, &(call->handles.hCard), &index);
3032 if (status != SCARD_S_SUCCESS)
3035 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 12))
3036 return STATUS_BUFFER_TOO_SMALL;
3038 Stream_Read_INT32(s, call->fmszReaderNamesIsNULL);
3039 Stream_Read_UINT32(s, call->cchReaderLen);
3040 Stream_Read_UINT32(s, call->cbAtrLen);
3042 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
3043 &(call->handles.hContext));
3044 if (status != SCARD_S_SUCCESS)
3047 status = smartcard_unpack_redir_scard_handle_ref(log, s, &(call->handles.hCard));
3048 if (status != SCARD_S_SUCCESS)
3051 smartcard_trace_status_call(log, call, unicode);
3058 wLog* log = scard_log();
3061 smartcard_trace_status_call(log, call, unicode);
3063 LONG status = smartcard_pack_redir_scard_context(log, s, &call->handles.hContext, &index);
3064 if (status != SCARD_S_SUCCESS)
3067 status = smartcard_pack_redir_scard_handle(log, s, &call->handles.hCard, &index);
3068 if (status != SCARD_S_SUCCESS)
3071 if (!Stream_EnsureRemainingCapacity(s, 12))
3072 return SCARD_E_NO_MEMORY;
3074 Stream_Write_INT32(s, call->fmszReaderNamesIsNULL);
3075 Stream_Write_UINT32(s, call->cchReaderLen);
3076 Stream_Write_UINT32(s, call->cbAtrLen);
3078 status = smartcard_pack_redir_scard_context_ref(log, s, &call->handles.hContext);
3079 if (status != SCARD_S_SUCCESS)
3082 return smartcard_pack_redir_scard_handle_ref(log, s, &call->handles.hCard);
3088 wLog* log = scard_log();
3092 UINT32 cBytes = ret->cBytes;
3094 smartcard_trace_status_return(log, ret, unicode);
3095 if (ret->ReturnCode != SCARD_S_SUCCESS)
3097 if (cBytes == SCARD_AUTOALLOCATE)
3100 if (!Stream_EnsureRemainingCapacity(s, 4))
3101 return SCARD_F_INTERNAL_ERROR;
3103 Stream_Write_UINT32(s, cBytes);
3104 if (!smartcard_ndr_pointer_write(s, &index, cBytes))
3105 return SCARD_E_NO_MEMORY;
3107 if (!Stream_EnsureRemainingCapacity(s, 44))
3108 return SCARD_F_INTERNAL_ERROR;
3110 Stream_Write_UINT32(s, ret->dwState);
3111 Stream_Write_UINT32(s, ret->dwProtocol);
3112 Stream_Write(s, ret->pbAtr,
sizeof(ret->pbAtr));
3113 Stream_Write_UINT32(s, ret->cbAtrLen);
3114 status = smartcard_ndr_write(s, ret->mszReaderNames, cBytes, 1, NDR_PTR_SIMPLE);
3115 if (status != SCARD_S_SUCCESS)
3117 return ret->ReturnCode;
3123 wLog* log = scard_log();
3125 UINT32 mszNdrPtr = 0;
3127 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
3128 return STATUS_BUFFER_TOO_SMALL;
3130 const UINT32 cBytes = Stream_Get_UINT32(s);
3132 if (!smartcard_ndr_pointer_read(log, s, &index, &mszNdrPtr))
3133 return ERROR_INVALID_DATA;
3135 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 44))
3136 return STATUS_BUFFER_TOO_SMALL;
3138 Stream_Read_UINT32(s, ret->dwState);
3139 Stream_Read_UINT32(s, ret->dwProtocol);
3140 Stream_Read(s, ret->pbAtr,
sizeof(ret->pbAtr));
3141 Stream_Read_UINT32(s, ret->cbAtrLen);
3143 if (ret->cbAtrLen > ARRAYSIZE(ret->pbAtr))
3145 WLog_Print(log, WLOG_ERROR,
"Status_Return::cbAtrLen %" PRIu32
" exceeds %" PRIuz,
3146 ret->cbAtrLen, ARRAYSIZE(ret->pbAtr));
3147 return SCARD_E_INVALID_ATR;
3152 LONG status = smartcard_ndr_read(log, s, &ret->mszReaderNames, cBytes, 1, NDR_PTR_SIMPLE);
3153 if (status != SCARD_S_SUCCESS)
3155 ret->cBytes = cBytes;
3158 smartcard_trace_status_return(log, ret, unicode);
3159 return SCARD_S_SUCCESS;
3165 wLog* log = scard_log();
3167 UINT32 pbContextNdrPtr = 0;
3169 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
3171 if (status != SCARD_S_SUCCESS)
3174 status = smartcard_unpack_redir_scard_handle(log, s, &(call->handles.hCard), &index);
3175 if (status != SCARD_S_SUCCESS)
3178 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 12))
3179 return STATUS_BUFFER_TOO_SMALL;
3181 Stream_Read_UINT32(s, call->dwAttrId);
3182 Stream_Read_INT32(s, call->fpbAttrIsNULL);
3183 Stream_Read_UINT32(s, call->cbAttrLen);
3185 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
3186 &(call->handles.hContext));
3187 if (status != SCARD_S_SUCCESS)
3190 status = smartcard_unpack_redir_scard_handle_ref(log, s, &(call->handles.hCard));
3191 if (status != SCARD_S_SUCCESS)
3194 smartcard_trace_get_attrib_call(log, call);
3199 DWORD cbAttrCallLen)
3202 wLog* log = scard_log();
3204 UINT32 cbAttrLen = 0;
3206 smartcard_trace_get_attrib_return(log, ret, dwAttrId);
3208 if (!Stream_EnsureRemainingCapacity(s, 4))
3209 return SCARD_F_INTERNAL_ERROR;
3211 cbAttrLen = ret->cbAttrLen;
3212 if (ret->ReturnCode != SCARD_S_SUCCESS)
3214 if (cbAttrLen == SCARD_AUTOALLOCATE)
3219 if (cbAttrCallLen < cbAttrLen)
3220 cbAttrLen = cbAttrCallLen;
3222 Stream_Write_UINT32(s, cbAttrLen);
3223 if (!smartcard_ndr_pointer_write(s, &index, cbAttrLen))
3224 return SCARD_E_NO_MEMORY;
3226 status = smartcard_ndr_write(s, ret->pbAttr, cbAttrLen, 1, NDR_PTR_SIMPLE);
3227 if (status != SCARD_S_SUCCESS)
3229 return ret->ReturnCode;
3235 wLog* log = scard_log();
3238 UINT32 pvInBufferNdrPtr = 0;
3239 UINT32 pbContextNdrPtr = 0;
3241 call->pvInBuffer =
nullptr;
3243 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
3245 if (status != SCARD_S_SUCCESS)
3248 status = smartcard_unpack_redir_scard_handle(log, s, &(call->handles.hCard), &index);
3249 if (status != SCARD_S_SUCCESS)
3252 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 20))
3253 return STATUS_BUFFER_TOO_SMALL;
3255 Stream_Read_UINT32(s, call->dwControlCode);
3256 const UINT32 cbInBufferSize = Stream_Get_UINT32(s);
3257 if (!smartcard_ndr_pointer_read(log, s, &index,
3259 return ERROR_INVALID_DATA;
3260 Stream_Read_INT32(s, call->fpvOutBufferIsNULL);
3261 Stream_Read_UINT32(s, call->cbOutBufferSize);
3263 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
3264 &(call->handles.hContext));
3265 if (status != SCARD_S_SUCCESS)
3268 status = smartcard_unpack_redir_scard_handle_ref(log, s, &(call->handles.hCard));
3269 if (status != SCARD_S_SUCCESS)
3272 if (pvInBufferNdrPtr)
3274 status = smartcard_ndr_read(log, s, &call->pvInBuffer, cbInBufferSize, 1, NDR_PTR_SIMPLE);
3275 if (status != SCARD_S_SUCCESS)
3277 call->cbInBufferSize = cbInBufferSize;
3280 smartcard_trace_control_call(log, call);
3281 return SCARD_S_SUCCESS;
3287 wLog* log = scard_log();
3290 UINT32 cbDataLen = ret->cbOutBufferSize;
3293 smartcard_trace_control_return(log, ret);
3294 if (ret->ReturnCode != SCARD_S_SUCCESS)
3296 if (cbDataLen == SCARD_AUTOALLOCATE)
3299 if (!Stream_EnsureRemainingCapacity(s, 4))
3300 return SCARD_F_INTERNAL_ERROR;
3302 Stream_Write_UINT32(s, cbDataLen);
3303 if (!smartcard_ndr_pointer_write(s, &index, cbDataLen))
3304 return SCARD_E_NO_MEMORY;
3306 status = smartcard_ndr_write(s, ret->pvOutBuffer, cbDataLen, 1, NDR_PTR_SIMPLE);
3307 if (status != SCARD_S_SUCCESS)
3309 return ret->ReturnCode;
3315 BYTE* pbExtraBytes =
nullptr;
3316 UINT32 pbExtraBytesNdrPtr = 0;
3317 UINT32 pbSendBufferNdrPtr = 0;
3318 UINT32 pioRecvPciNdrPtr = 0;
3322 UINT32 pbContextNdrPtr = 0;
3325 wLog* log = scard_log();
3327 call->pioSendPci =
nullptr;
3328 call->pioRecvPci =
nullptr;
3329 call->pbSendBuffer =
nullptr;
3331 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
3333 if (status != SCARD_S_SUCCESS)
3336 status = smartcard_unpack_redir_scard_handle(log, s, &(call->handles.hCard), &index);
3337 if (status != SCARD_S_SUCCESS)
3340 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 32))
3341 return STATUS_BUFFER_TOO_SMALL;
3343 Stream_Read_UINT32(s, ioSendPci.dwProtocol);
3344 Stream_Read_UINT32(s, ioSendPci.cbExtraBytes);
3345 if (!smartcard_ndr_pointer_read(log, s, &index,
3346 &pbExtraBytesNdrPtr))
3347 return ERROR_INVALID_DATA;
3349 const UINT32 cbSendLength = Stream_Get_UINT32(s);
3350 if (!smartcard_ndr_pointer_read(log, s, &index,
3351 &pbSendBufferNdrPtr))
3352 return ERROR_INVALID_DATA;
3354 if (!smartcard_ndr_pointer_read(log, s, &index,
3356 return ERROR_INVALID_DATA;
3358 Stream_Read_INT32(s, call->fpbRecvBufferIsNULL);
3359 Stream_Read_UINT32(s, call->cbRecvLength);
3361 if (ioSendPci.cbExtraBytes > 1024)
3363 WLog_Print(log, WLOG_WARN,
3364 "Transmit_Call ioSendPci.cbExtraBytes is out of bounds: %" PRIu32
" (max: 1024)",
3365 ioSendPci.cbExtraBytes);
3366 return STATUS_INVALID_PARAMETER;
3369 if (cbSendLength > 66560)
3371 WLog_Print(log, WLOG_WARN,
3372 "Transmit_Call cbSendLength is out of bounds: %" PRIu32
" (max: 66560)",
3373 ioSendPci.cbExtraBytes);
3374 return STATUS_INVALID_PARAMETER;
3377 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
3378 &(call->handles.hContext));
3379 if (status != SCARD_S_SUCCESS)
3382 status = smartcard_unpack_redir_scard_handle_ref(log, s, &(call->handles.hCard));
3383 if (status != SCARD_S_SUCCESS)
3386 if (ioSendPci.cbExtraBytes && !pbExtraBytesNdrPtr)
3390 "Transmit_Call ioSendPci.cbExtraBytes is non-zero but pbExtraBytesNdrPtr is null");
3391 return STATUS_INVALID_PARAMETER;
3394 if (pbExtraBytesNdrPtr)
3397 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
3398 return STATUS_BUFFER_TOO_SMALL;
3400 Stream_Read_UINT32(s, length);
3402 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, ioSendPci.cbExtraBytes))
3403 return STATUS_BUFFER_TOO_SMALL;
3405 ioSendPci.pbExtraBytes = Stream_Pointer(s);
3409 if (!call->pioSendPci)
3411 WLog_Print(log, WLOG_WARN,
"Transmit_Call out of memory error (pioSendPci)");
3412 return STATUS_NO_MEMORY;
3415 call->pioSendPci->dwProtocol = ioSendPci.dwProtocol;
3416 call->pioSendPci->cbPciLength = (DWORD)(ioSendPci.cbExtraBytes +
sizeof(
SCARD_IO_REQUEST));
3418 Stream_Read(s, pbExtraBytes, ioSendPci.cbExtraBytes);
3419 if (smartcard_unpack_read_size_align(s, ioSendPci.cbExtraBytes, 4) < 0)
3420 return STATUS_INVALID_PARAMETER;
3426 if (!call->pioSendPci)
3428 WLog_Print(log, WLOG_WARN,
"Transmit_Call out of memory error (pioSendPci)");
3429 return STATUS_NO_MEMORY;
3432 call->pioSendPci->dwProtocol = ioSendPci.dwProtocol;
3436 if (pbSendBufferNdrPtr)
3438 status = smartcard_ndr_read(log, s, &call->pbSendBuffer, cbSendLength, 1, NDR_PTR_SIMPLE);
3439 if (status != SCARD_S_SUCCESS)
3441 call->cbSendLength = cbSendLength;
3444 if (pioRecvPciNdrPtr)
3446 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 12))
3447 return STATUS_BUFFER_TOO_SMALL;
3449 Stream_Read_UINT32(s, ioRecvPci.dwProtocol);
3450 Stream_Read_UINT32(s, ioRecvPci.cbExtraBytes);
3451 if (!smartcard_ndr_pointer_read(log, s, &index,
3452 &pbExtraBytesNdrPtr))
3453 return ERROR_INVALID_DATA;
3455 if (ioRecvPci.cbExtraBytes && !pbExtraBytesNdrPtr)
3459 "Transmit_Call ioRecvPci.cbExtraBytes is non-zero but pbExtraBytesNdrPtr is null");
3460 return STATUS_INVALID_PARAMETER;
3463 if (pbExtraBytesNdrPtr)
3466 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
3467 return STATUS_BUFFER_TOO_SMALL;
3469 Stream_Read_UINT32(s, length);
3471 if (ioRecvPci.cbExtraBytes > 1024)
3473 WLog_Print(log, WLOG_WARN,
3474 "Transmit_Call ioRecvPci.cbExtraBytes is out of bounds: %" PRIu32
3476 ioRecvPci.cbExtraBytes);
3477 return STATUS_INVALID_PARAMETER;
3480 if (length != ioRecvPci.cbExtraBytes)
3482 WLog_Print(log, WLOG_WARN,
3483 "Transmit_Call unexpected length: Actual: %" PRIu32
3484 ", Expected: %" PRIu32
" (ioRecvPci.cbExtraBytes)",
3485 length, ioRecvPci.cbExtraBytes);
3486 return STATUS_INVALID_PARAMETER;
3489 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, ioRecvPci.cbExtraBytes))
3490 return STATUS_BUFFER_TOO_SMALL;
3492 ioRecvPci.pbExtraBytes = Stream_Pointer(s);
3496 if (!call->pioRecvPci)
3498 WLog_Print(log, WLOG_WARN,
"Transmit_Call out of memory error (pioRecvPci)");
3499 return STATUS_NO_MEMORY;
3502 call->pioRecvPci->dwProtocol = ioRecvPci.dwProtocol;
3503 call->pioRecvPci->cbPciLength =
3506 Stream_Read(s, pbExtraBytes, ioRecvPci.cbExtraBytes);
3507 if (smartcard_unpack_read_size_align(s, ioRecvPci.cbExtraBytes, 4) < 0)
3508 return STATUS_INVALID_PARAMETER;
3514 if (!call->pioRecvPci)
3516 WLog_Print(log, WLOG_WARN,
"Transmit_Call out of memory error (pioRecvPci)");
3517 return STATUS_NO_MEMORY;
3520 call->pioRecvPci->dwProtocol = ioRecvPci.dwProtocol;
3525 smartcard_trace_transmit_call(log, call);
3526 return SCARD_S_SUCCESS;
3532 wLog* log = scard_log();
3537 UINT32 cbRecvLength = ret->cbRecvLength;
3538 UINT32 cbRecvPci = ret->pioRecvPci ? ret->pioRecvPci->cbPciLength : 0;
3540 smartcard_trace_transmit_return(log, ret);
3542 if (!ret->pbRecvBuffer)
3545 if (!smartcard_ndr_pointer_write(s, &index, cbRecvPci))
3546 return SCARD_E_NO_MEMORY;
3547 if (!Stream_EnsureRemainingCapacity(s, 4))
3548 return SCARD_E_NO_MEMORY;
3549 Stream_Write_UINT32(s, cbRecvLength);
3550 if (!smartcard_ndr_pointer_write(s, &index, cbRecvLength))
3551 return SCARD_E_NO_MEMORY;
3553 if (ret->pioRecvPci)
3555 UINT32 cbExtraBytes = (UINT32)(ret->pioRecvPci->cbPciLength -
sizeof(
SCARD_IO_REQUEST));
3558 if (!Stream_EnsureRemainingCapacity(s, cbExtraBytes + 16))
3560 WLog_Print(log, WLOG_ERROR,
"Stream_EnsureRemainingCapacity failed!");
3561 return SCARD_F_INTERNAL_ERROR;
3564 Stream_Write_UINT32(s, ret->pioRecvPci->dwProtocol);
3565 Stream_Write_UINT32(s, cbExtraBytes);
3566 if (!smartcard_ndr_pointer_write(s, &index, cbExtraBytes))
3567 return SCARD_E_NO_MEMORY;
3568 error = smartcard_ndr_write(s, pbExtraBytes, cbExtraBytes, 1, NDR_PTR_SIMPLE);
3573 status = smartcard_ndr_write(s, ret->pbRecvBuffer, ret->cbRecvLength, 1, NDR_PTR_SIMPLE);
3574 if (status != SCARD_S_SUCCESS)
3576 return ret->ReturnCode;
3581 UINT32 rgReaderStatesNdrPtr = 0;
3582 UINT32 rgAtrMasksNdrPtr = 0;
3584 UINT32 pbContextNdrPtr = 0;
3587 wLog* log = scard_log();
3589 call->rgReaderStates =
nullptr;
3591 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
3593 if (status != SCARD_S_SUCCESS)
3596 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 16))
3597 return STATUS_BUFFER_TOO_SMALL;
3599 Stream_Read_UINT32(s, call->cAtrs);
3600 if (!smartcard_ndr_pointer_read(log, s, &index, &rgAtrMasksNdrPtr))
3601 return ERROR_INVALID_DATA;
3602 const UINT32 cReaders = Stream_Get_UINT32(s);
3603 if (!smartcard_ndr_pointer_read(log, s, &index, &rgReaderStatesNdrPtr))
3604 return ERROR_INVALID_DATA;
3606 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
3607 &(call->handles.hContext));
3608 if (status != SCARD_S_SUCCESS)
3611 if ((rgAtrMasksNdrPtr && !call->cAtrs) || (!rgAtrMasksNdrPtr && call->cAtrs))
3613 WLog_Print(log, WLOG_WARN,
3614 "LocateCardsByATRA_Call rgAtrMasksNdrPtr (0x%08" PRIX32
3615 ") and cAtrs (0x%08" PRIX32
") inconsistency",
3616 rgAtrMasksNdrPtr, call->cAtrs);
3617 return STATUS_INVALID_PARAMETER;
3620 if (rgAtrMasksNdrPtr)
3622 status = smartcard_ndr_read_atrmask(log, s, &call->rgAtrMasks, call->cAtrs, NDR_PTR_SIMPLE);
3623 if (status != SCARD_S_SUCCESS)
3627 if (rgReaderStatesNdrPtr)
3629 status = smartcard_unpack_reader_state_a(log, s, &call->rgReaderStates, cReaders, &index);
3630 if (status != SCARD_S_SUCCESS)
3632 call->cReaders = cReaders;
3635 smartcard_trace_locate_cards_by_atr_a_call(log, call);
3636 return SCARD_S_SUCCESS;
3641 UINT32 sz1NdrPtr = 0;
3642 UINT32 sz2NdrPtr = 0;
3644 UINT32 pbContextNdrPtr = 0;
3647 wLog* log = scard_log();
3649 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
3651 if (status != SCARD_S_SUCCESS)
3654 if (!smartcard_ndr_pointer_read(log, s, &index, &sz1NdrPtr))
3655 return ERROR_INVALID_DATA;
3656 if (!smartcard_ndr_pointer_read(log, s, &index, &sz2NdrPtr))
3657 return ERROR_INVALID_DATA;
3660 smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr, &call->handles.hContext);
3661 if (status != SCARD_S_SUCCESS)
3666 status = smartcard_ndr_read_a(log, s, &call->sz1, NDR_PTR_FULL);
3667 if (status != SCARD_S_SUCCESS)
3672 status = smartcard_ndr_read_a(log, s, &call->sz2, NDR_PTR_FULL);
3673 if (status != SCARD_S_SUCCESS)
3676 smartcard_trace_context_and_two_strings_a_call(log, call);
3677 return SCARD_S_SUCCESS;
3682 UINT32 sz1NdrPtr = 0;
3683 UINT32 sz2NdrPtr = 0;
3685 UINT32 pbContextNdrPtr = 0;
3688 wLog* log = scard_log();
3690 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
3692 if (status != SCARD_S_SUCCESS)
3695 if (!smartcard_ndr_pointer_read(log, s, &index, &sz1NdrPtr))
3696 return ERROR_INVALID_DATA;
3697 if (!smartcard_ndr_pointer_read(log, s, &index, &sz2NdrPtr))
3698 return ERROR_INVALID_DATA;
3701 smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr, &call->handles.hContext);
3702 if (status != SCARD_S_SUCCESS)
3707 status = smartcard_ndr_read_w(log, s, &call->sz1, NDR_PTR_FULL);
3708 if (status != SCARD_S_SUCCESS)
3713 status = smartcard_ndr_read_w(log, s, &call->sz2, NDR_PTR_FULL);
3714 if (status != SCARD_S_SUCCESS)
3717 smartcard_trace_context_and_two_strings_w_call(log, call);
3718 return SCARD_S_SUCCESS;
3723 UINT32 sz1NdrPtr = 0;
3724 UINT32 sz2NdrPtr = 0;
3726 UINT32 pbContextNdrPtr = 0;
3729 wLog* log = scard_log();
3731 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
3733 if (status != SCARD_S_SUCCESS)
3736 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 16))
3737 return STATUS_BUFFER_TOO_SMALL;
3739 const UINT32 cBytes = Stream_Get_UINT32(s);
3740 if (!smartcard_ndr_pointer_read(log, s, &index, &sz1NdrPtr))
3741 return ERROR_INVALID_DATA;
3743 const UINT32 cReaders = Stream_Get_UINT32(s);
3744 if (!smartcard_ndr_pointer_read(log, s, &index, &sz2NdrPtr))
3745 return ERROR_INVALID_DATA;
3747 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
3748 &(call->handles.hContext));
3749 if (status != SCARD_S_SUCCESS)
3754 status = smartcard_ndr_read_fixed_string_a(log, s, &call->mszCards, cBytes, NDR_PTR_SIMPLE);
3755 if (status != SCARD_S_SUCCESS)
3757 call->cBytes = cBytes;
3761 status = smartcard_unpack_reader_state_a(log, s, &call->rgReaderStates, cReaders, &index);
3762 if (status != SCARD_S_SUCCESS)
3764 call->cReaders = cReaders;
3766 smartcard_trace_locate_cards_a_call(log, call);
3767 return SCARD_S_SUCCESS;
3772 UINT32 sz1NdrPtr = 0;
3773 UINT32 sz2NdrPtr = 0;
3775 UINT32 pbContextNdrPtr = 0;
3778 wLog* log = scard_log();
3780 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
3782 if (status != SCARD_S_SUCCESS)
3785 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 16))
3786 return STATUS_BUFFER_TOO_SMALL;
3788 const UINT32 cBytes = Stream_Get_UINT32(s);
3789 if (!smartcard_ndr_pointer_read(log, s, &index, &sz1NdrPtr))
3790 return ERROR_INVALID_DATA;
3792 const UINT32 cReaders = Stream_Get_UINT32(s);
3793 if (!smartcard_ndr_pointer_read(log, s, &index, &sz2NdrPtr))
3794 return ERROR_INVALID_DATA;
3796 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
3797 &(call->handles.hContext));
3798 if (status != SCARD_S_SUCCESS)
3803 status = smartcard_ndr_read_fixed_string_w(log, s, &call->mszCards, cBytes, NDR_PTR_SIMPLE);
3804 if (status != SCARD_S_SUCCESS)
3806 call->cBytes = cBytes;
3810 status = smartcard_unpack_reader_state_w(log, s, &call->rgReaderStates, cReaders, &index);
3811 if (status != SCARD_S_SUCCESS)
3813 call->cReaders = cReaders;
3815 smartcard_trace_locate_cards_w_call(log, call);
3816 return SCARD_S_SUCCESS;
3823 UINT32 pbContextNdrPtr = 0;
3826 wLog* log = scard_log();
3828 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
3830 if (status != SCARD_S_SUCCESS)
3832 status = smartcard_unpack_redir_scard_handle(log, s, &(call->handles.hCard), &index);
3833 if (status != SCARD_S_SUCCESS)
3836 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 12))
3837 return STATUS_BUFFER_TOO_SMALL;
3838 Stream_Read_UINT32(s, call->dwAttrId);
3839 Stream_Read_UINT32(s, call->cbAttrLen);
3841 if (!smartcard_ndr_pointer_read(log, s, &index, &ndrPtr))
3842 return ERROR_INVALID_DATA;
3844 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
3845 &(call->handles.hContext));
3846 if (status != SCARD_S_SUCCESS)
3849 status = smartcard_unpack_redir_scard_handle_ref(log, s, &(call->handles.hCard));
3850 if (status != SCARD_S_SUCCESS)
3856 status = smartcard_ndr_read_ex(log, s, &call->pbAttr, 0, 1, NDR_PTR_SIMPLE, &len);
3857 if (status != SCARD_S_SUCCESS)
3859 if (call->cbAttrLen > len)
3860 call->cbAttrLen = WINPR_ASSERTING_INT_CAST(DWORD, len);
3863 call->cbAttrLen = 0;
3864 smartcard_trace_set_attrib_call(log, call);
3865 return SCARD_S_SUCCESS;
3871 wLog* log = scard_log();
3874 smartcard_trace_set_attrib_call(log, call);
3876 LONG status = smartcard_pack_redir_scard_context(log, s, &call->handles.hContext, &index);
3877 if (status != SCARD_S_SUCCESS)
3880 status = smartcard_pack_redir_scard_handle(log, s, &call->handles.hCard, &index);
3881 if (status != SCARD_S_SUCCESS)
3884 if (!Stream_EnsureRemainingCapacity(s, 8))
3885 return SCARD_E_NO_MEMORY;
3887 Stream_Write_UINT32(s, call->dwAttrId);
3888 Stream_Write_UINT32(s, call->cbAttrLen);
3890 if (!smartcard_ndr_pointer_write(s, &index, call->cbAttrLen))
3891 return SCARD_E_NO_MEMORY;
3893 status = smartcard_pack_redir_scard_context_ref(log, s, &call->handles.hContext);
3894 if (status != SCARD_S_SUCCESS)
3897 status = smartcard_pack_redir_scard_handle_ref(log, s, &call->handles.hCard);
3898 if (status != SCARD_S_SUCCESS)
3901 status = smartcard_ndr_write(s, call->pbAttr, call->cbAttrLen, 1, NDR_PTR_SIMPLE);
3902 if (status != SCARD_S_SUCCESS)
3905 return SCARD_S_SUCCESS;
3910 UINT32 rgReaderStatesNdrPtr = 0;
3911 UINT32 rgAtrMasksNdrPtr = 0;
3913 UINT32 pbContextNdrPtr = 0;
3916 wLog* log = scard_log();
3918 call->rgReaderStates =
nullptr;
3920 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
3922 if (status != SCARD_S_SUCCESS)
3925 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 16))
3926 return STATUS_BUFFER_TOO_SMALL;
3928 Stream_Read_UINT32(s, call->cAtrs);
3929 if (!smartcard_ndr_pointer_read(log, s, &index, &rgAtrMasksNdrPtr))
3930 return ERROR_INVALID_DATA;
3932 const UINT32 cReaders = Stream_Get_UINT32(s);
3933 if (!smartcard_ndr_pointer_read(log, s, &index, &rgReaderStatesNdrPtr))
3934 return ERROR_INVALID_DATA;
3936 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
3937 &(call->handles.hContext));
3938 if (status != SCARD_S_SUCCESS)
3941 if ((rgAtrMasksNdrPtr && !call->cAtrs) || (!rgAtrMasksNdrPtr && call->cAtrs))
3943 WLog_Print(log, WLOG_WARN,
3944 "LocateCardsByATRW_Call rgAtrMasksNdrPtr (0x%08" PRIX32
3945 ") and cAtrs (0x%08" PRIX32
") inconsistency",
3946 rgAtrMasksNdrPtr, call->cAtrs);
3947 return STATUS_INVALID_PARAMETER;
3950 if (rgAtrMasksNdrPtr)
3952 status = smartcard_ndr_read_atrmask(log, s, &call->rgAtrMasks, call->cAtrs, NDR_PTR_SIMPLE);
3953 if (status != SCARD_S_SUCCESS)
3957 if (rgReaderStatesNdrPtr)
3959 status = smartcard_unpack_reader_state_w(log, s, &call->rgReaderStates, cReaders, &index);
3960 if (status != SCARD_S_SUCCESS)
3962 call->cReaders = cReaders;
3965 smartcard_trace_locate_cards_by_atr_w_call(log, call);
3966 return SCARD_S_SUCCESS;
3971 UINT32 mszNdrPtr = 0;
3972 UINT32 contextNdrPtr = 0;
3974 UINT32 pbContextNdrPtr = 0;
3977 wLog* log = scard_log();
3979 if (!smartcard_ndr_pointer_read(log, s, &index, &mszNdrPtr))
3980 return ERROR_INVALID_DATA;
3982 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->Common.handles.hContext),
3983 &index, &pbContextNdrPtr);
3984 if (status != SCARD_S_SUCCESS)
3987 if (!smartcard_ndr_pointer_read(log, s, &index, &contextNdrPtr))
3988 return ERROR_INVALID_DATA;
3990 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 12))
3991 return STATUS_BUFFER_TOO_SMALL;
3992 Stream_Read_UINT32(s, call->Common.FreshnessCounter);
3993 Stream_Read_INT32(s, call->Common.fPbDataIsNULL);
3994 Stream_Read_UINT32(s, call->Common.cbDataLen);
3996 call->szLookupName =
nullptr;
3999 status = smartcard_ndr_read_a(log, s, &call->szLookupName, NDR_PTR_FULL);
4000 if (status != SCARD_S_SUCCESS)
4004 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
4005 &call->Common.handles.hContext);
4006 if (status != SCARD_S_SUCCESS)
4011 status = smartcard_ndr_read_u(log, s, &call->Common.CardIdentifier);
4012 if (status != SCARD_S_SUCCESS)
4015 smartcard_trace_read_cache_a_call(log, call);
4016 return SCARD_S_SUCCESS;
4021 UINT32 mszNdrPtr = 0;
4022 UINT32 contextNdrPtr = 0;
4024 UINT32 pbContextNdrPtr = 0;
4027 wLog* log = scard_log();
4029 if (!smartcard_ndr_pointer_read(log, s, &index, &mszNdrPtr))
4030 return ERROR_INVALID_DATA;
4032 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->Common.handles.hContext),
4033 &index, &pbContextNdrPtr);
4034 if (status != SCARD_S_SUCCESS)
4037 if (!smartcard_ndr_pointer_read(log, s, &index, &contextNdrPtr))
4038 return ERROR_INVALID_DATA;
4040 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 12))
4041 return STATUS_BUFFER_TOO_SMALL;
4042 Stream_Read_UINT32(s, call->Common.FreshnessCounter);
4043 Stream_Read_INT32(s, call->Common.fPbDataIsNULL);
4044 Stream_Read_UINT32(s, call->Common.cbDataLen);
4046 call->szLookupName =
nullptr;
4049 status = smartcard_ndr_read_w(log, s, &call->szLookupName, NDR_PTR_FULL);
4050 if (status != SCARD_S_SUCCESS)
4054 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
4055 &call->Common.handles.hContext);
4056 if (status != SCARD_S_SUCCESS)
4061 status = smartcard_ndr_read_u(log, s, &call->Common.CardIdentifier);
4062 if (status != SCARD_S_SUCCESS)
4065 smartcard_trace_read_cache_w_call(log, call);
4066 return SCARD_S_SUCCESS;
4071 UINT32 mszNdrPtr = 0;
4072 UINT32 contextNdrPtr = 0;
4073 UINT32 pbDataNdrPtr = 0;
4075 UINT32 pbContextNdrPtr = 0;
4078 wLog* log = scard_log();
4080 if (!smartcard_ndr_pointer_read(log, s, &index, &mszNdrPtr))
4081 return ERROR_INVALID_DATA;
4083 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->Common.handles.hContext),
4084 &index, &pbContextNdrPtr);
4085 if (status != SCARD_S_SUCCESS)
4088 if (!smartcard_ndr_pointer_read(log, s, &index, &contextNdrPtr))
4089 return ERROR_INVALID_DATA;
4091 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 8))
4092 return STATUS_BUFFER_TOO_SMALL;
4094 Stream_Read_UINT32(s, call->Common.FreshnessCounter);
4095 const UINT32 cbDataLen = Stream_Get_UINT32(s);
4097 if (!smartcard_ndr_pointer_read(log, s, &index, &pbDataNdrPtr))
4098 return ERROR_INVALID_DATA;
4100 call->szLookupName =
nullptr;
4103 status = smartcard_ndr_read_a(log, s, &call->szLookupName, NDR_PTR_FULL);
4104 if (status != SCARD_S_SUCCESS)
4108 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
4109 &call->Common.handles.hContext);
4110 if (status != SCARD_S_SUCCESS)
4113 call->Common.CardIdentifier =
nullptr;
4116 status = smartcard_ndr_read_u(log, s, &call->Common.CardIdentifier);
4117 if (status != SCARD_S_SUCCESS)
4121 call->Common.pbData =
nullptr;
4124 status = smartcard_ndr_read(log, s, &call->Common.pbData, cbDataLen, 1, NDR_PTR_SIMPLE);
4125 if (status != SCARD_S_SUCCESS)
4127 call->Common.cbDataLen = cbDataLen;
4129 smartcard_trace_write_cache_a_call(log, call);
4130 return SCARD_S_SUCCESS;
4135 UINT32 mszNdrPtr = 0;
4136 UINT32 contextNdrPtr = 0;
4137 UINT32 pbDataNdrPtr = 0;
4139 UINT32 pbContextNdrPtr = 0;
4142 wLog* log = scard_log();
4144 if (!smartcard_ndr_pointer_read(log, s, &index, &mszNdrPtr))
4145 return ERROR_INVALID_DATA;
4147 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->Common.handles.hContext),
4148 &index, &pbContextNdrPtr);
4149 if (status != SCARD_S_SUCCESS)
4152 if (!smartcard_ndr_pointer_read(log, s, &index, &contextNdrPtr))
4153 return ERROR_INVALID_DATA;
4155 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 8))
4156 return STATUS_BUFFER_TOO_SMALL;
4157 Stream_Read_UINT32(s, call->Common.FreshnessCounter);
4158 const UINT32 cbDataLen = Stream_Get_UINT32(s);
4160 if (!smartcard_ndr_pointer_read(log, s, &index, &pbDataNdrPtr))
4161 return ERROR_INVALID_DATA;
4163 call->szLookupName =
nullptr;
4166 status = smartcard_ndr_read_w(log, s, &call->szLookupName, NDR_PTR_FULL);
4167 if (status != SCARD_S_SUCCESS)
4171 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
4172 &call->Common.handles.hContext);
4173 if (status != SCARD_S_SUCCESS)
4176 call->Common.CardIdentifier =
nullptr;
4179 status = smartcard_ndr_read_u(log, s, &call->Common.CardIdentifier);
4180 if (status != SCARD_S_SUCCESS)
4184 call->Common.pbData =
nullptr;
4187 status = smartcard_ndr_read(log, s, &call->Common.pbData, cbDataLen, 1, NDR_PTR_SIMPLE);
4188 if (status != SCARD_S_SUCCESS)
4190 call->Common.cbDataLen = cbDataLen;
4192 smartcard_trace_write_cache_w_call(log, call);
4199 wLog* log = scard_log();
4202 UINT32 pbContextNdrPtr = 0;
4204 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
4206 if (status != SCARD_S_SUCCESS)
4209 status = smartcard_unpack_redir_scard_handle(log, s, &(call->handles.hCard), &index);
4210 if (status != SCARD_S_SUCCESS)
4213 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
4214 &(call->handles.hContext));
4215 if (status != SCARD_S_SUCCESS)
4217 WLog_Print(log, WLOG_ERROR,
4218 "smartcard_unpack_redir_scard_context_ref failed with error %" PRId32
"",
4223 status = smartcard_unpack_redir_scard_handle_ref(log, s, &(call->handles.hCard));
4224 if (status != SCARD_S_SUCCESS)
4225 WLog_Print(log, WLOG_ERROR,
4226 "smartcard_unpack_redir_scard_handle_ref failed with error %" PRId32
"", status);
4228 smartcard_trace_get_transmit_count_call(log, call);
4235 wLog* log = scard_log();
4236 return smartcard_unpack_common_context_and_string_w(log, s, &call->handles.hContext,
4237 &call->szReaderName);
4243 wLog* log = scard_log();
4244 return smartcard_unpack_common_context_and_string_a(log, s, &call->handles.hContext, &call->sz);
4250 wLog* log = scard_log();
4251 return smartcard_unpack_common_context_and_string_w(log, s, &call->handles.hContext, &call->sz);
4257 wLog* log = scard_log();
4258 return smartcard_unpack_common_context_and_string_w(log, s, &call->handles.hContext,
4259 &call->szReaderName);
4265 wLog* log = scard_log();
4266 smartcard_trace_device_type_id_return(log, ret);
4268 if (!Stream_EnsureRemainingCapacity(s, 4))
4270 WLog_Print(log, WLOG_ERROR,
"Stream_EnsureRemainingCapacity failed!");
4271 return SCARD_F_INTERNAL_ERROR;
4274 Stream_Write_UINT32(s, ret->dwDeviceId);
4276 return ret->ReturnCode;
4282 wLog* log = scard_log();
4285 UINT32 cbDataLen = ret->cReaders;
4288 smartcard_trace_locate_cards_return(log, ret);
4289 if (ret->ReturnCode != SCARD_S_SUCCESS)
4291 if (cbDataLen == SCARD_AUTOALLOCATE)
4294 if (!Stream_EnsureRemainingCapacity(s, 4))
4296 WLog_Print(log, WLOG_ERROR,
"Stream_EnsureRemainingCapacity failed!");
4297 return SCARD_F_INTERNAL_ERROR;
4300 Stream_Write_UINT32(s, cbDataLen);
4301 if (!smartcard_ndr_pointer_write(s, &index, cbDataLen))
4302 return SCARD_E_NO_MEMORY;
4304 status = smartcard_ndr_write_state(s, ret->rgReaderStates, cbDataLen, NDR_PTR_SIMPLE);
4305 if (status != SCARD_S_SUCCESS)
4307 return ret->ReturnCode;
4313 wLog* log = scard_log();
4317 UINT32 cbDataLen = ret->cbDataLen;
4318 smartcard_trace_get_reader_icon_return(log, ret);
4319 if (ret->ReturnCode != SCARD_S_SUCCESS)
4321 if (cbDataLen == SCARD_AUTOALLOCATE)
4324 if (!Stream_EnsureRemainingCapacity(s, 4))
4326 WLog_Print(log, WLOG_ERROR,
"Stream_EnsureRemainingCapacity failed!");
4327 return SCARD_F_INTERNAL_ERROR;
4330 Stream_Write_UINT32(s, cbDataLen);
4331 if (!smartcard_ndr_pointer_write(s, &index, cbDataLen))
4332 return SCARD_E_NO_MEMORY;
4334 status = smartcard_ndr_write(s, ret->pbData, cbDataLen, 1, NDR_PTR_SIMPLE);
4335 if (status != SCARD_S_SUCCESS)
4337 return ret->ReturnCode;
4343 wLog* log = scard_log();
4345 smartcard_trace_get_transmit_count_return(log, ret);
4347 if (!Stream_EnsureRemainingCapacity(s, 4))
4349 WLog_Print(log, WLOG_ERROR,
"Stream_EnsureRemainingCapacity failed!");
4350 return SCARD_F_INTERNAL_ERROR;
4353 Stream_Write_UINT32(s, ret->cTransmitCount);
4355 return ret->ReturnCode;
4361 wLog* log = scard_log();
4365 UINT32 cbDataLen = ret->cbDataLen;
4366 smartcard_trace_read_cache_return(log, ret);
4367 if (ret->ReturnCode != SCARD_S_SUCCESS)
4370 if (cbDataLen == SCARD_AUTOALLOCATE)
4373 if (!Stream_EnsureRemainingCapacity(s, 4))
4375 WLog_Print(log, WLOG_ERROR,
"Stream_EnsureRemainingCapacity failed!");
4376 return SCARD_F_INTERNAL_ERROR;
4379 Stream_Write_UINT32(s, cbDataLen);
4380 if (!smartcard_ndr_pointer_write(s, &index, cbDataLen))
4381 return SCARD_E_NO_MEMORY;
4383 status = smartcard_ndr_write(s, ret->pbData, cbDataLen, 1, NDR_PTR_SIMPLE);
4384 if (status != SCARD_S_SUCCESS)
4386 return ret->ReturnCode;
4392 wLog* log = scard_log();
4395 smartcard_trace_context_call(log, call, name);
4397 LONG status = smartcard_pack_redir_scard_context(log, s, &call->handles.hContext, &index);
4398 if (status != SCARD_S_SUCCESS)
4401 return smartcard_pack_redir_scard_context_ref(log, s, &call->handles.hContext);
4407 wLog* log = scard_log();
4410 smartcard_trace_list_readers_call(log, call, unicode);
4412 LONG status = smartcard_pack_redir_scard_context(log, s, &call->handles.hContext, &index);
4413 if (status != SCARD_S_SUCCESS)
4416 if (!Stream_EnsureRemainingCapacity(s, 4))
4417 return SCARD_E_NO_MEMORY;
4419 Stream_Write_UINT32(s, call->cBytes);
4420 if (!smartcard_ndr_pointer_write(s, &index, call->cBytes))
4421 return SCARD_E_NO_MEMORY;
4423 if (!Stream_EnsureRemainingCapacity(s, 8))
4424 return SCARD_E_NO_MEMORY;
4426 Stream_Write_INT32(s, call->fmszReadersIsNULL);
4427 Stream_Write_UINT32(s, call->cchReaders);
4429 status = smartcard_pack_redir_scard_context_ref(log, s, &call->handles.hContext);
4430 if (status != SCARD_S_SUCCESS)
4433 if (call->cBytes > 0)
4435 status = smartcard_ndr_write(s, call->mszGroups, call->cBytes, 1, NDR_PTR_SIMPLE);
4436 if (status != SCARD_S_SUCCESS)
4440 return SCARD_S_SUCCESS;
4443WINPR_ATTR_NODISCARD
static LONG
4445 UINT32 cReaders, UINT32* ptrIndex)
4447 WINPR_ASSERT(rgReaderStates || (cReaders == 0));
4449 if (!Stream_EnsureRemainingCapacity(s, 4))
4450 return SCARD_E_NO_MEMORY;
4452 Stream_Write_UINT32(s, cReaders);
4454 for (UINT32 i = 0; i < cReaders; i++)
4458 if (!Stream_EnsureRemainingCapacity(s, 52))
4459 return SCARD_E_NO_MEMORY;
4461 const UINT32 nameLen = state->szReader ? (UINT32)(strlen(state->szReader) + 1) : 0;
4462 if (!smartcard_ndr_pointer_write(s, ptrIndex, nameLen))
4463 return SCARD_E_NO_MEMORY;
4465 Stream_Write_UINT32(s, state->dwCurrentState);
4466 Stream_Write_UINT32(s, state->dwEventState);
4467 Stream_Write_UINT32(s, state->cbAtr);
4468 Stream_Write(s, state->rgbAtr, 36);
4471 for (UINT32 i = 0; i < cReaders; i++)
4475 if (state->szReader)
4477 const UINT32 nameLen = (UINT32)(strlen(state->szReader) + 1);
4478 LONG status = smartcard_ndr_write_a(s, state->szReader, nameLen, NDR_PTR_FULL);
4479 if (status != SCARD_S_SUCCESS)
4484 return SCARD_S_SUCCESS;
4487WINPR_ATTR_NODISCARD
static LONG
4489 UINT32 cReaders, UINT32* ptrIndex)
4491 WINPR_ASSERT(rgReaderStates || (cReaders == 0));
4493 if (!Stream_EnsureRemainingCapacity(s, 4))
4494 return SCARD_E_NO_MEMORY;
4496 Stream_Write_UINT32(s, cReaders);
4498 for (UINT32 i = 0; i < cReaders; i++)
4502 if (!Stream_EnsureRemainingCapacity(s, 52))
4503 return SCARD_E_NO_MEMORY;
4505 const UINT32 nameLen = state->szReader ? (UINT32)(_wcslen(state->szReader) + 1) : 0;
4506 if (!smartcard_ndr_pointer_write(s, ptrIndex, nameLen))
4507 return SCARD_E_NO_MEMORY;
4509 Stream_Write_UINT32(s, state->dwCurrentState);
4510 Stream_Write_UINT32(s, state->dwEventState);
4511 Stream_Write_UINT32(s, state->cbAtr);
4512 Stream_Write(s, state->rgbAtr, 36);
4515 for (UINT32 i = 0; i < cReaders; i++)
4519 if (state->szReader)
4521 const UINT32 nameLen = (UINT32)(_wcslen(state->szReader) + 1);
4522 LONG status = smartcard_ndr_write_w(s, state->szReader, nameLen, NDR_PTR_FULL);
4523 if (status != SCARD_S_SUCCESS)
4528 return SCARD_S_SUCCESS;
4534 wLog* log = scard_log();
4537 smartcard_trace_get_status_change_a_call(log, call);
4539 LONG status = smartcard_pack_redir_scard_context(log, s, &call->handles.hContext, &index);
4540 if (status != SCARD_S_SUCCESS)
4543 if (!Stream_EnsureRemainingCapacity(s, 8))
4544 return SCARD_E_NO_MEMORY;
4546 Stream_Write_UINT32(s, call->dwTimeOut);
4547 Stream_Write_UINT32(s, call->cReaders);
4549 if (!smartcard_ndr_pointer_write(s, &index, call->cReaders))
4550 return SCARD_E_NO_MEMORY;
4552 status = smartcard_pack_redir_scard_context_ref(log, s, &call->handles.hContext);
4553 if (status != SCARD_S_SUCCESS)
4556 if (call->cReaders > 0)
4558 status = smartcard_pack_reader_state_a(s, call->rgReaderStates, call->cReaders, &index);
4559 if (status != SCARD_S_SUCCESS)
4563 return SCARD_S_SUCCESS;
4569 wLog* log = scard_log();
4572 smartcard_trace_get_status_change_w_call(log, call);
4574 LONG status = smartcard_pack_redir_scard_context(log, s, &call->handles.hContext, &index);
4575 if (status != SCARD_S_SUCCESS)
4578 if (!Stream_EnsureRemainingCapacity(s, 8))
4579 return SCARD_E_NO_MEMORY;
4581 Stream_Write_UINT32(s, call->dwTimeOut);
4582 Stream_Write_UINT32(s, call->cReaders);
4584 if (!smartcard_ndr_pointer_write(s, &index, call->cReaders))
4585 return SCARD_E_NO_MEMORY;
4587 status = smartcard_pack_redir_scard_context_ref(log, s, &call->handles.hContext);
4588 if (status != SCARD_S_SUCCESS)
4591 if (call->cReaders > 0)
4593 status = smartcard_pack_reader_state_w(s, call->rgReaderStates, call->cReaders, &index);
4594 if (status != SCARD_S_SUCCESS)
4598 return SCARD_S_SUCCESS;
4604 wLog* log = scard_log();
4607 smartcard_trace_connect_a_call(log, call);
4609 const UINT32 readerLen = call->szReader ? (UINT32)(strlen(call->szReader) + 1) : 0;
4610 if (!smartcard_ndr_pointer_write(s, &index, readerLen))
4611 return SCARD_E_NO_MEMORY;
4614 smartcard_pack_redir_scard_context(log, s, &call->Common.handles.hContext, &index);
4615 if (status != SCARD_S_SUCCESS)
4618 if (!Stream_EnsureRemainingCapacity(s, 8))
4619 return SCARD_E_NO_MEMORY;
4621 Stream_Write_UINT32(s, call->Common.dwShareMode);
4622 Stream_Write_UINT32(s, call->Common.dwPreferredProtocols);
4626 status = smartcard_ndr_write_a(s, call->szReader, readerLen, NDR_PTR_FULL);
4627 if (status != SCARD_S_SUCCESS)
4631 return smartcard_pack_redir_scard_context_ref(log, s, &call->Common.handles.hContext);
4637 wLog* log = scard_log();
4640 smartcard_trace_connect_w_call(log, call);
4642 const UINT32 readerLen = call->szReader ? (UINT32)(_wcslen(call->szReader) + 1) : 0;
4643 if (!smartcard_ndr_pointer_write(s, &index, readerLen))
4644 return SCARD_E_NO_MEMORY;
4647 smartcard_pack_redir_scard_context(log, s, &call->Common.handles.hContext, &index);
4648 if (status != SCARD_S_SUCCESS)
4651 if (!Stream_EnsureRemainingCapacity(s, 8))
4652 return SCARD_E_NO_MEMORY;
4654 Stream_Write_UINT32(s, call->Common.dwShareMode);
4655 Stream_Write_UINT32(s, call->Common.dwPreferredProtocols);
4659 status = smartcard_ndr_write_w(s, call->szReader, readerLen, NDR_PTR_FULL);
4660 if (status != SCARD_S_SUCCESS)
4664 return smartcard_pack_redir_scard_context_ref(log, s, &call->Common.handles.hContext);
4670 wLog* log = scard_log();
4673 smartcard_trace_control_call(log, call);
4675 LONG status = smartcard_pack_redir_scard_context(log, s, &call->handles.hContext, &index);
4676 if (status != SCARD_S_SUCCESS)
4679 status = smartcard_pack_redir_scard_handle(log, s, &call->handles.hCard, &index);
4680 if (status != SCARD_S_SUCCESS)
4683 if (!Stream_EnsureRemainingCapacity(s, 8))
4684 return SCARD_E_NO_MEMORY;
4686 Stream_Write_UINT32(s, call->dwControlCode);
4687 Stream_Write_UINT32(s, call->cbInBufferSize);
4688 if (!smartcard_ndr_pointer_write(s, &index, call->cbInBufferSize))
4689 return SCARD_E_NO_MEMORY;
4691 Stream_Write_INT32(s, call->fpvOutBufferIsNULL);
4692 Stream_Write_UINT32(s, call->cbOutBufferSize);
4694 status = smartcard_pack_redir_scard_context_ref(log, s, &call->handles.hContext);
4695 if (status != SCARD_S_SUCCESS)
4698 status = smartcard_pack_redir_scard_handle_ref(log, s, &call->handles.hCard);
4699 if (status != SCARD_S_SUCCESS)
4702 if (call->cbInBufferSize)
4704 status = smartcard_ndr_write(s, call->pvInBuffer, call->cbInBufferSize, 1, NDR_PTR_SIMPLE);
4705 if (status != SCARD_S_SUCCESS)
4716 wLog* log = scard_log();
4719 smartcard_trace_hcard_and_disposition_call(log, call, name);
4721 LONG status = smartcard_pack_redir_scard_context(log, s, &call->handles.hContext, &index);
4722 if (status != SCARD_S_SUCCESS)
4725 status = smartcard_pack_redir_scard_handle(log, s, &call->handles.hCard, &index);
4726 if (status != SCARD_S_SUCCESS)
4729 if (!Stream_EnsureRemainingCapacity(s, 4))
4730 return SCARD_E_NO_MEMORY;
4732 Stream_Write_UINT32(s, call->dwDisposition);
4734 status = smartcard_pack_redir_scard_context_ref(log, s, &call->handles.hContext);
4735 if (status != SCARD_S_SUCCESS)
4738 return smartcard_pack_redir_scard_handle_ref(log, s, &call->handles.hCard);
4744 wLog* log = scard_log();
4747 smartcard_trace_transmit_call(log, call);
4749 LONG status = smartcard_pack_redir_scard_context(log, s, &call->handles.hContext, &index);
4750 if (status != SCARD_S_SUCCESS)
4753 status = smartcard_pack_redir_scard_handle(log, s, &call->handles.hCard, &index);
4754 if (status != SCARD_S_SUCCESS)
4757 UINT32 cbExtraBytes = 0;
4758 const BYTE* pbExtraBytes =
nullptr;
4759 if (call->pioSendPci)
4761 cbExtraBytes = (UINT32)(call->pioSendPci->cbPciLength -
sizeof(
SCARD_IO_REQUEST));
4762 if (cbExtraBytes > 0)
4766 if (!Stream_EnsureRemainingCapacity(s, 32))
4767 return SCARD_E_NO_MEMORY;
4769 Stream_Write_UINT32(s, call->pioSendPci ? call->pioSendPci->dwProtocol : 0);
4770 Stream_Write_UINT32(s, cbExtraBytes);
4771 if (!smartcard_ndr_pointer_write(s, &index, cbExtraBytes))
4772 return SCARD_E_NO_MEMORY;
4774 Stream_Write_UINT32(s, call->cbSendLength);
4775 if (!smartcard_ndr_pointer_write(s, &index, call->cbSendLength))
4776 return SCARD_E_NO_MEMORY;
4778 const UINT32 recvPciLen = call->pioRecvPci ? (UINT32)call->pioRecvPci->cbPciLength : 0;
4779 if (!smartcard_ndr_pointer_write(s, &index, recvPciLen))
4780 return SCARD_E_NO_MEMORY;
4782 Stream_Write_INT32(s, call->fpbRecvBufferIsNULL);
4783 Stream_Write_UINT32(s, call->cbRecvLength);
4785 status = smartcard_pack_redir_scard_context_ref(log, s, &call->handles.hContext);
4786 if (status != SCARD_S_SUCCESS)
4789 status = smartcard_pack_redir_scard_handle_ref(log, s, &call->handles.hCard);
4790 if (status != SCARD_S_SUCCESS)
4793 if (cbExtraBytes > 0)
4795 status = smartcard_ndr_write(s, pbExtraBytes, cbExtraBytes, 1, NDR_PTR_SIMPLE);
4796 if (status != SCARD_S_SUCCESS)
4800 if (call->cbSendLength > 0)
4802 status = smartcard_ndr_write(s, call->pbSendBuffer, call->cbSendLength, 1, NDR_PTR_SIMPLE);
4803 if (status != SCARD_S_SUCCESS)
4807 if (call->pioRecvPci && recvPciLen > 0)
4809 UINT32 cbRecvExtra = (UINT32)(call->pioRecvPci->cbPciLength -
sizeof(
SCARD_IO_REQUEST));
4810 const BYTE* pbRecvExtra = &((
const BYTE*)call->pioRecvPci)[
sizeof(
SCARD_IO_REQUEST)];
4812 if (!Stream_EnsureRemainingCapacity(s, 12))
4813 return SCARD_E_NO_MEMORY;
4815 Stream_Write_UINT32(s, call->pioRecvPci->dwProtocol);
4816 Stream_Write_UINT32(s, cbRecvExtra);
4817 if (!smartcard_ndr_pointer_write(s, &index, cbRecvExtra))
4818 return SCARD_E_NO_MEMORY;
4820 if (cbRecvExtra > 0)
4822 status = smartcard_ndr_write(s, pbRecvExtra, cbRecvExtra, 1, NDR_PTR_SIMPLE);
4823 if (status != SCARD_S_SUCCESS)
4828 return SCARD_S_SUCCESS;
4834 wLog* log = scard_log();
4837 smartcard_trace_get_attrib_call(log, call);
4839 LONG status = smartcard_pack_redir_scard_context(log, s, &call->handles.hContext, &index);
4840 if (status != SCARD_S_SUCCESS)
4843 status = smartcard_pack_redir_scard_handle(log, s, &call->handles.hCard, &index);
4844 if (status != SCARD_S_SUCCESS)
4847 if (!Stream_EnsureRemainingCapacity(s, 12))
4848 return STATUS_NO_MEMORY;
4850 Stream_Write_UINT32(s, call->dwAttrId);
4851 Stream_Write_INT32(s, call->fpbAttrIsNULL);
4852 Stream_Write_UINT32(s, call->cbAttrLen);
4854 status = smartcard_pack_redir_scard_context_ref(log, s, &call->handles.hContext);
4855 if (status != SCARD_S_SUCCESS)
4858 return smartcard_pack_redir_scard_handle_ref(log, s, &call->handles.hCard);
4864 wLog* log = scard_log();
4866 UINT32 mszNdrPtr = 0;
4868 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
4869 return STATUS_BUFFER_TOO_SMALL;
4871 const UINT32 cBytes = Stream_Get_UINT32(s);
4873 if (!smartcard_ndr_pointer_read(log, s, &index, &mszNdrPtr))
4874 return ERROR_INVALID_DATA;
4878 LONG status = smartcard_ndr_read(log, s, &ret->msz, cBytes, 1, NDR_PTR_SIMPLE);
4879 if (status != SCARD_S_SUCCESS)
4881 ret->cBytes = cBytes;
4884 smartcard_trace_list_readers_return(log, ret, unicode);
4885 return SCARD_S_SUCCESS;
4892 wLog* log = scard_log();
4896 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
4897 return STATUS_BUFFER_TOO_SMALL;
4899 Stream_Read_UINT32(s, ret->cReaders);
4901 if (!smartcard_ndr_pointer_read(log, s, &index, &ndrPtr))
4902 return ERROR_INVALID_DATA;
4904 if (ndrPtr && ret->cReaders > 0)
4907 smartcard_ndr_read_state(log, s, &ret->rgReaderStates, ret->cReaders, NDR_PTR_SIMPLE);
4908 if (status != SCARD_S_SUCCESS)
4912 ret->rgReaderStates =
nullptr;
4914 smartcard_trace_get_status_change_return(log, ret, unicode);
4915 return SCARD_S_SUCCESS;
4921 wLog* log = scard_log();
4923 UINT32 pbContextNdrPtr = 0;
4926 smartcard_unpack_redir_scard_context(log, s, &ret->hContext, &index, &pbContextNdrPtr);
4927 if (status != SCARD_S_SUCCESS)
4930 status = smartcard_unpack_redir_scard_handle(log, s, &ret->hCard, &index);
4931 if (status != SCARD_S_SUCCESS)
4934 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
4935 return STATUS_BUFFER_TOO_SMALL;
4937 Stream_Read_UINT32(s, ret->dwActiveProtocol);
4939 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr, &ret->hContext);
4940 if (status != SCARD_S_SUCCESS)
4943 status = smartcard_unpack_redir_scard_handle_ref(log, s, &ret->hCard);
4944 if (status != SCARD_S_SUCCESS)
4947 smartcard_trace_connect_return(log, ret);
4948 return SCARD_S_SUCCESS;
4954 wLog* log = scard_log();
4956 UINT32 pvOutBufferNdrPtr = 0;
4958 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 8))
4959 return STATUS_BUFFER_TOO_SMALL;
4961 const UINT32 cbOutBufferSize = Stream_Get_UINT32(s);
4963 if (!smartcard_ndr_pointer_read(log, s, &index, &pvOutBufferNdrPtr))
4964 return ERROR_INVALID_DATA;
4966 if (pvOutBufferNdrPtr && (cbOutBufferSize > 0))
4969 smartcard_ndr_read(log, s, &ret->pvOutBuffer, cbOutBufferSize, 1, NDR_PTR_SIMPLE);
4970 if (status != SCARD_S_SUCCESS)
4972 ret->cbOutBufferSize = cbOutBufferSize;
4974 smartcard_trace_control_return(log, ret);
4975 return SCARD_S_SUCCESS;
4981 wLog* log = scard_log();
4983 UINT32 recvPciNdrPtr = 0;
4984 UINT32 recvBufferNdrPtr = 0;
4986 if (!smartcard_ndr_pointer_read(log, s, &index, &recvPciNdrPtr))
4987 return ERROR_INVALID_DATA;
4989 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
4990 return STATUS_BUFFER_TOO_SMALL;
4992 const UINT32 cbRecvLength = Stream_Get_UINT32(s);
4994 if (!smartcard_ndr_pointer_read(log, s, &index, &recvBufferNdrPtr))
4995 return ERROR_INVALID_DATA;
4999 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 8))
5000 return STATUS_BUFFER_TOO_SMALL;
5002 UINT32 dwProtocol = 0;
5003 UINT32 cbExtraBytes = 0;
5004 Stream_Read_UINT32(s, dwProtocol);
5005 Stream_Read_UINT32(s, cbExtraBytes);
5007 UINT32 pbExtraBytesNdrPtr = 0;
5008 if (!smartcard_ndr_pointer_read(log, s, &index, &pbExtraBytesNdrPtr))
5009 return ERROR_INVALID_DATA;
5011 if (pbExtraBytesNdrPtr)
5013 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
5014 return STATUS_BUFFER_TOO_SMALL;
5017 Stream_Read_UINT32(s, length);
5018 if (length != cbExtraBytes)
5020 WLog_Print(log, WLOG_WARN,
5021 "Transmit_Return unexpected length: Actual: %" PRIu32
5022 ", Expected: %" PRIu32
" (pioRecvPci.cbExtraBytes)",
5023 length, cbExtraBytes);
5024 return STATUS_INVALID_PARAMETER;
5027 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, cbExtraBytes))
5028 return STATUS_BUFFER_TOO_SMALL;
5031 if (!ret->pioRecvPci)
5032 return SCARD_E_NO_MEMORY;
5034 ret->pioRecvPci->dwProtocol = dwProtocol;
5035 ret->pioRecvPci->cbPciLength = (DWORD)(
sizeof(
SCARD_IO_REQUEST) + cbExtraBytes);
5038 Stream_Read(s, pbExtraBytes, length);
5039 if (smartcard_unpack_read_size_align(s, cbExtraBytes, 4) < 0)
5040 return STATUS_INVALID_PARAMETER;
5045 if (!ret->pioRecvPci)
5046 return SCARD_E_NO_MEMORY;
5048 ret->pioRecvPci->dwProtocol = dwProtocol;
5053 if (recvBufferNdrPtr && (cbRecvLength > 0))
5056 smartcard_ndr_read(log, s, &ret->pbRecvBuffer, cbRecvLength, 1, NDR_PTR_SIMPLE);
5057 if (status != SCARD_S_SUCCESS)
5059 ret->cbRecvLength = cbRecvLength;
5062 smartcard_trace_transmit_return(log, ret);
5063 return SCARD_S_SUCCESS;
5069 wLog* log = scard_log();
5071 UINT32 pbAttrPtr = 0;
5073 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
5074 return STATUS_BUFFER_TOO_SMALL;
5076 const UINT32 cbAttrLen = Stream_Get_UINT32(s);
5078 if (!smartcard_ndr_pointer_read(log, s, &index, &pbAttrPtr))
5079 return ERROR_INVALID_DATA;
5081 LONG status = smartcard_ndr_read(log, s, &ret->pbAttr, cbAttrLen, 1, NDR_PTR_SIMPLE);
5082 if (status != SCARD_S_SUCCESS)
5084 ret->cbAttrLen = cbAttrLen;
5086 smartcard_trace_get_attrib_return(log, ret, 0);
5087 return SCARD_S_SUCCESS;
5090BOOL smartcard_reader_state_return_is_valid_ex(
size_t pos,
const ReaderState_Return* val,
5091 const char* file,
size_t line,
const char* fkt)
5095 WLog_Print_dbg_tag(SCARD_TAG, WLOG_WARN, line, file, fkt,
"[%" PRIuz
"] val = nullptr",
5099 if (val->cbAtr >
sizeof(val->rgbAtr))
5101 WLog_Print_dbg_tag(SCARD_TAG, WLOG_WARN, line, file, fkt,
5102 "[%" PRIuz
"] val->cbAtr=%" PRIu32
", max=%" PRIuz, pos, val->cbAtr,
5103 sizeof(val->rgbAtr));