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 + 4ull))
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);
1928 if (context->cbContext > 16)
1930 WLog_Print(log, WLOG_WARN,
"REDIR_SCARDCONTEXT cbContext (%" PRIu32
") > 16",
1931 context->cbContext);
1932 return ERROR_INVALID_DATA;
1935 if (!smartcard_ndr_pointer_read_(log, s, index, &pbContextNdrPtr, file, function, line))
1936 return ERROR_INVALID_DATA;
1938 if (((context->cbContext == 0) && pbContextNdrPtr) ||
1939 ((context->cbContext != 0) && !pbContextNdrPtr))
1941 WLog_Print(log, WLOG_WARN,
1942 "REDIR_SCARDCONTEXT cbContext (%" PRIu32
") pbContextNdrPtr (%" PRIu32
1944 context->cbContext, pbContextNdrPtr);
1945 return STATUS_INVALID_PARAMETER;
1948 *ppbContextNdrPtr = pbContextNdrPtr;
1949 return SCARD_S_SUCCESS;
1952LONG smartcard_pack_redir_scard_context(WINPR_ATTR_UNUSED wLog* log,
wStream* s,
1955 const UINT32 pbContextNdrPtr = 0x00020000 + *index * 4;
1957 WINPR_ASSERT(context);
1958 if (context->cbContext != 0)
1960 Stream_Write_UINT32(s, context->cbContext);
1961 Stream_Write_UINT32(s, pbContextNdrPtr);
1962 *index = *index + 1;
1967 return SCARD_S_SUCCESS;
1970LONG smartcard_unpack_redir_scard_context_ref(wLog* log,
wStream* s,
1971 WINPR_ATTR_UNUSED UINT32 pbContextNdrPtr,
1976 WINPR_ASSERT(context);
1978 if (context->cbContext == 0)
1979 return SCARD_S_SUCCESS;
1981 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
1982 return STATUS_BUFFER_TOO_SMALL;
1984 Stream_Read_UINT32(s, length);
1986 if (length != context->cbContext)
1988 WLog_Print(log, WLOG_WARN,
1989 "REDIR_SCARDCONTEXT length (%" PRIu32
") cbContext (%" PRIu32
") mismatch",
1990 length, context->cbContext);
1991 return STATUS_INVALID_PARAMETER;
1994 const LONG status = smartcard_context_supported(log, context->cbContext);
1995 if (status != SCARD_S_SUCCESS)
1998 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, context->cbContext))
1999 return STATUS_BUFFER_TOO_SMALL;
2001 if (context->cbContext)
2002 Stream_Read(s, &(context->pbContext), context->cbContext);
2004 ZeroMemory(&(context->pbContext),
sizeof(context->pbContext));
2006 return SCARD_S_SUCCESS;
2009LONG smartcard_pack_redir_scard_context_ref(WINPR_ATTR_UNUSED wLog* log,
wStream* s,
2012 WINPR_ASSERT(context);
2014 if (context->cbContext == 0)
2015 return SCARD_S_SUCCESS;
2017 Stream_Write_UINT32(s, context->cbContext);
2018 Stream_Write(s, &(context->pbContext), context->cbContext);
2020 return SCARD_S_SUCCESS;
2024 UINT32* index,
const char* file,
const char* function,
2027 UINT32 pbHandleNdrPtr = 0;
2029 WINPR_ASSERT(handle);
2032 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
2033 return STATUS_BUFFER_TOO_SMALL;
2035 Stream_Read_UINT32(s, handle->cbHandle);
2037 if (!smartcard_ndr_pointer_read_(log, s, index, &pbHandleNdrPtr, file, function, line))
2038 return ERROR_INVALID_DATA;
2040 if (((handle->cbHandle == 0) && pbHandleNdrPtr) ||
2041 ((handle->cbHandle != 0) && !pbHandleNdrPtr))
2043 WLog_Print(log, WLOG_WARN,
2044 "REDIR_SCARDHANDLE cbHandle (%" PRIu32
") pbHandleNdrPtr (%" PRIu32
2046 handle->cbHandle, pbHandleNdrPtr);
2047 return STATUS_INVALID_PARAMETER;
2050 return SCARD_S_SUCCESS;
2053LONG smartcard_pack_redir_scard_handle(WINPR_ATTR_UNUSED wLog* log,
wStream* s,
2056 const UINT32 pbContextNdrPtr = 0x00020000 + *index * 4;
2058 WINPR_ASSERT(handle);
2059 if (handle->cbHandle != 0)
2061 Stream_Write_UINT32(s, handle->cbHandle);
2062 Stream_Write_UINT32(s, pbContextNdrPtr);
2063 *index = *index + 1;
2067 return SCARD_S_SUCCESS;
2074 WINPR_ASSERT(handle);
2076 if (handle->cbHandle == 0)
2077 return SCARD_S_SUCCESS;
2079 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
2080 return STATUS_BUFFER_TOO_SMALL;
2082 Stream_Read_UINT32(s, length);
2084 if (length != handle->cbHandle)
2086 WLog_Print(log, WLOG_WARN,
2087 "REDIR_SCARDHANDLE length (%" PRIu32
") cbHandle (%" PRIu32
") mismatch", length,
2089 return STATUS_INVALID_PARAMETER;
2092 if ((handle->cbHandle != 4) && (handle->cbHandle != 8))
2094 WLog_Print(log, WLOG_WARN,
"REDIR_SCARDHANDLE length is not 4 or 8: %" PRIu32
"",
2096 return STATUS_INVALID_PARAMETER;
2099 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, handle->cbHandle))
2100 return STATUS_BUFFER_TOO_SMALL;
2102 if (handle->cbHandle)
2103 Stream_Read(s, &(handle->pbHandle), handle->cbHandle);
2105 return SCARD_S_SUCCESS;
2108LONG smartcard_pack_redir_scard_handle_ref(WINPR_ATTR_UNUSED wLog* log,
wStream* s,
2111 WINPR_ASSERT(handle);
2113 if (handle->cbHandle == 0)
2114 return SCARD_S_SUCCESS;
2116 Stream_Write_UINT32(s, handle->cbHandle);
2117 Stream_Write(s, &(handle->pbHandle), handle->cbHandle);
2119 return SCARD_S_SUCCESS;
2125 wLog* log = scard_log();
2127 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
2128 return STATUS_BUFFER_TOO_SMALL;
2130 Stream_Read_UINT32(s, call->dwScope);
2131 smartcard_trace_establish_context_call(log, call);
2132 return SCARD_S_SUCCESS;
2138 wLog* log = scard_log();
2140 smartcard_trace_establish_context_call(log, call);
2142 if (!Stream_EnsureRemainingCapacity(s, 4))
2143 return SCARD_E_NO_MEMORY;
2145 Stream_Write_UINT32(s, call->dwScope);
2147 return SCARD_S_SUCCESS;
2153 wLog* log = scard_log();
2157 smartcard_trace_establish_context_return(log, ret);
2158 if (ret->ReturnCode != SCARD_S_SUCCESS)
2159 return ret->ReturnCode;
2161 status = smartcard_pack_redir_scard_context(log, s, &(ret->hContext), &index);
2162 if (status != SCARD_S_SUCCESS)
2165 return smartcard_pack_redir_scard_context_ref(log, s, &(ret->hContext));
2171 wLog* log = scard_log();
2173 UINT32 pbContextNdrPtr = 0;
2176 smartcard_unpack_redir_scard_context(log, s, &(ret->hContext), &index, &pbContextNdrPtr);
2177 if (status != SCARD_S_SUCCESS)
2180 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr, &(ret->hContext));
2181 if (status != SCARD_S_SUCCESS)
2184 smartcard_trace_establish_context_return(log, ret);
2185 return SCARD_S_SUCCESS;
2191 UINT32 pbContextNdrPtr = 0;
2192 wLog* log = scard_log();
2195 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
2197 if (status != SCARD_S_SUCCESS)
2200 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
2201 &(call->handles.hContext));
2202 if (status != SCARD_S_SUCCESS)
2203 WLog_Print(log, WLOG_ERROR,
2204 "smartcard_unpack_redir_scard_context_ref failed with error %" PRId32
"",
2207 smartcard_trace_context_call(log, call, name);
2214 UINT32 pbContextNdrPtr = 0;
2215 wLog* log = scard_log();
2218 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
2221 if (status != SCARD_S_SUCCESS)
2224 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 8))
2225 return STATUS_BUFFER_TOO_SMALL;
2227 Stream_Read_INT32(s, call->fmszGroupsIsNULL);
2228 Stream_Read_UINT32(s, call->cchGroups);
2229 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
2230 &(call->handles.hContext));
2232 if (status != SCARD_S_SUCCESS)
2235 smartcard_trace_list_reader_groups_call(log, call, unicode);
2236 return SCARD_S_SUCCESS;
2243 wLog* log = scard_log();
2246 smartcard_trace_list_reader_groups_call(log, call, unicode);
2248 LONG status = smartcard_pack_redir_scard_context(log, s, &call->handles.hContext, &index);
2249 if (status != SCARD_S_SUCCESS)
2252 if (!Stream_EnsureRemainingCapacity(s, 8))
2253 return SCARD_E_NO_MEMORY;
2255 Stream_Write_INT32(s, call->fmszGroupsIsNULL);
2256 Stream_Write_UINT32(s, call->cchGroups);
2258 return smartcard_pack_redir_scard_context_ref(log, s, &call->handles.hContext);
2265 wLog* log = scard_log();
2267 UINT32 cBytes = ret->cBytes;
2270 smartcard_trace_list_reader_groups_return(log, ret, unicode);
2271 if (ret->ReturnCode != SCARD_S_SUCCESS)
2273 if (cBytes == SCARD_AUTOALLOCATE)
2276 if (!Stream_EnsureRemainingCapacity(s, 4))
2277 return SCARD_E_NO_MEMORY;
2281 WLog_Print(log, WLOG_ERROR,
2282 "2.2.3.4 ListReaderGroups_Return and ListReaders_Return cBytes (%" PRIu32
2285 return SCARD_E_INVALID_PARAMETER;
2288 Stream_Write_UINT32(s, cBytes);
2289 if (!smartcard_ndr_pointer_write(s, &index, cBytes))
2290 return SCARD_E_NO_MEMORY;
2292 status = smartcard_ndr_write(s, ret->msz, cBytes, 1, NDR_PTR_SIMPLE);
2293 if (status != SCARD_S_SUCCESS)
2295 return ret->ReturnCode;
2302 wLog* log = scard_log();
2304 UINT32 mszNdrPtr = 0;
2306 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
2307 return STATUS_BUFFER_TOO_SMALL;
2309 const UINT32 cBytes = Stream_Get_UINT32(s);
2312 WLog_Print(log, WLOG_ERROR,
2313 "2.2.3.4 ListReaderGroups_Return and ListReaders_Return cBytes (%" PRIu32
2316 return SCARD_E_INVALID_PARAMETER;
2319 if (!smartcard_ndr_pointer_read(log, s, &index, &mszNdrPtr))
2320 return ERROR_INVALID_DATA;
2324 LONG status = smartcard_ndr_read(log, s, &ret->msz, cBytes, 1, NDR_PTR_SIMPLE);
2325 if (status != SCARD_S_SUCCESS)
2327 ret->cBytes = cBytes;
2330 smartcard_trace_list_reader_groups_return(log, ret, unicode);
2331 return SCARD_S_SUCCESS;
2337 UINT32 mszGroupsNdrPtr = 0;
2338 UINT32 pbContextNdrPtr = 0;
2339 wLog* log = scard_log();
2342 call->mszGroups =
nullptr;
2344 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
2346 if (status != SCARD_S_SUCCESS)
2349 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
2350 return STATUS_BUFFER_TOO_SMALL;
2352 const UINT32 cBytes = Stream_Get_UINT32(s);
2355 WLog_Print(log, WLOG_ERROR,
2356 "2.2.3.4 ListReaderGroups_Return and ListReaders_Return cBytes (%" PRIu32
2359 return SCARD_E_INVALID_PARAMETER;
2361 if (!smartcard_ndr_pointer_read(log, s, &index, &mszGroupsNdrPtr))
2362 return ERROR_INVALID_DATA;
2364 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 8))
2365 return STATUS_BUFFER_TOO_SMALL;
2366 Stream_Read_INT32(s, call->fmszReadersIsNULL);
2367 Stream_Read_UINT32(s, call->cchReaders);
2369 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
2370 &(call->handles.hContext));
2371 if (status != SCARD_S_SUCCESS)
2374 if (mszGroupsNdrPtr)
2376 status = smartcard_ndr_read(log, s, &call->mszGroups, cBytes, 1, NDR_PTR_SIMPLE);
2377 if (status != SCARD_S_SUCCESS)
2379 call->cBytes = cBytes;
2382 smartcard_trace_list_readers_call(log, call, unicode);
2383 return SCARD_S_SUCCESS;
2389 wLog* log = scard_log();
2392 UINT32 size = ret->cBytes;
2394 smartcard_trace_list_readers_return(log, ret, unicode);
2395 if (ret->ReturnCode != SCARD_S_SUCCESS)
2398 if (!Stream_EnsureRemainingCapacity(s, 4))
2400 WLog_Print(log, WLOG_ERROR,
"Stream_EnsureRemainingCapacity failed!");
2401 return SCARD_F_INTERNAL_ERROR;
2406 WLog_Print(log, WLOG_ERROR,
2407 "2.2.3.4 ListReaderGroups_Return and ListReaders_Return cBytes (%" PRIu32
2410 return SCARD_E_INVALID_PARAMETER;
2413 Stream_Write_UINT32(s, size);
2414 if (!smartcard_ndr_pointer_write(s, &index, size))
2415 return SCARD_E_NO_MEMORY;
2417 status = smartcard_ndr_write(s, ret->msz, size, 1, NDR_PTR_SIMPLE);
2418 if (status != SCARD_S_SUCCESS)
2420 return ret->ReturnCode;
2423WINPR_ATTR_NODISCARD
static LONG smartcard_unpack_connect_common(wLog* log,
wStream* s,
2426 UINT32* ppbContextNdrPtr)
2428 WINPR_ASSERT(common);
2429 LONG status = smartcard_unpack_redir_scard_context(log, s, &(common->handles.hContext), index,
2431 if (status != SCARD_S_SUCCESS)
2434 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 8))
2435 return STATUS_BUFFER_TOO_SMALL;
2437 Stream_Read_UINT32(s, common->dwShareMode);
2438 Stream_Read_UINT32(s, common->dwPreferredProtocols);
2439 return SCARD_S_SUCCESS;
2446 UINT32 pbContextNdrPtr = 0;
2449 wLog* log = scard_log();
2451 call->szReader =
nullptr;
2453 if (!smartcard_ndr_pointer_read(log, s, &index,
nullptr))
2454 return ERROR_INVALID_DATA;
2456 status = smartcard_unpack_connect_common(log, s, &(call->Common), &index, &pbContextNdrPtr);
2457 if (status != SCARD_S_SUCCESS)
2459 WLog_Print(log, WLOG_ERROR,
"smartcard_unpack_connect_common failed with error %" PRId32
"",
2464 status = smartcard_ndr_read_a(log, s, &call->szReader, NDR_PTR_FULL);
2465 if (status != SCARD_S_SUCCESS)
2468 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
2469 &(call->Common.handles.hContext));
2470 if (status != SCARD_S_SUCCESS)
2471 WLog_Print(log, WLOG_ERROR,
2472 "smartcard_unpack_redir_scard_context_ref failed with error %" PRId32
"",
2475 smartcard_trace_connect_a_call(log, call);
2483 UINT32 pbContextNdrPtr = 0;
2486 wLog* log = scard_log();
2487 call->szReader =
nullptr;
2489 if (!smartcard_ndr_pointer_read(log, s, &index,
nullptr))
2490 return ERROR_INVALID_DATA;
2492 status = smartcard_unpack_connect_common(log, s, &(call->Common), &index, &pbContextNdrPtr);
2493 if (status != SCARD_S_SUCCESS)
2495 WLog_Print(log, WLOG_ERROR,
"smartcard_unpack_connect_common failed with error %" PRId32
"",
2500 status = smartcard_ndr_read_w(log, s, &call->szReader, NDR_PTR_FULL);
2501 if (status != SCARD_S_SUCCESS)
2504 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
2505 &(call->Common.handles.hContext));
2506 if (status != SCARD_S_SUCCESS)
2507 WLog_Print(log, WLOG_ERROR,
2508 "smartcard_unpack_redir_scard_context_ref failed with error %" PRId32
"",
2511 smartcard_trace_connect_w_call(log, call);
2521 wLog* log = scard_log();
2522 smartcard_trace_connect_return(log, ret);
2524 status = smartcard_pack_redir_scard_context(log, s, &ret->hContext, &index);
2525 if (status != SCARD_S_SUCCESS)
2528 status = smartcard_pack_redir_scard_handle(log, s, &ret->hCard, &index);
2529 if (status != SCARD_S_SUCCESS)
2532 if (!Stream_EnsureRemainingCapacity(s, 4))
2533 return SCARD_E_NO_MEMORY;
2535 Stream_Write_UINT32(s, ret->dwActiveProtocol);
2536 status = smartcard_pack_redir_scard_context_ref(log, s, &ret->hContext);
2537 if (status != SCARD_S_SUCCESS)
2539 return smartcard_pack_redir_scard_handle_ref(log, s, &(ret->hCard));
2545 UINT32 pbContextNdrPtr = 0;
2548 wLog* log = scard_log();
2549 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
2551 if (status != SCARD_S_SUCCESS)
2554 status = smartcard_unpack_redir_scard_handle(log, s, &(call->handles.hCard), &index);
2555 if (status != SCARD_S_SUCCESS)
2558 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 12))
2559 return STATUS_BUFFER_TOO_SMALL;
2561 Stream_Read_UINT32(s, call->dwShareMode);
2562 Stream_Read_UINT32(s, call->dwPreferredProtocols);
2563 Stream_Read_UINT32(s, call->dwInitialization);
2565 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
2566 &(call->handles.hContext));
2567 if (status != SCARD_S_SUCCESS)
2569 WLog_Print(log, WLOG_ERROR,
2570 "smartcard_unpack_redir_scard_context_ref failed with error %" PRId32
"",
2575 status = smartcard_unpack_redir_scard_handle_ref(log, s, &(call->handles.hCard));
2576 if (status != SCARD_S_SUCCESS)
2577 WLog_Print(log, WLOG_ERROR,
2578 "smartcard_unpack_redir_scard_handle_ref failed with error %" PRId32
"", status);
2580 smartcard_trace_reconnect_call(log, call);
2587 wLog* log = scard_log();
2590 smartcard_trace_reconnect_call(log, call);
2592 LONG status = smartcard_pack_redir_scard_context(log, s, &call->handles.hContext, &index);
2593 if (status != SCARD_S_SUCCESS)
2596 status = smartcard_pack_redir_scard_handle(log, s, &call->handles.hCard, &index);
2597 if (status != SCARD_S_SUCCESS)
2600 if (!Stream_EnsureRemainingCapacity(s, 12))
2601 return SCARD_E_NO_MEMORY;
2603 Stream_Write_UINT32(s, call->dwShareMode);
2604 Stream_Write_UINT32(s, call->dwPreferredProtocols);
2605 Stream_Write_UINT32(s, call->dwInitialization);
2607 status = smartcard_pack_redir_scard_context_ref(log, s, &call->handles.hContext);
2608 if (status != SCARD_S_SUCCESS)
2611 return smartcard_pack_redir_scard_handle_ref(log, s, &call->handles.hCard);
2617 wLog* log = scard_log();
2618 smartcard_trace_reconnect_return(log, ret);
2620 if (!Stream_EnsureRemainingCapacity(s, 4))
2621 return SCARD_E_NO_MEMORY;
2622 Stream_Write_UINT32(s, ret->dwActiveProtocol);
2623 return ret->ReturnCode;
2629 wLog* log = scard_log();
2631 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
2632 return STATUS_BUFFER_TOO_SMALL;
2634 Stream_Read_UINT32(s, ret->dwActiveProtocol);
2636 smartcard_trace_reconnect_return(log, ret);
2637 return SCARD_S_SUCCESS;
2644 UINT32 pbContextNdrPtr = 0;
2647 wLog* log = scard_log();
2649 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
2651 if (status != SCARD_S_SUCCESS)
2654 status = smartcard_unpack_redir_scard_handle(log, s, &(call->handles.hCard), &index);
2655 if (status != SCARD_S_SUCCESS)
2658 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
2659 return STATUS_BUFFER_TOO_SMALL;
2661 Stream_Read_UINT32(s, call->dwDisposition);
2663 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
2664 &(call->handles.hContext));
2665 if (status != SCARD_S_SUCCESS)
2668 status = smartcard_unpack_redir_scard_handle_ref(log, s, &(call->handles.hCard));
2669 if (status != SCARD_S_SUCCESS)
2672 smartcard_trace_hcard_and_disposition_call(log, call, name);
2680 if (!WLog_IsLevelActive(log, g_LogLevel))
2683 WLog_Print(log, g_LogLevel,
"GetStatusChangeA_Call {");
2684 smartcard_log_context(log, &call->handles.hContext);
2686 WLog_Print(log, g_LogLevel,
"dwTimeOut: 0x%08" PRIX32
" cReaders: %" PRIu32
"", call->dwTimeOut,
2689 dump_reader_states_a(log, call->rgReaderStates, call->cReaders);
2691 WLog_Print(log, g_LogLevel,
"}");
2694WINPR_ATTR_NODISCARD
static LONG smartcard_unpack_reader_state_a(wLog* log,
wStream* s,
2696 UINT32 cReaders, UINT32* ptrIndex)
2698 LONG status = SCARD_E_NO_MEMORY;
2700 WINPR_ASSERT(ppcReaders || (cReaders == 0));
2701 if (cReaders > UINT8_MAX)
2703 WLog_Print(log, WLOG_ERROR,
2704 "Too many readers(%" PRIu32
"), rejecting request. Limited to <= %d", cReaders,
2706 return SCARD_E_WRITE_TOO_MANY;
2709 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
2712 const UINT32 len = Stream_Get_UINT32(s);
2713 if (len != cReaders)
2715 WLog_Print(log, WLOG_ERROR,
"Count mismatch when reading LPSCARD_READERSTATEA");
2721 BOOL* states = calloc(cReaders,
sizeof(BOOL));
2722 if (!rgReaderStates || !states)
2724 status = ERROR_INVALID_DATA;
2726 for (UINT32 index = 0; index < cReaders; index++)
2728 UINT32 ptr = UINT32_MAX;
2731 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 52))
2734 if (!smartcard_ndr_pointer_read(log, s, ptrIndex, &ptr))
2740 states[index] = ptr != 0;
2741 Stream_Read_UINT32(s, readerState->dwCurrentState);
2742 Stream_Read_UINT32(s, readerState->dwEventState);
2743 Stream_Read_UINT32(s, readerState->cbAtr);
2744 if (readerState->cbAtr > ARRAYSIZE(readerState->rgbAtr))
2746 WLog_Print(log, WLOG_WARN,
2747 "SCARD_READERSTATEA[%" PRIu32
"]::cbAtr %" PRIu32
" exceeds %" PRIuz, index,
2748 readerState->cbAtr, (
size_t)ARRAYSIZE(readerState->rgbAtr));
2749 readerState->cbAtr = ARRAYSIZE(readerState->rgbAtr);
2751 Stream_Read(s, readerState->rgbAtr, 36);
2754 for (UINT32 index = 0; index < cReaders; index++)
2761 status = smartcard_ndr_read_a(log, s, &readerState->szReader, NDR_PTR_FULL);
2762 if (status != SCARD_S_SUCCESS)
2764 if (!readerState->szReader)
2768 *ppcReaders = rgReaderStates;
2770 return SCARD_S_SUCCESS;
2774 for (UINT32 index = 0; index < cReaders; index++)
2777 free(readerState->szReader);
2780 free(rgReaderStates);
2785WINPR_ATTR_NODISCARD
static LONG smartcard_unpack_reader_state_w(wLog* log,
wStream* s,
2787 UINT32 cReaders, UINT32* ptrIndex)
2789 LONG status = SCARD_E_NO_MEMORY;
2791 WINPR_ASSERT(ppcReaders || (cReaders == 0));
2793 if (cReaders > UINT8_MAX)
2795 WLog_Print(log, WLOG_ERROR,
2796 "Too many readers(%" PRIu32
"), rejecting request. Limited to <= %d", cReaders,
2798 return SCARD_E_WRITE_TOO_MANY;
2801 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
2804 const UINT32 len = Stream_Get_UINT32(s);
2805 if (len != cReaders)
2807 WLog_Print(log, WLOG_ERROR,
"Count mismatch when reading LPSCARD_READERSTATEW");
2813 BOOL* states = calloc(cReaders,
sizeof(BOOL));
2815 if (!rgReaderStates || !states)
2818 status = ERROR_INVALID_DATA;
2819 for (UINT32 index = 0; index < cReaders; index++)
2821 UINT32 ptr = UINT32_MAX;
2824 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 52))
2827 if (!smartcard_ndr_pointer_read(log, s, ptrIndex, &ptr))
2833 states[index] = ptr != 0;
2834 Stream_Read_UINT32(s, readerState->dwCurrentState);
2835 Stream_Read_UINT32(s, readerState->dwEventState);
2836 Stream_Read_UINT32(s, readerState->cbAtr);
2837 if (readerState->cbAtr > ARRAYSIZE(readerState->rgbAtr))
2839 WLog_Print(log, WLOG_WARN,
2840 "SCARD_READERSTATEW[%" PRIu32
"]::cbAtr %" PRIu32
" exceeds %" PRIuz, index,
2841 readerState->cbAtr, ARRAYSIZE(readerState->rgbAtr));
2842 readerState->cbAtr = ARRAYSIZE(readerState->rgbAtr);
2844 Stream_Read(s, readerState->rgbAtr, 36);
2847 for (UINT32 index = 0; index < cReaders; index++)
2855 status = smartcard_ndr_read_w(log, s, &readerState->szReader, NDR_PTR_FULL);
2856 if (status != SCARD_S_SUCCESS)
2858 if (!readerState->szReader)
2862 *ppcReaders = rgReaderStates;
2864 return SCARD_S_SUCCESS;
2868 for (UINT32 index = 0; index < cReaders; index++)
2871 free(readerState->szReader);
2874 free(rgReaderStates);
2887 UINT32 pbContextNdrPtr = 0;
2890 wLog* log = scard_log();
2892 call->rgReaderStates =
nullptr;
2894 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
2896 if (status != SCARD_S_SUCCESS)
2899 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 8))
2900 return STATUS_BUFFER_TOO_SMALL;
2902 Stream_Read_UINT32(s, call->dwTimeOut);
2903 const UINT32 cReaders = Stream_Get_UINT32(s);
2906 WLog_Print(log, WLOG_WARN,
2907 "2.2.2.11 GetStatusChangeA_Call: cReaders must be <= 11, got %" PRIu32,
2909 return ERROR_INVALID_DATA;
2912 if (!smartcard_ndr_pointer_read(log, s, &index, &ndrPtr))
2913 return ERROR_INVALID_DATA;
2915 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
2916 &(call->handles.hContext));
2917 if (status != SCARD_S_SUCCESS)
2922 status = smartcard_unpack_reader_state_a(log, s, &call->rgReaderStates, cReaders, &index);
2923 if (status != SCARD_S_SUCCESS)
2925 call->cReaders = cReaders;
2929 WLog_Print(log, WLOG_WARN,
"ndrPtr=0x%08" PRIx32
", can not read rgReaderStates", ndrPtr);
2930 return SCARD_E_UNEXPECTED;
2933 smartcard_trace_get_status_change_a_call(log, call);
2934 return SCARD_S_SUCCESS;
2941 UINT32 pbContextNdrPtr = 0;
2944 wLog* log = scard_log();
2945 call->rgReaderStates =
nullptr;
2947 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
2949 if (status != SCARD_S_SUCCESS)
2952 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 8))
2953 return STATUS_BUFFER_TOO_SMALL;
2955 Stream_Read_UINT32(s, call->dwTimeOut);
2956 const UINT32 cReaders = Stream_Get_UINT32(s);
2959 WLog_Print(log, WLOG_WARN,
2960 "2.2.2.12 GetStatusChangeW_Call: cReaders must be <= 11, got %" PRIu32,
2962 return ERROR_INVALID_DATA;
2965 if (!smartcard_ndr_pointer_read(log, s, &index, &ndrPtr))
2966 return ERROR_INVALID_DATA;
2968 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
2969 &(call->handles.hContext));
2970 if (status != SCARD_S_SUCCESS)
2975 status = smartcard_unpack_reader_state_w(log, s, &call->rgReaderStates, cReaders, &index);
2976 if (status != SCARD_S_SUCCESS)
2978 call->cReaders = cReaders;
2982 WLog_Print(log, WLOG_WARN,
"ndrPtr=0x%08" PRIx32
", can not read rgReaderStates", ndrPtr);
2983 return SCARD_E_UNEXPECTED;
2986 smartcard_trace_get_status_change_w_call(log, call);
2987 return SCARD_S_SUCCESS;
2994 wLog* log = scard_log();
2997 UINT32 cReaders = ret->cReaders;
3000 if (ret->cReaders > 10)
3002 WLog_Print(log, WLOG_ERROR,
3003 "2.2.3.5 LocateCards_Return and GetStatusChange_Return cReaders(%" PRIu32
3006 return SCARD_E_INVALID_PARAMETER;
3009 smartcard_trace_get_status_change_return(log, ret, unicode);
3010 if ((ret->ReturnCode != SCARD_S_SUCCESS) && (ret->ReturnCode != SCARD_E_TIMEOUT))
3012 if (cReaders == SCARD_AUTOALLOCATE)
3015 if (!Stream_EnsureRemainingCapacity(s, 4))
3016 return SCARD_E_NO_MEMORY;
3018 Stream_Write_UINT32(s, cReaders);
3019 if (!smartcard_ndr_pointer_write(s, &index, cReaders))
3020 return SCARD_E_NO_MEMORY;
3021 status = smartcard_ndr_write_state(s, ret->rgReaderStates, cReaders, NDR_PTR_SIMPLE);
3022 if (status != SCARD_S_SUCCESS)
3024 return ret->ReturnCode;
3030 UINT32 pbContextNdrPtr = 0;
3032 wLog* log = scard_log();
3035 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
3037 if (status != SCARD_S_SUCCESS)
3040 status = smartcard_unpack_redir_scard_handle(log, s, &(call->handles.hCard), &index);
3041 if (status != SCARD_S_SUCCESS)
3044 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 8))
3045 return STATUS_BUFFER_TOO_SMALL;
3047 Stream_Read_INT32(s, call->fpbAtrIsNULL);
3048 Stream_Read_UINT32(s, call->cbAtrLen);
3050 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
3051 &(call->handles.hContext));
3052 if (status != SCARD_S_SUCCESS)
3055 status = smartcard_unpack_redir_scard_handle_ref(log, s, &(call->handles.hCard));
3056 if (status != SCARD_S_SUCCESS)
3065 wLog* log = scard_log();
3067 UINT32 cbAtrLen = ret->cbAtrLen;
3070 smartcard_trace_state_return(log, ret);
3071 if (ret->ReturnCode != SCARD_S_SUCCESS)
3073 if (cbAtrLen == SCARD_AUTOALLOCATE)
3076 Stream_Write_UINT32(s, ret->dwState);
3077 Stream_Write_UINT32(s, ret->dwProtocol);
3078 Stream_Write_UINT32(s, cbAtrLen);
3079 if (!smartcard_ndr_pointer_write(s, &index, cbAtrLen))
3080 return SCARD_E_NO_MEMORY;
3081 status = smartcard_ndr_write(s, ret->rgAtr, cbAtrLen, 1, NDR_PTR_SIMPLE);
3082 if (status != SCARD_S_SUCCESS)
3084 return ret->ReturnCode;
3090 UINT32 pbContextNdrPtr = 0;
3093 wLog* log = scard_log();
3095 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
3097 if (status != SCARD_S_SUCCESS)
3100 status = smartcard_unpack_redir_scard_handle(log, s, &(call->handles.hCard), &index);
3101 if (status != SCARD_S_SUCCESS)
3104 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 12))
3105 return STATUS_BUFFER_TOO_SMALL;
3107 Stream_Read_INT32(s, call->fmszReaderNamesIsNULL);
3108 Stream_Read_UINT32(s, call->cchReaderLen);
3109 Stream_Read_UINT32(s, call->cbAtrLen);
3111 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
3112 &(call->handles.hContext));
3113 if (status != SCARD_S_SUCCESS)
3116 status = smartcard_unpack_redir_scard_handle_ref(log, s, &(call->handles.hCard));
3117 if (status != SCARD_S_SUCCESS)
3120 smartcard_trace_status_call(log, call, unicode);
3127 wLog* log = scard_log();
3130 smartcard_trace_status_call(log, call, unicode);
3132 LONG status = smartcard_pack_redir_scard_context(log, s, &call->handles.hContext, &index);
3133 if (status != SCARD_S_SUCCESS)
3136 status = smartcard_pack_redir_scard_handle(log, s, &call->handles.hCard, &index);
3137 if (status != SCARD_S_SUCCESS)
3140 if (!Stream_EnsureRemainingCapacity(s, 12))
3141 return SCARD_E_NO_MEMORY;
3143 Stream_Write_INT32(s, call->fmszReaderNamesIsNULL);
3144 Stream_Write_UINT32(s, call->cchReaderLen);
3145 Stream_Write_UINT32(s, call->cbAtrLen);
3147 status = smartcard_pack_redir_scard_context_ref(log, s, &call->handles.hContext);
3148 if (status != SCARD_S_SUCCESS)
3151 return smartcard_pack_redir_scard_handle_ref(log, s, &call->handles.hCard);
3157 wLog* log = scard_log();
3161 UINT32 cBytes = ret->cBytes;
3163 smartcard_trace_status_return(log, ret, unicode);
3164 if (ret->ReturnCode != SCARD_S_SUCCESS)
3166 if (cBytes == SCARD_AUTOALLOCATE)
3169 if (!Stream_EnsureRemainingCapacity(s, 4))
3170 return SCARD_F_INTERNAL_ERROR;
3174 WLog_Print(log, WLOG_ERROR,
"2.2.3.10 Status_Return cBytes(%" PRIu32
") > 65536", cBytes);
3175 return SCARD_E_INVALID_PARAMETER;
3178 Stream_Write_UINT32(s, cBytes);
3179 if (!smartcard_ndr_pointer_write(s, &index, cBytes))
3180 return SCARD_E_NO_MEMORY;
3182 if (!Stream_EnsureRemainingCapacity(s, 44))
3183 return SCARD_F_INTERNAL_ERROR;
3185 Stream_Write_UINT32(s, ret->dwState);
3186 Stream_Write_UINT32(s, ret->dwProtocol);
3187 Stream_Write(s, ret->pbAtr,
sizeof(ret->pbAtr));
3189 if (ret->cbAtrLen > 32)
3191 WLog_Print(log, WLOG_ERROR,
"2.2.3.10 Status_Return cbAtrLen(%" PRIu32
") > 32",
3193 return SCARD_E_INVALID_PARAMETER;
3196 Stream_Write_UINT32(s, ret->cbAtrLen);
3197 status = smartcard_ndr_write(s, ret->mszReaderNames, cBytes, 1, NDR_PTR_SIMPLE);
3198 if (status != SCARD_S_SUCCESS)
3200 return ret->ReturnCode;
3206 wLog* log = scard_log();
3208 UINT32 mszNdrPtr = 0;
3210 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
3211 return STATUS_BUFFER_TOO_SMALL;
3213 const UINT32 cBytes = Stream_Get_UINT32(s);
3216 WLog_Print(log, WLOG_ERROR,
"2.2.3.10 Status_Return cBytes(%" PRIu32
") > 65536", cBytes);
3217 return SCARD_E_INVALID_PARAMETER;
3220 if (!smartcard_ndr_pointer_read(log, s, &index, &mszNdrPtr))
3221 return ERROR_INVALID_DATA;
3223 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 44))
3224 return STATUS_BUFFER_TOO_SMALL;
3226 Stream_Read_UINT32(s, ret->dwState);
3227 Stream_Read_UINT32(s, ret->dwProtocol);
3228 Stream_Read(s, ret->pbAtr,
sizeof(ret->pbAtr));
3229 Stream_Read_UINT32(s, ret->cbAtrLen);
3231 if (ret->cbAtrLen > ARRAYSIZE(ret->pbAtr))
3233 WLog_Print(log, WLOG_ERROR,
"Status_Return::cbAtrLen %" PRIu32
" exceeds %" PRIuz,
3234 ret->cbAtrLen, ARRAYSIZE(ret->pbAtr));
3235 return SCARD_E_INVALID_ATR;
3240 LONG status = smartcard_ndr_read(log, s, &ret->mszReaderNames, cBytes, 1, NDR_PTR_SIMPLE);
3241 if (status != SCARD_S_SUCCESS)
3243 ret->cBytes = cBytes;
3246 smartcard_trace_status_return(log, ret, unicode);
3247 return SCARD_S_SUCCESS;
3253 wLog* log = scard_log();
3255 UINT32 pbContextNdrPtr = 0;
3257 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
3259 if (status != SCARD_S_SUCCESS)
3262 status = smartcard_unpack_redir_scard_handle(log, s, &(call->handles.hCard), &index);
3263 if (status != SCARD_S_SUCCESS)
3266 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 12))
3267 return STATUS_BUFFER_TOO_SMALL;
3269 Stream_Read_UINT32(s, call->dwAttrId);
3270 Stream_Read_INT32(s, call->fpbAttrIsNULL);
3271 Stream_Read_UINT32(s, call->cbAttrLen);
3273 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
3274 &(call->handles.hContext));
3275 if (status != SCARD_S_SUCCESS)
3278 status = smartcard_unpack_redir_scard_handle_ref(log, s, &(call->handles.hCard));
3279 if (status != SCARD_S_SUCCESS)
3282 smartcard_trace_get_attrib_call(log, call);
3287 DWORD cbAttrCallLen)
3290 wLog* log = scard_log();
3292 UINT32 cbAttrLen = 0;
3294 smartcard_trace_get_attrib_return(log, ret, dwAttrId);
3296 if (!Stream_EnsureRemainingCapacity(s, 4))
3297 return SCARD_F_INTERNAL_ERROR;
3299 cbAttrLen = ret->cbAttrLen;
3300 if (ret->ReturnCode != SCARD_S_SUCCESS)
3302 if (cbAttrLen == SCARD_AUTOALLOCATE)
3307 if (cbAttrCallLen < cbAttrLen)
3308 cbAttrLen = cbAttrCallLen;
3310 if (cbAttrLen > 65536)
3312 WLog_Print(log, WLOG_ERROR,
"2.2.3.12 GetAttrib_Return cbAttrLen(%" PRIu32
") > 65536",
3314 return SCARD_E_INVALID_PARAMETER;
3316 Stream_Write_UINT32(s, cbAttrLen);
3317 if (!smartcard_ndr_pointer_write(s, &index, cbAttrLen))
3318 return SCARD_E_NO_MEMORY;
3320 status = smartcard_ndr_write(s, ret->pbAttr, cbAttrLen, 1, NDR_PTR_SIMPLE);
3321 if (status != SCARD_S_SUCCESS)
3323 return ret->ReturnCode;
3329 wLog* log = scard_log();
3332 UINT32 pvInBufferNdrPtr = 0;
3333 UINT32 pbContextNdrPtr = 0;
3335 call->pvInBuffer =
nullptr;
3337 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
3339 if (status != SCARD_S_SUCCESS)
3342 status = smartcard_unpack_redir_scard_handle(log, s, &(call->handles.hCard), &index);
3343 if (status != SCARD_S_SUCCESS)
3346 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 20))
3347 return STATUS_BUFFER_TOO_SMALL;
3349 Stream_Read_UINT32(s, call->dwControlCode);
3350 const UINT32 cbInBufferSize = Stream_Get_UINT32(s);
3351 if (cbInBufferSize > 66560)
3353 WLog_Print(log, WLOG_ERROR,
"2.2.2.20 Control_Call cbInBufferSize (%" PRIu32
") > 66560",
3355 return SCARD_E_INVALID_PARAMETER;
3358 if (!smartcard_ndr_pointer_read(log, s, &index,
3360 return ERROR_INVALID_DATA;
3361 Stream_Read_INT32(s, call->fpvOutBufferIsNULL);
3362 Stream_Read_UINT32(s, call->cbOutBufferSize);
3364 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
3365 &(call->handles.hContext));
3366 if (status != SCARD_S_SUCCESS)
3369 status = smartcard_unpack_redir_scard_handle_ref(log, s, &(call->handles.hCard));
3370 if (status != SCARD_S_SUCCESS)
3373 if (pvInBufferNdrPtr)
3375 status = smartcard_ndr_read(log, s, &call->pvInBuffer, cbInBufferSize, 1, NDR_PTR_SIMPLE);
3376 if (status != SCARD_S_SUCCESS)
3378 call->cbInBufferSize = cbInBufferSize;
3381 smartcard_trace_control_call(log, call);
3382 return SCARD_S_SUCCESS;
3388 wLog* log = scard_log();
3391 UINT32 cbDataLen = ret->cbOutBufferSize;
3394 smartcard_trace_control_return(log, ret);
3395 if (ret->ReturnCode != SCARD_S_SUCCESS)
3397 if (cbDataLen == SCARD_AUTOALLOCATE)
3400 if (!Stream_EnsureRemainingCapacity(s, 4))
3401 return SCARD_F_INTERNAL_ERROR;
3403 if (cbDataLen > 66560)
3405 WLog_Print(log, WLOG_ERROR,
"2.2.3.6 Control_Return cbOutBufferSize(%" PRIu32
") > 66560",
3407 return SCARD_E_INVALID_PARAMETER;
3410 Stream_Write_UINT32(s, cbDataLen);
3411 if (!smartcard_ndr_pointer_write(s, &index, cbDataLen))
3412 return SCARD_E_NO_MEMORY;
3414 status = smartcard_ndr_write(s, ret->pvOutBuffer, cbDataLen, 1, NDR_PTR_SIMPLE);
3415 if (status != SCARD_S_SUCCESS)
3417 return ret->ReturnCode;
3423 BYTE* pbExtraBytes =
nullptr;
3424 UINT32 pbExtraBytesNdrPtr = 0;
3425 UINT32 pbSendBufferNdrPtr = 0;
3426 UINT32 pioRecvPciNdrPtr = 0;
3430 UINT32 pbContextNdrPtr = 0;
3433 wLog* log = scard_log();
3435 call->pioSendPci =
nullptr;
3436 call->pioRecvPci =
nullptr;
3437 call->pbSendBuffer =
nullptr;
3439 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
3441 if (status != SCARD_S_SUCCESS)
3444 status = smartcard_unpack_redir_scard_handle(log, s, &(call->handles.hCard), &index);
3445 if (status != SCARD_S_SUCCESS)
3448 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 32))
3449 return STATUS_BUFFER_TOO_SMALL;
3451 Stream_Read_UINT32(s, ioSendPci.dwProtocol);
3452 Stream_Read_UINT32(s, ioSendPci.cbExtraBytes);
3453 if (!smartcard_ndr_pointer_read(log, s, &index,
3454 &pbExtraBytesNdrPtr))
3455 return ERROR_INVALID_DATA;
3457 const UINT32 cbSendLength = Stream_Get_UINT32(s);
3458 if (cbSendLength > 66560)
3460 WLog_Print(log, WLOG_ERROR,
"2.2.2.19 Transmit_Call cbSendLength (%" PRIu32
") > 66560",
3462 return SCARD_E_INVALID_PARAMETER;
3464 if (!smartcard_ndr_pointer_read(log, s, &index,
3465 &pbSendBufferNdrPtr))
3466 return ERROR_INVALID_DATA;
3468 if (!smartcard_ndr_pointer_read(log, s, &index,
3470 return ERROR_INVALID_DATA;
3472 Stream_Read_INT32(s, call->fpbRecvBufferIsNULL);
3473 Stream_Read_UINT32(s, call->cbRecvLength);
3475 if (ioSendPci.cbExtraBytes > 1024)
3477 WLog_Print(log, WLOG_WARN,
3478 "Transmit_Call ioSendPci.cbExtraBytes is out of bounds: %" PRIu32
" (max: 1024)",
3479 ioSendPci.cbExtraBytes);
3480 return STATUS_INVALID_PARAMETER;
3483 if (cbSendLength > 66560)
3485 WLog_Print(log, WLOG_WARN,
3486 "Transmit_Call cbSendLength is out of bounds: %" PRIu32
" (max: 66560)",
3487 ioSendPci.cbExtraBytes);
3488 return STATUS_INVALID_PARAMETER;
3491 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
3492 &(call->handles.hContext));
3493 if (status != SCARD_S_SUCCESS)
3496 status = smartcard_unpack_redir_scard_handle_ref(log, s, &(call->handles.hCard));
3497 if (status != SCARD_S_SUCCESS)
3500 if (ioSendPci.cbExtraBytes && !pbExtraBytesNdrPtr)
3504 "Transmit_Call ioSendPci.cbExtraBytes is non-zero but pbExtraBytesNdrPtr is null");
3505 return STATUS_INVALID_PARAMETER;
3508 if (pbExtraBytesNdrPtr)
3511 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
3512 return STATUS_BUFFER_TOO_SMALL;
3514 Stream_Read_UINT32(s, length);
3516 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, ioSendPci.cbExtraBytes))
3517 return STATUS_BUFFER_TOO_SMALL;
3519 ioSendPci.pbExtraBytes = Stream_Pointer(s);
3523 if (!call->pioSendPci)
3525 WLog_Print(log, WLOG_WARN,
"Transmit_Call out of memory error (pioSendPci)");
3526 return STATUS_NO_MEMORY;
3529 call->pioSendPci->dwProtocol = ioSendPci.dwProtocol;
3530 call->pioSendPci->cbPciLength = (DWORD)(ioSendPci.cbExtraBytes +
sizeof(
SCARD_IO_REQUEST));
3532 Stream_Read(s, pbExtraBytes, ioSendPci.cbExtraBytes);
3533 if (smartcard_unpack_read_size_align(s, ioSendPci.cbExtraBytes, 4) < 0)
3534 return STATUS_INVALID_PARAMETER;
3540 if (!call->pioSendPci)
3542 WLog_Print(log, WLOG_WARN,
"Transmit_Call out of memory error (pioSendPci)");
3543 return STATUS_NO_MEMORY;
3546 call->pioSendPci->dwProtocol = ioSendPci.dwProtocol;
3550 if (pbSendBufferNdrPtr)
3552 status = smartcard_ndr_read(log, s, &call->pbSendBuffer, cbSendLength, 1, NDR_PTR_SIMPLE);
3553 if (status != SCARD_S_SUCCESS)
3555 call->cbSendLength = cbSendLength;
3558 if (pioRecvPciNdrPtr)
3560 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 12))
3561 return STATUS_BUFFER_TOO_SMALL;
3563 Stream_Read_UINT32(s, ioRecvPci.dwProtocol);
3564 Stream_Read_UINT32(s, ioRecvPci.cbExtraBytes);
3565 if (!smartcard_ndr_pointer_read(log, s, &index,
3566 &pbExtraBytesNdrPtr))
3567 return ERROR_INVALID_DATA;
3569 if (ioRecvPci.cbExtraBytes && !pbExtraBytesNdrPtr)
3573 "Transmit_Call ioRecvPci.cbExtraBytes is non-zero but pbExtraBytesNdrPtr is null");
3574 return STATUS_INVALID_PARAMETER;
3577 if (pbExtraBytesNdrPtr)
3580 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
3581 return STATUS_BUFFER_TOO_SMALL;
3583 Stream_Read_UINT32(s, length);
3585 if (ioRecvPci.cbExtraBytes > 1024)
3587 WLog_Print(log, WLOG_WARN,
3588 "Transmit_Call ioRecvPci.cbExtraBytes is out of bounds: %" PRIu32
3590 ioRecvPci.cbExtraBytes);
3591 return STATUS_INVALID_PARAMETER;
3594 if (length != ioRecvPci.cbExtraBytes)
3596 WLog_Print(log, WLOG_WARN,
3597 "Transmit_Call unexpected length: Actual: %" PRIu32
3598 ", Expected: %" PRIu32
" (ioRecvPci.cbExtraBytes)",
3599 length, ioRecvPci.cbExtraBytes);
3600 return STATUS_INVALID_PARAMETER;
3603 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, ioRecvPci.cbExtraBytes))
3604 return STATUS_BUFFER_TOO_SMALL;
3606 ioRecvPci.pbExtraBytes = Stream_Pointer(s);
3610 if (!call->pioRecvPci)
3612 WLog_Print(log, WLOG_WARN,
"Transmit_Call out of memory error (pioRecvPci)");
3613 return STATUS_NO_MEMORY;
3616 call->pioRecvPci->dwProtocol = ioRecvPci.dwProtocol;
3617 call->pioRecvPci->cbPciLength =
3620 Stream_Read(s, pbExtraBytes, ioRecvPci.cbExtraBytes);
3621 if (smartcard_unpack_read_size_align(s, ioRecvPci.cbExtraBytes, 4) < 0)
3622 return STATUS_INVALID_PARAMETER;
3628 if (!call->pioRecvPci)
3630 WLog_Print(log, WLOG_WARN,
"Transmit_Call out of memory error (pioRecvPci)");
3631 return STATUS_NO_MEMORY;
3634 call->pioRecvPci->dwProtocol = ioRecvPci.dwProtocol;
3639 smartcard_trace_transmit_call(log, call);
3640 return SCARD_S_SUCCESS;
3646 wLog* log = scard_log();
3651 UINT32 cbRecvLength = ret->cbRecvLength;
3652 UINT32 cbRecvPci = ret->pioRecvPci ? ret->pioRecvPci->cbPciLength : 0;
3654 smartcard_trace_transmit_return(log, ret);
3656 if (!ret->pbRecvBuffer)
3659 if (!smartcard_ndr_pointer_write(s, &index, cbRecvPci))
3660 return SCARD_E_NO_MEMORY;
3661 if (!Stream_EnsureRemainingCapacity(s, 4))
3662 return SCARD_E_NO_MEMORY;
3664 if (cbRecvLength > 66560)
3666 WLog_Print(log, WLOG_ERROR,
"2.2.3.11 Transmit_Return cbRecvLength(%" PRIu32
") > 66560",
3668 return SCARD_E_INVALID_PARAMETER;
3671 Stream_Write_UINT32(s, cbRecvLength);
3672 if (!smartcard_ndr_pointer_write(s, &index, cbRecvLength))
3673 return SCARD_E_NO_MEMORY;
3675 if (ret->pioRecvPci)
3677 UINT32 cbExtraBytes = (UINT32)(ret->pioRecvPci->cbPciLength -
sizeof(
SCARD_IO_REQUEST));
3680 if (!Stream_EnsureRemainingCapacity(s, cbExtraBytes + 16ull))
3682 WLog_Print(log, WLOG_ERROR,
"Stream_EnsureRemainingCapacity failed!");
3683 return SCARD_F_INTERNAL_ERROR;
3686 Stream_Write_UINT32(s, ret->pioRecvPci->dwProtocol);
3687 Stream_Write_UINT32(s, cbExtraBytes);
3688 if (!smartcard_ndr_pointer_write(s, &index, cbExtraBytes))
3689 return SCARD_E_NO_MEMORY;
3690 error = smartcard_ndr_write(s, pbExtraBytes, cbExtraBytes, 1, NDR_PTR_SIMPLE);
3695 status = smartcard_ndr_write(s, ret->pbRecvBuffer, ret->cbRecvLength, 1, NDR_PTR_SIMPLE);
3696 if (status != SCARD_S_SUCCESS)
3698 return ret->ReturnCode;
3703 UINT32 rgReaderStatesNdrPtr = 0;
3704 UINT32 rgAtrMasksNdrPtr = 0;
3706 UINT32 pbContextNdrPtr = 0;
3709 wLog* log = scard_log();
3711 call->rgReaderStates =
nullptr;
3713 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
3715 if (status != SCARD_S_SUCCESS)
3718 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 16))
3719 return STATUS_BUFFER_TOO_SMALL;
3721 Stream_Read_UINT32(s, call->cAtrs);
3722 if (call->cAtrs > 1000)
3724 WLog_Print(log, WLOG_ERROR,
"2.2.2.23 LocateCardsByATRA_Call cAtrs(%" PRIu32
") > 1000",
3726 return SCARD_E_INVALID_PARAMETER;
3729 if (!smartcard_ndr_pointer_read(log, s, &index, &rgAtrMasksNdrPtr))
3730 return ERROR_INVALID_DATA;
3731 const UINT32 cReaders = Stream_Get_UINT32(s);
3734 WLog_Print(log, WLOG_ERROR,
"2.2.2.23 LocateCardsByATRA_Call cReaders(%" PRIu32
") > 10",
3736 return SCARD_E_INVALID_PARAMETER;
3738 if (!smartcard_ndr_pointer_read(log, s, &index, &rgReaderStatesNdrPtr))
3739 return ERROR_INVALID_DATA;
3741 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
3742 &(call->handles.hContext));
3743 if (status != SCARD_S_SUCCESS)
3746 if ((rgAtrMasksNdrPtr && !call->cAtrs) || (!rgAtrMasksNdrPtr && call->cAtrs))
3748 WLog_Print(log, WLOG_WARN,
3749 "LocateCardsByATRA_Call rgAtrMasksNdrPtr (0x%08" PRIX32
3750 ") and cAtrs (0x%08" PRIX32
") inconsistency",
3751 rgAtrMasksNdrPtr, call->cAtrs);
3752 return STATUS_INVALID_PARAMETER;
3755 if (rgAtrMasksNdrPtr)
3757 status = smartcard_ndr_read_atrmask(log, s, &call->rgAtrMasks, call->cAtrs, NDR_PTR_SIMPLE);
3758 if (status != SCARD_S_SUCCESS)
3762 if (rgReaderStatesNdrPtr)
3764 status = smartcard_unpack_reader_state_a(log, s, &call->rgReaderStates, cReaders, &index);
3765 if (status != SCARD_S_SUCCESS)
3767 call->cReaders = cReaders;
3770 smartcard_trace_locate_cards_by_atr_a_call(log, call);
3771 return SCARD_S_SUCCESS;
3776 UINT32 sz1NdrPtr = 0;
3777 UINT32 sz2NdrPtr = 0;
3779 UINT32 pbContextNdrPtr = 0;
3782 wLog* log = scard_log();
3784 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
3786 if (status != SCARD_S_SUCCESS)
3789 if (!smartcard_ndr_pointer_read(log, s, &index, &sz1NdrPtr))
3790 return ERROR_INVALID_DATA;
3791 if (!smartcard_ndr_pointer_read(log, s, &index, &sz2NdrPtr))
3792 return ERROR_INVALID_DATA;
3795 smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr, &call->handles.hContext);
3796 if (status != SCARD_S_SUCCESS)
3801 status = smartcard_ndr_read_a(log, s, &call->sz1, NDR_PTR_FULL);
3802 if (status != SCARD_S_SUCCESS)
3807 status = smartcard_ndr_read_a(log, s, &call->sz2, NDR_PTR_FULL);
3808 if (status != SCARD_S_SUCCESS)
3811 smartcard_trace_context_and_two_strings_a_call(log, call);
3812 return SCARD_S_SUCCESS;
3817 UINT32 sz1NdrPtr = 0;
3818 UINT32 sz2NdrPtr = 0;
3820 UINT32 pbContextNdrPtr = 0;
3823 wLog* log = scard_log();
3825 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
3827 if (status != SCARD_S_SUCCESS)
3830 if (!smartcard_ndr_pointer_read(log, s, &index, &sz1NdrPtr))
3831 return ERROR_INVALID_DATA;
3832 if (!smartcard_ndr_pointer_read(log, s, &index, &sz2NdrPtr))
3833 return ERROR_INVALID_DATA;
3836 smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr, &call->handles.hContext);
3837 if (status != SCARD_S_SUCCESS)
3842 status = smartcard_ndr_read_w(log, s, &call->sz1, NDR_PTR_FULL);
3843 if (status != SCARD_S_SUCCESS)
3848 status = smartcard_ndr_read_w(log, s, &call->sz2, NDR_PTR_FULL);
3849 if (status != SCARD_S_SUCCESS)
3852 smartcard_trace_context_and_two_strings_w_call(log, call);
3853 return SCARD_S_SUCCESS;
3858 UINT32 sz1NdrPtr = 0;
3859 UINT32 sz2NdrPtr = 0;
3861 UINT32 pbContextNdrPtr = 0;
3864 wLog* log = scard_log();
3866 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
3868 if (status != SCARD_S_SUCCESS)
3871 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 16))
3872 return STATUS_BUFFER_TOO_SMALL;
3874 const UINT32 cBytes = Stream_Get_UINT32(s);
3875 if (call->cBytes > 65536)
3877 WLog_Print(log, WLOG_ERROR,
"2.2.2.9 LocateCardsA_Call cBytes(%" PRIu32
") > 65536",
3879 return SCARD_E_INVALID_PARAMETER;
3882 if (!smartcard_ndr_pointer_read(log, s, &index, &sz1NdrPtr))
3883 return ERROR_INVALID_DATA;
3885 const UINT32 cReaders = Stream_Get_UINT32(s);
3888 WLog_Print(log, WLOG_ERROR,
"2.2.2.9 LocateCardsA_Call cReaders(%" PRIu32
") > 10",
3890 return SCARD_E_INVALID_PARAMETER;
3892 if (!smartcard_ndr_pointer_read(log, s, &index, &sz2NdrPtr))
3893 return ERROR_INVALID_DATA;
3895 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
3896 &(call->handles.hContext));
3897 if (status != SCARD_S_SUCCESS)
3902 status = smartcard_ndr_read_fixed_string_a(log, s, &call->mszCards, cBytes, NDR_PTR_SIMPLE);
3903 if (status != SCARD_S_SUCCESS)
3905 call->cBytes = cBytes;
3909 status = smartcard_unpack_reader_state_a(log, s, &call->rgReaderStates, cReaders, &index);
3910 if (status != SCARD_S_SUCCESS)
3912 call->cReaders = cReaders;
3914 smartcard_trace_locate_cards_a_call(log, call);
3915 return SCARD_S_SUCCESS;
3920 UINT32 sz1NdrPtr = 0;
3921 UINT32 sz2NdrPtr = 0;
3923 UINT32 pbContextNdrPtr = 0;
3926 wLog* log = scard_log();
3928 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
3930 if (status != SCARD_S_SUCCESS)
3933 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 16))
3934 return STATUS_BUFFER_TOO_SMALL;
3936 const UINT32 cBytes = Stream_Get_UINT32(s);
3937 if (call->cBytes > 65536)
3939 WLog_Print(log, WLOG_ERROR,
"2.2.2.10 LocateCardsW_Call cBytes(%" PRIu32
") > 65536",
3941 return SCARD_E_INVALID_PARAMETER;
3944 if (!smartcard_ndr_pointer_read(log, s, &index, &sz1NdrPtr))
3945 return ERROR_INVALID_DATA;
3947 const UINT32 cReaders = Stream_Get_UINT32(s);
3950 WLog_Print(log, WLOG_ERROR,
"2.2.2.10 LocateCardsW_Call cReaders(%" PRIu32
") > 10",
3952 return SCARD_E_INVALID_PARAMETER;
3955 if (!smartcard_ndr_pointer_read(log, s, &index, &sz2NdrPtr))
3956 return ERROR_INVALID_DATA;
3958 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
3959 &(call->handles.hContext));
3960 if (status != SCARD_S_SUCCESS)
3965 status = smartcard_ndr_read_fixed_string_w(log, s, &call->mszCards, cBytes, NDR_PTR_SIMPLE);
3966 if (status != SCARD_S_SUCCESS)
3968 call->cBytes = cBytes;
3972 status = smartcard_unpack_reader_state_w(log, s, &call->rgReaderStates, cReaders, &index);
3973 if (status != SCARD_S_SUCCESS)
3975 call->cReaders = cReaders;
3977 smartcard_trace_locate_cards_w_call(log, call);
3978 return SCARD_S_SUCCESS;
3985 UINT32 pbContextNdrPtr = 0;
3988 wLog* log = scard_log();
3990 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
3992 if (status != SCARD_S_SUCCESS)
3994 status = smartcard_unpack_redir_scard_handle(log, s, &(call->handles.hCard), &index);
3995 if (status != SCARD_S_SUCCESS)
3998 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 12))
3999 return STATUS_BUFFER_TOO_SMALL;
4000 Stream_Read_UINT32(s, call->dwAttrId);
4001 Stream_Read_UINT32(s, call->cbAttrLen);
4002 if (call->cbAttrLen > 65536)
4004 WLog_Print(log, WLOG_ERROR,
"2.2.2.22 SetAttrib_Call call->cbAttrLen (%" PRIu32
") > 65536",
4006 return SCARD_E_INVALID_PARAMETER;
4009 if (!smartcard_ndr_pointer_read(log, s, &index, &ndrPtr))
4010 return ERROR_INVALID_DATA;
4012 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
4013 &(call->handles.hContext));
4014 if (status != SCARD_S_SUCCESS)
4017 status = smartcard_unpack_redir_scard_handle_ref(log, s, &(call->handles.hCard));
4018 if (status != SCARD_S_SUCCESS)
4024 status = smartcard_ndr_read_ex(log, s, &call->pbAttr, 0, 1, NDR_PTR_SIMPLE, &len);
4025 if (status != SCARD_S_SUCCESS)
4027 if (call->cbAttrLen > len)
4028 call->cbAttrLen = WINPR_ASSERTING_INT_CAST(DWORD, len);
4031 call->cbAttrLen = 0;
4032 smartcard_trace_set_attrib_call(log, call);
4033 return SCARD_S_SUCCESS;
4039 wLog* log = scard_log();
4042 smartcard_trace_set_attrib_call(log, call);
4044 LONG status = smartcard_pack_redir_scard_context(log, s, &call->handles.hContext, &index);
4045 if (status != SCARD_S_SUCCESS)
4048 status = smartcard_pack_redir_scard_handle(log, s, &call->handles.hCard, &index);
4049 if (status != SCARD_S_SUCCESS)
4052 if (!Stream_EnsureRemainingCapacity(s, 8))
4053 return SCARD_E_NO_MEMORY;
4055 Stream_Write_UINT32(s, call->dwAttrId);
4056 Stream_Write_UINT32(s, call->cbAttrLen);
4058 if (!smartcard_ndr_pointer_write(s, &index, call->cbAttrLen))
4059 return SCARD_E_NO_MEMORY;
4061 status = smartcard_pack_redir_scard_context_ref(log, s, &call->handles.hContext);
4062 if (status != SCARD_S_SUCCESS)
4065 status = smartcard_pack_redir_scard_handle_ref(log, s, &call->handles.hCard);
4066 if (status != SCARD_S_SUCCESS)
4069 status = smartcard_ndr_write(s, call->pbAttr, call->cbAttrLen, 1, NDR_PTR_SIMPLE);
4070 if (status != SCARD_S_SUCCESS)
4073 return SCARD_S_SUCCESS;
4078 UINT32 rgReaderStatesNdrPtr = 0;
4079 UINT32 rgAtrMasksNdrPtr = 0;
4081 UINT32 pbContextNdrPtr = 0;
4084 wLog* log = scard_log();
4086 call->rgReaderStates =
nullptr;
4088 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
4090 if (status != SCARD_S_SUCCESS)
4093 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 16))
4094 return STATUS_BUFFER_TOO_SMALL;
4096 Stream_Read_UINT32(s, call->cAtrs);
4097 if (call->cAtrs > 1000)
4099 WLog_Print(log, WLOG_ERROR,
"2.2.2.24 LocateCardsByATRW_Call cAtrs(%" PRIu32
") > 1000",
4101 return SCARD_E_INVALID_PARAMETER;
4104 if (!smartcard_ndr_pointer_read(log, s, &index, &rgAtrMasksNdrPtr))
4105 return ERROR_INVALID_DATA;
4107 const UINT32 cReaders = Stream_Get_UINT32(s);
4110 WLog_Print(log, WLOG_ERROR,
"2.2.2.24 LocateCardsByATRW_Call cReaders(%" PRIu32
") > 10",
4112 return SCARD_E_INVALID_PARAMETER;
4114 if (!smartcard_ndr_pointer_read(log, s, &index, &rgReaderStatesNdrPtr))
4115 return ERROR_INVALID_DATA;
4117 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
4118 &(call->handles.hContext));
4119 if (status != SCARD_S_SUCCESS)
4122 if ((rgAtrMasksNdrPtr && !call->cAtrs) || (!rgAtrMasksNdrPtr && call->cAtrs))
4124 WLog_Print(log, WLOG_WARN,
4125 "LocateCardsByATRW_Call rgAtrMasksNdrPtr (0x%08" PRIX32
4126 ") and cAtrs (0x%08" PRIX32
") inconsistency",
4127 rgAtrMasksNdrPtr, call->cAtrs);
4128 return STATUS_INVALID_PARAMETER;
4131 if (rgAtrMasksNdrPtr)
4133 status = smartcard_ndr_read_atrmask(log, s, &call->rgAtrMasks, call->cAtrs, NDR_PTR_SIMPLE);
4134 if (status != SCARD_S_SUCCESS)
4138 if (rgReaderStatesNdrPtr)
4140 status = smartcard_unpack_reader_state_w(log, s, &call->rgReaderStates, cReaders, &index);
4141 if (status != SCARD_S_SUCCESS)
4143 call->cReaders = cReaders;
4146 smartcard_trace_locate_cards_by_atr_w_call(log, call);
4147 return SCARD_S_SUCCESS;
4152 UINT32 mszNdrPtr = 0;
4153 UINT32 contextNdrPtr = 0;
4155 UINT32 pbContextNdrPtr = 0;
4158 wLog* log = scard_log();
4160 if (!smartcard_ndr_pointer_read(log, s, &index, &mszNdrPtr))
4161 return ERROR_INVALID_DATA;
4163 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->Common.handles.hContext),
4164 &index, &pbContextNdrPtr);
4165 if (status != SCARD_S_SUCCESS)
4168 if (!smartcard_ndr_pointer_read(log, s, &index, &contextNdrPtr))
4169 return ERROR_INVALID_DATA;
4171 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 12))
4172 return STATUS_BUFFER_TOO_SMALL;
4173 Stream_Read_UINT32(s, call->Common.FreshnessCounter);
4174 Stream_Read_INT32(s, call->Common.fPbDataIsNULL);
4175 Stream_Read_UINT32(s, call->Common.cbDataLen);
4177 call->szLookupName =
nullptr;
4180 status = smartcard_ndr_read_a(log, s, &call->szLookupName, NDR_PTR_FULL);
4181 if (status != SCARD_S_SUCCESS)
4185 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
4186 &call->Common.handles.hContext);
4187 if (status != SCARD_S_SUCCESS)
4192 status = smartcard_ndr_read_u(log, s, &call->Common.CardIdentifier);
4193 if (status != SCARD_S_SUCCESS)
4196 smartcard_trace_read_cache_a_call(log, call);
4197 return SCARD_S_SUCCESS;
4202 UINT32 mszNdrPtr = 0;
4203 UINT32 contextNdrPtr = 0;
4205 UINT32 pbContextNdrPtr = 0;
4208 wLog* log = scard_log();
4210 if (!smartcard_ndr_pointer_read(log, s, &index, &mszNdrPtr))
4211 return ERROR_INVALID_DATA;
4213 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->Common.handles.hContext),
4214 &index, &pbContextNdrPtr);
4215 if (status != SCARD_S_SUCCESS)
4218 if (!smartcard_ndr_pointer_read(log, s, &index, &contextNdrPtr))
4219 return ERROR_INVALID_DATA;
4221 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 12))
4222 return STATUS_BUFFER_TOO_SMALL;
4223 Stream_Read_UINT32(s, call->Common.FreshnessCounter);
4224 Stream_Read_INT32(s, call->Common.fPbDataIsNULL);
4225 Stream_Read_UINT32(s, call->Common.cbDataLen);
4227 call->szLookupName =
nullptr;
4230 status = smartcard_ndr_read_w(log, s, &call->szLookupName, NDR_PTR_FULL);
4231 if (status != SCARD_S_SUCCESS)
4235 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
4236 &call->Common.handles.hContext);
4237 if (status != SCARD_S_SUCCESS)
4242 status = smartcard_ndr_read_u(log, s, &call->Common.CardIdentifier);
4243 if (status != SCARD_S_SUCCESS)
4246 smartcard_trace_read_cache_w_call(log, call);
4247 return SCARD_S_SUCCESS;
4252 UINT32 mszNdrPtr = 0;
4253 UINT32 contextNdrPtr = 0;
4254 UINT32 pbDataNdrPtr = 0;
4256 UINT32 pbContextNdrPtr = 0;
4259 wLog* log = scard_log();
4261 if (!smartcard_ndr_pointer_read(log, s, &index, &mszNdrPtr))
4262 return ERROR_INVALID_DATA;
4264 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->Common.handles.hContext),
4265 &index, &pbContextNdrPtr);
4266 if (status != SCARD_S_SUCCESS)
4269 if (!smartcard_ndr_pointer_read(log, s, &index, &contextNdrPtr))
4270 return ERROR_INVALID_DATA;
4272 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 8))
4273 return STATUS_BUFFER_TOO_SMALL;
4275 Stream_Read_UINT32(s, call->Common.FreshnessCounter);
4276 const UINT32 cbDataLen = Stream_Get_UINT32(s);
4277 if (cbDataLen > 65536)
4279 WLog_Print(log, WLOG_ERROR,
"2.2.1.10 WriteCache_Common cbDataLen(%" PRIu32
") > 65536",
4281 return ERROR_INVALID_DATA;
4284 if (!smartcard_ndr_pointer_read(log, s, &index, &pbDataNdrPtr))
4285 return ERROR_INVALID_DATA;
4287 call->szLookupName =
nullptr;
4290 status = smartcard_ndr_read_a(log, s, &call->szLookupName, NDR_PTR_FULL);
4291 if (status != SCARD_S_SUCCESS)
4295 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
4296 &call->Common.handles.hContext);
4297 if (status != SCARD_S_SUCCESS)
4300 call->Common.CardIdentifier =
nullptr;
4303 status = smartcard_ndr_read_u(log, s, &call->Common.CardIdentifier);
4304 if (status != SCARD_S_SUCCESS)
4308 call->Common.pbData =
nullptr;
4311 status = smartcard_ndr_read(log, s, &call->Common.pbData, cbDataLen, 1, NDR_PTR_SIMPLE);
4312 if (status != SCARD_S_SUCCESS)
4314 call->Common.cbDataLen = cbDataLen;
4316 smartcard_trace_write_cache_a_call(log, call);
4317 return SCARD_S_SUCCESS;
4322 UINT32 mszNdrPtr = 0;
4323 UINT32 contextNdrPtr = 0;
4324 UINT32 pbDataNdrPtr = 0;
4326 UINT32 pbContextNdrPtr = 0;
4329 wLog* log = scard_log();
4331 if (!smartcard_ndr_pointer_read(log, s, &index, &mszNdrPtr))
4332 return ERROR_INVALID_DATA;
4334 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->Common.handles.hContext),
4335 &index, &pbContextNdrPtr);
4336 if (status != SCARD_S_SUCCESS)
4339 if (!smartcard_ndr_pointer_read(log, s, &index, &contextNdrPtr))
4340 return ERROR_INVALID_DATA;
4342 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 8))
4343 return STATUS_BUFFER_TOO_SMALL;
4344 Stream_Read_UINT32(s, call->Common.FreshnessCounter);
4345 const UINT32 cbDataLen = Stream_Get_UINT32(s);
4347 if (cbDataLen > 65536)
4349 WLog_Print(log, WLOG_ERROR,
"2.2.1.10 WriteCache_Common cbDataLen(%" PRIu32
") > 65536",
4351 return ERROR_INVALID_DATA;
4354 if (!smartcard_ndr_pointer_read(log, s, &index, &pbDataNdrPtr))
4355 return ERROR_INVALID_DATA;
4357 call->szLookupName =
nullptr;
4360 status = smartcard_ndr_read_w(log, s, &call->szLookupName, NDR_PTR_FULL);
4361 if (status != SCARD_S_SUCCESS)
4365 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
4366 &call->Common.handles.hContext);
4367 if (status != SCARD_S_SUCCESS)
4370 call->Common.CardIdentifier =
nullptr;
4373 status = smartcard_ndr_read_u(log, s, &call->Common.CardIdentifier);
4374 if (status != SCARD_S_SUCCESS)
4378 call->Common.pbData =
nullptr;
4381 status = smartcard_ndr_read(log, s, &call->Common.pbData, cbDataLen, 1, NDR_PTR_SIMPLE);
4382 if (status != SCARD_S_SUCCESS)
4384 call->Common.cbDataLen = cbDataLen;
4386 smartcard_trace_write_cache_w_call(log, call);
4393 wLog* log = scard_log();
4396 UINT32 pbContextNdrPtr = 0;
4398 LONG status = smartcard_unpack_redir_scard_context(log, s, &(call->handles.hContext), &index,
4400 if (status != SCARD_S_SUCCESS)
4403 status = smartcard_unpack_redir_scard_handle(log, s, &(call->handles.hCard), &index);
4404 if (status != SCARD_S_SUCCESS)
4407 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr,
4408 &(call->handles.hContext));
4409 if (status != SCARD_S_SUCCESS)
4411 WLog_Print(log, WLOG_ERROR,
4412 "smartcard_unpack_redir_scard_context_ref failed with error %" PRId32
"",
4417 status = smartcard_unpack_redir_scard_handle_ref(log, s, &(call->handles.hCard));
4418 if (status != SCARD_S_SUCCESS)
4419 WLog_Print(log, WLOG_ERROR,
4420 "smartcard_unpack_redir_scard_handle_ref failed with error %" PRId32
"", status);
4422 smartcard_trace_get_transmit_count_call(log, call);
4429 wLog* log = scard_log();
4430 return smartcard_unpack_common_context_and_string_w(log, s, &call->handles.hContext,
4431 &call->szReaderName);
4437 wLog* log = scard_log();
4438 return smartcard_unpack_common_context_and_string_a(log, s, &call->handles.hContext, &call->sz);
4444 wLog* log = scard_log();
4445 return smartcard_unpack_common_context_and_string_w(log, s, &call->handles.hContext, &call->sz);
4451 wLog* log = scard_log();
4452 return smartcard_unpack_common_context_and_string_w(log, s, &call->handles.hContext,
4453 &call->szReaderName);
4459 wLog* log = scard_log();
4460 smartcard_trace_device_type_id_return(log, ret);
4462 if (!Stream_EnsureRemainingCapacity(s, 4))
4464 WLog_Print(log, WLOG_ERROR,
"Stream_EnsureRemainingCapacity failed!");
4465 return SCARD_F_INTERNAL_ERROR;
4468 Stream_Write_UINT32(s, ret->dwDeviceId);
4470 return ret->ReturnCode;
4476 wLog* log = scard_log();
4479 UINT32 cbDataLen = ret->cReaders;
4482 smartcard_trace_locate_cards_return(log, ret);
4483 if (ret->ReturnCode != SCARD_S_SUCCESS)
4485 if (cbDataLen == SCARD_AUTOALLOCATE)
4488 if (!Stream_EnsureRemainingCapacity(s, 4))
4490 WLog_Print(log, WLOG_ERROR,
"Stream_EnsureRemainingCapacity failed!");
4491 return SCARD_F_INTERNAL_ERROR;
4494 if (ret->cReaders > 10)
4496 WLog_Print(log, WLOG_ERROR,
4497 "2.2.3.5 LocateCards_Return and GetStatusChange_Return cReaders(%" PRIu32
4500 return SCARD_E_INVALID_PARAMETER;
4503 Stream_Write_UINT32(s, cbDataLen);
4504 if (!smartcard_ndr_pointer_write(s, &index, cbDataLen))
4505 return SCARD_E_NO_MEMORY;
4507 status = smartcard_ndr_write_state(s, ret->rgReaderStates, cbDataLen, NDR_PTR_SIMPLE);
4508 if (status != SCARD_S_SUCCESS)
4510 return ret->ReturnCode;
4516 wLog* log = scard_log();
4520 UINT32 cbDataLen = ret->cbDataLen;
4521 smartcard_trace_get_reader_icon_return(log, ret);
4522 if (ret->ReturnCode != SCARD_S_SUCCESS)
4524 if (cbDataLen == SCARD_AUTOALLOCATE)
4527 if (!Stream_EnsureRemainingCapacity(s, 4))
4529 WLog_Print(log, WLOG_ERROR,
"Stream_EnsureRemainingCapacity failed!");
4530 return SCARD_F_INTERNAL_ERROR;
4533 Stream_Write_UINT32(s, cbDataLen);
4534 if (!smartcard_ndr_pointer_write(s, &index, cbDataLen))
4535 return SCARD_E_NO_MEMORY;
4537 status = smartcard_ndr_write(s, ret->pbData, cbDataLen, 1, NDR_PTR_SIMPLE);
4538 if (status != SCARD_S_SUCCESS)
4540 return ret->ReturnCode;
4546 wLog* log = scard_log();
4548 smartcard_trace_get_transmit_count_return(log, ret);
4550 if (!Stream_EnsureRemainingCapacity(s, 4))
4552 WLog_Print(log, WLOG_ERROR,
"Stream_EnsureRemainingCapacity failed!");
4553 return SCARD_F_INTERNAL_ERROR;
4556 Stream_Write_UINT32(s, ret->cTransmitCount);
4558 return ret->ReturnCode;
4564 wLog* log = scard_log();
4568 UINT32 cbDataLen = ret->cbDataLen;
4569 smartcard_trace_read_cache_return(log, ret);
4570 if (ret->ReturnCode != SCARD_S_SUCCESS)
4573 if (cbDataLen == SCARD_AUTOALLOCATE)
4576 if (!Stream_EnsureRemainingCapacity(s, 4))
4578 WLog_Print(log, WLOG_ERROR,
"Stream_EnsureRemainingCapacity failed!");
4579 return SCARD_F_INTERNAL_ERROR;
4582 if (cbDataLen > 65536)
4584 WLog_Print(log, WLOG_ERROR,
"2.2.3.1 ReadCache_Return cbDataLen (%" PRIu32
") > 65536",
4586 return SCARD_E_INVALID_PARAMETER;
4589 Stream_Write_UINT32(s, cbDataLen);
4590 if (!smartcard_ndr_pointer_write(s, &index, cbDataLen))
4591 return SCARD_E_NO_MEMORY;
4593 status = smartcard_ndr_write(s, ret->pbData, cbDataLen, 1, NDR_PTR_SIMPLE);
4594 if (status != SCARD_S_SUCCESS)
4596 return ret->ReturnCode;
4602 wLog* log = scard_log();
4605 smartcard_trace_context_call(log, call, name);
4607 LONG status = smartcard_pack_redir_scard_context(log, s, &call->handles.hContext, &index);
4608 if (status != SCARD_S_SUCCESS)
4611 return smartcard_pack_redir_scard_context_ref(log, s, &call->handles.hContext);
4617 wLog* log = scard_log();
4620 smartcard_trace_list_readers_call(log, call, unicode);
4622 LONG status = smartcard_pack_redir_scard_context(log, s, &call->handles.hContext, &index);
4623 if (status != SCARD_S_SUCCESS)
4626 if (!Stream_EnsureRemainingCapacity(s, 4))
4627 return SCARD_E_NO_MEMORY;
4629 Stream_Write_UINT32(s, call->cBytes);
4630 if (call->cBytes > 65536)
4632 WLog_Print(log, WLOG_ERROR,
"2.2.2.4 ListReaders_Call cBytes(%" PRIu32
") > 65536",
4634 return SCARD_E_INVALID_PARAMETER;
4637 if (!smartcard_ndr_pointer_write(s, &index, call->cBytes))
4638 return SCARD_E_NO_MEMORY;
4640 if (!Stream_EnsureRemainingCapacity(s, 8))
4641 return SCARD_E_NO_MEMORY;
4643 Stream_Write_INT32(s, call->fmszReadersIsNULL);
4644 Stream_Write_UINT32(s, call->cchReaders);
4646 status = smartcard_pack_redir_scard_context_ref(log, s, &call->handles.hContext);
4647 if (status != SCARD_S_SUCCESS)
4650 if (call->cBytes > 0)
4652 status = smartcard_ndr_write(s, call->mszGroups, call->cBytes, 1, NDR_PTR_SIMPLE);
4653 if (status != SCARD_S_SUCCESS)
4657 return SCARD_S_SUCCESS;
4660WINPR_ATTR_NODISCARD
static LONG
4662 UINT32 cReaders, UINT32* ptrIndex)
4664 WINPR_ASSERT(rgReaderStates || (cReaders == 0));
4666 if (!Stream_EnsureRemainingCapacity(s, 4))
4667 return SCARD_E_NO_MEMORY;
4669 Stream_Write_UINT32(s, cReaders);
4671 for (UINT32 i = 0; i < cReaders; i++)
4675 if (!Stream_EnsureRemainingCapacity(s, 52))
4676 return SCARD_E_NO_MEMORY;
4678 const UINT32 nameLen = state->szReader ? (UINT32)(strlen(state->szReader) + 1) : 0;
4679 if (!smartcard_ndr_pointer_write(s, ptrIndex, nameLen))
4680 return SCARD_E_NO_MEMORY;
4682 Stream_Write_UINT32(s, state->dwCurrentState);
4683 Stream_Write_UINT32(s, state->dwEventState);
4684 if (state->cbAtr > 36)
4686 WLog_Print(log, WLOG_WARN,
"2.2.2.12 GetStatusChangeW_Call cbAtr(%" PRIu32
") > 36",
4688 return SCARD_E_INVALID_PARAMETER;
4690 Stream_Write_UINT32(s, state->cbAtr);
4691 Stream_Write(s, state->rgbAtr, 36);
4694 for (UINT32 i = 0; i < cReaders; i++)
4698 if (state->szReader)
4700 const UINT32 nameLen = (UINT32)(strlen(state->szReader) + 1);
4701 LONG status = smartcard_ndr_write_a(s, state->szReader, nameLen, NDR_PTR_FULL);
4702 if (status != SCARD_S_SUCCESS)
4707 return SCARD_S_SUCCESS;
4710WINPR_ATTR_NODISCARD
static LONG
4712 UINT32 cReaders, UINT32* ptrIndex)
4714 WINPR_ASSERT(rgReaderStates || (cReaders == 0));
4716 if (!Stream_EnsureRemainingCapacity(s, 4))
4717 return SCARD_E_NO_MEMORY;
4719 Stream_Write_UINT32(s, cReaders);
4721 for (UINT32 i = 0; i < cReaders; i++)
4725 if (!Stream_EnsureRemainingCapacity(s, 52))
4726 return SCARD_E_NO_MEMORY;
4728 const UINT32 nameLen = state->szReader ? (UINT32)(_wcslen(state->szReader) + 1) : 0;
4729 if (!smartcard_ndr_pointer_write(s, ptrIndex, nameLen))
4730 return SCARD_E_NO_MEMORY;
4732 Stream_Write_UINT32(s, state->dwCurrentState);
4733 Stream_Write_UINT32(s, state->dwEventState);
4734 if (state->cbAtr > 36)
4736 WLog_Print(log, WLOG_WARN,
"2.2.2.12 GetStatusChangeW_Call cbAtr(%" PRIu32
") > 36",
4738 return SCARD_E_INVALID_PARAMETER;
4740 Stream_Write_UINT32(s, state->cbAtr);
4741 Stream_Write(s, state->rgbAtr, 36);
4744 for (UINT32 i = 0; i < cReaders; i++)
4748 if (state->szReader)
4750 const UINT32 nameLen = (UINT32)(_wcslen(state->szReader) + 1);
4751 LONG status = smartcard_ndr_write_w(s, state->szReader, nameLen, NDR_PTR_FULL);
4752 if (status != SCARD_S_SUCCESS)
4757 return SCARD_S_SUCCESS;
4763 wLog* log = scard_log();
4766 smartcard_trace_get_status_change_a_call(log, call);
4768 LONG status = smartcard_pack_redir_scard_context(log, s, &call->handles.hContext, &index);
4769 if (status != SCARD_S_SUCCESS)
4772 if (!Stream_EnsureRemainingCapacity(s, 8))
4773 return SCARD_E_NO_MEMORY;
4775 Stream_Write_UINT32(s, call->dwTimeOut);
4776 Stream_Write_UINT32(s, call->cReaders);
4777 if (call->cReaders > 11)
4779 WLog_Print(log, WLOG_ERROR,
"2.2.2.11 GetStatusChangeA_Call cReaders (%" PRIu32
") > 11",
4781 return SCARD_E_INVALID_PARAMETER;
4783 if (!smartcard_ndr_pointer_write(s, &index, call->cReaders))
4784 return SCARD_E_NO_MEMORY;
4786 status = smartcard_pack_redir_scard_context_ref(log, s, &call->handles.hContext);
4787 if (status != SCARD_S_SUCCESS)
4790 if (call->cReaders > 0)
4793 smartcard_pack_reader_state_a(log, s, call->rgReaderStates, call->cReaders, &index);
4794 if (status != SCARD_S_SUCCESS)
4798 return SCARD_S_SUCCESS;
4804 wLog* log = scard_log();
4807 smartcard_trace_get_status_change_w_call(log, call);
4809 LONG status = smartcard_pack_redir_scard_context(log, s, &call->handles.hContext, &index);
4810 if (status != SCARD_S_SUCCESS)
4813 if (!Stream_EnsureRemainingCapacity(s, 8))
4814 return SCARD_E_NO_MEMORY;
4816 Stream_Write_UINT32(s, call->dwTimeOut);
4817 Stream_Write_UINT32(s, call->cReaders);
4818 if (call->cReaders > 11)
4820 WLog_Print(log, WLOG_ERROR,
"2.2.2.12 GetStatusChangeW_Call cReaders (%" PRIu32
") > 11",
4822 return SCARD_E_INVALID_PARAMETER;
4825 if (!smartcard_ndr_pointer_write(s, &index, call->cReaders))
4826 return SCARD_E_NO_MEMORY;
4828 status = smartcard_pack_redir_scard_context_ref(log, s, &call->handles.hContext);
4829 if (status != SCARD_S_SUCCESS)
4832 if (call->cReaders > 0)
4835 smartcard_pack_reader_state_w(log, s, call->rgReaderStates, call->cReaders, &index);
4836 if (status != SCARD_S_SUCCESS)
4840 return SCARD_S_SUCCESS;
4846 wLog* log = scard_log();
4849 smartcard_trace_connect_a_call(log, call);
4851 const UINT32 readerLen = call->szReader ? (UINT32)(strlen(call->szReader) + 1) : 0;
4852 if (!smartcard_ndr_pointer_write(s, &index, readerLen))
4853 return SCARD_E_NO_MEMORY;
4856 smartcard_pack_redir_scard_context(log, s, &call->Common.handles.hContext, &index);
4857 if (status != SCARD_S_SUCCESS)
4860 if (!Stream_EnsureRemainingCapacity(s, 8))
4861 return SCARD_E_NO_MEMORY;
4863 Stream_Write_UINT32(s, call->Common.dwShareMode);
4864 Stream_Write_UINT32(s, call->Common.dwPreferredProtocols);
4868 status = smartcard_ndr_write_a(s, call->szReader, readerLen, NDR_PTR_FULL);
4869 if (status != SCARD_S_SUCCESS)
4873 return smartcard_pack_redir_scard_context_ref(log, s, &call->Common.handles.hContext);
4879 wLog* log = scard_log();
4882 smartcard_trace_connect_w_call(log, call);
4884 const UINT32 readerLen = call->szReader ? (UINT32)(_wcslen(call->szReader) + 1) : 0;
4885 if (!smartcard_ndr_pointer_write(s, &index, readerLen))
4886 return SCARD_E_NO_MEMORY;
4889 smartcard_pack_redir_scard_context(log, s, &call->Common.handles.hContext, &index);
4890 if (status != SCARD_S_SUCCESS)
4893 if (!Stream_EnsureRemainingCapacity(s, 8))
4894 return SCARD_E_NO_MEMORY;
4896 Stream_Write_UINT32(s, call->Common.dwShareMode);
4897 Stream_Write_UINT32(s, call->Common.dwPreferredProtocols);
4901 status = smartcard_ndr_write_w(s, call->szReader, readerLen, NDR_PTR_FULL);
4902 if (status != SCARD_S_SUCCESS)
4906 return smartcard_pack_redir_scard_context_ref(log, s, &call->Common.handles.hContext);
4912 wLog* log = scard_log();
4915 smartcard_trace_control_call(log, call);
4917 LONG status = smartcard_pack_redir_scard_context(log, s, &call->handles.hContext, &index);
4918 if (status != SCARD_S_SUCCESS)
4921 status = smartcard_pack_redir_scard_handle(log, s, &call->handles.hCard, &index);
4922 if (status != SCARD_S_SUCCESS)
4925 if (!Stream_EnsureRemainingCapacity(s, 8))
4926 return SCARD_E_NO_MEMORY;
4928 Stream_Write_UINT32(s, call->dwControlCode);
4929 Stream_Write_UINT32(s, call->cbInBufferSize);
4930 if (!smartcard_ndr_pointer_write(s, &index, call->cbInBufferSize))
4931 return SCARD_E_NO_MEMORY;
4933 Stream_Write_INT32(s, call->fpvOutBufferIsNULL);
4934 Stream_Write_UINT32(s, call->cbOutBufferSize);
4936 status = smartcard_pack_redir_scard_context_ref(log, s, &call->handles.hContext);
4937 if (status != SCARD_S_SUCCESS)
4940 status = smartcard_pack_redir_scard_handle_ref(log, s, &call->handles.hCard);
4941 if (status != SCARD_S_SUCCESS)
4944 if (call->cbInBufferSize)
4946 status = smartcard_ndr_write(s, call->pvInBuffer, call->cbInBufferSize, 1, NDR_PTR_SIMPLE);
4947 if (status != SCARD_S_SUCCESS)
4958 wLog* log = scard_log();
4961 smartcard_trace_hcard_and_disposition_call(log, call, name);
4963 LONG status = smartcard_pack_redir_scard_context(log, s, &call->handles.hContext, &index);
4964 if (status != SCARD_S_SUCCESS)
4967 status = smartcard_pack_redir_scard_handle(log, s, &call->handles.hCard, &index);
4968 if (status != SCARD_S_SUCCESS)
4971 if (!Stream_EnsureRemainingCapacity(s, 4))
4972 return SCARD_E_NO_MEMORY;
4974 Stream_Write_UINT32(s, call->dwDisposition);
4976 status = smartcard_pack_redir_scard_context_ref(log, s, &call->handles.hContext);
4977 if (status != SCARD_S_SUCCESS)
4980 return smartcard_pack_redir_scard_handle_ref(log, s, &call->handles.hCard);
4986 wLog* log = scard_log();
4989 smartcard_trace_transmit_call(log, call);
4991 LONG status = smartcard_pack_redir_scard_context(log, s, &call->handles.hContext, &index);
4992 if (status != SCARD_S_SUCCESS)
4995 status = smartcard_pack_redir_scard_handle(log, s, &call->handles.hCard, &index);
4996 if (status != SCARD_S_SUCCESS)
4999 UINT32 cbExtraBytes = 0;
5000 const BYTE* pbExtraBytes =
nullptr;
5001 if (call->pioSendPci)
5003 cbExtraBytes = (UINT32)(call->pioSendPci->cbPciLength -
sizeof(
SCARD_IO_REQUEST));
5004 if (cbExtraBytes > 0)
5008 if (!Stream_EnsureRemainingCapacity(s, 32))
5009 return SCARD_E_NO_MEMORY;
5011 Stream_Write_UINT32(s, call->pioSendPci ? call->pioSendPci->dwProtocol : 0);
5012 Stream_Write_UINT32(s, cbExtraBytes);
5013 if (!smartcard_ndr_pointer_write(s, &index, cbExtraBytes))
5014 return SCARD_E_NO_MEMORY;
5016 Stream_Write_UINT32(s, call->cbSendLength);
5017 if (!smartcard_ndr_pointer_write(s, &index, call->cbSendLength))
5018 return SCARD_E_NO_MEMORY;
5020 const UINT32 recvPciLen = call->pioRecvPci ? (UINT32)call->pioRecvPci->cbPciLength : 0;
5021 if (!smartcard_ndr_pointer_write(s, &index, recvPciLen))
5022 return SCARD_E_NO_MEMORY;
5024 Stream_Write_INT32(s, call->fpbRecvBufferIsNULL);
5025 Stream_Write_UINT32(s, call->cbRecvLength);
5027 status = smartcard_pack_redir_scard_context_ref(log, s, &call->handles.hContext);
5028 if (status != SCARD_S_SUCCESS)
5031 status = smartcard_pack_redir_scard_handle_ref(log, s, &call->handles.hCard);
5032 if (status != SCARD_S_SUCCESS)
5035 if (cbExtraBytes > 0)
5037 status = smartcard_ndr_write(s, pbExtraBytes, cbExtraBytes, 1, NDR_PTR_SIMPLE);
5038 if (status != SCARD_S_SUCCESS)
5042 if (call->cbSendLength > 0)
5044 status = smartcard_ndr_write(s, call->pbSendBuffer, call->cbSendLength, 1, NDR_PTR_SIMPLE);
5045 if (status != SCARD_S_SUCCESS)
5049 if (call->pioRecvPci && recvPciLen > 0)
5051 UINT32 cbRecvExtra = (UINT32)(call->pioRecvPci->cbPciLength -
sizeof(
SCARD_IO_REQUEST));
5052 const BYTE* pbRecvExtra = &((
const BYTE*)call->pioRecvPci)[
sizeof(
SCARD_IO_REQUEST)];
5054 if (!Stream_EnsureRemainingCapacity(s, 12))
5055 return SCARD_E_NO_MEMORY;
5057 Stream_Write_UINT32(s, call->pioRecvPci->dwProtocol);
5058 Stream_Write_UINT32(s, cbRecvExtra);
5059 if (!smartcard_ndr_pointer_write(s, &index, cbRecvExtra))
5060 return SCARD_E_NO_MEMORY;
5062 if (cbRecvExtra > 0)
5064 status = smartcard_ndr_write(s, pbRecvExtra, cbRecvExtra, 1, NDR_PTR_SIMPLE);
5065 if (status != SCARD_S_SUCCESS)
5070 return SCARD_S_SUCCESS;
5076 wLog* log = scard_log();
5079 smartcard_trace_get_attrib_call(log, call);
5081 LONG status = smartcard_pack_redir_scard_context(log, s, &call->handles.hContext, &index);
5082 if (status != SCARD_S_SUCCESS)
5085 status = smartcard_pack_redir_scard_handle(log, s, &call->handles.hCard, &index);
5086 if (status != SCARD_S_SUCCESS)
5089 if (!Stream_EnsureRemainingCapacity(s, 12))
5090 return STATUS_NO_MEMORY;
5092 Stream_Write_UINT32(s, call->dwAttrId);
5093 Stream_Write_INT32(s, call->fpbAttrIsNULL);
5094 Stream_Write_UINT32(s, call->cbAttrLen);
5096 status = smartcard_pack_redir_scard_context_ref(log, s, &call->handles.hContext);
5097 if (status != SCARD_S_SUCCESS)
5100 return smartcard_pack_redir_scard_handle_ref(log, s, &call->handles.hCard);
5106 wLog* log = scard_log();
5108 UINT32 mszNdrPtr = 0;
5110 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
5111 return STATUS_BUFFER_TOO_SMALL;
5113 const UINT32 cBytes = Stream_Get_UINT32(s);
5115 if (!smartcard_ndr_pointer_read(log, s, &index, &mszNdrPtr))
5116 return ERROR_INVALID_DATA;
5120 LONG status = smartcard_ndr_read(log, s, &ret->msz, cBytes, 1, NDR_PTR_SIMPLE);
5121 if (status != SCARD_S_SUCCESS)
5123 ret->cBytes = cBytes;
5126 smartcard_trace_list_readers_return(log, ret, unicode);
5127 return SCARD_S_SUCCESS;
5134 wLog* log = scard_log();
5138 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
5139 return STATUS_BUFFER_TOO_SMALL;
5141 Stream_Read_UINT32(s, ret->cReaders);
5142 if (ret->cReaders > 10)
5144 WLog_Print(log, WLOG_ERROR,
5145 "2.2.3.5 LocateCards_Return and GetStatusChange_Return cReaders(%" PRIu32
5148 return SCARD_E_INVALID_PARAMETER;
5151 if (!smartcard_ndr_pointer_read(log, s, &index, &ndrPtr))
5152 return ERROR_INVALID_DATA;
5154 if (ndrPtr && ret->cReaders > 0)
5157 smartcard_ndr_read_state(log, s, &ret->rgReaderStates, ret->cReaders, NDR_PTR_SIMPLE);
5158 if (status != SCARD_S_SUCCESS)
5162 ret->rgReaderStates =
nullptr;
5164 smartcard_trace_get_status_change_return(log, ret, unicode);
5165 return SCARD_S_SUCCESS;
5171 wLog* log = scard_log();
5173 UINT32 pbContextNdrPtr = 0;
5176 smartcard_unpack_redir_scard_context(log, s, &ret->hContext, &index, &pbContextNdrPtr);
5177 if (status != SCARD_S_SUCCESS)
5180 status = smartcard_unpack_redir_scard_handle(log, s, &ret->hCard, &index);
5181 if (status != SCARD_S_SUCCESS)
5184 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
5185 return STATUS_BUFFER_TOO_SMALL;
5187 Stream_Read_UINT32(s, ret->dwActiveProtocol);
5189 status = smartcard_unpack_redir_scard_context_ref(log, s, pbContextNdrPtr, &ret->hContext);
5190 if (status != SCARD_S_SUCCESS)
5193 status = smartcard_unpack_redir_scard_handle_ref(log, s, &ret->hCard);
5194 if (status != SCARD_S_SUCCESS)
5197 smartcard_trace_connect_return(log, ret);
5198 return SCARD_S_SUCCESS;
5204 wLog* log = scard_log();
5206 UINT32 pvOutBufferNdrPtr = 0;
5208 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 8))
5209 return STATUS_BUFFER_TOO_SMALL;
5211 const UINT32 cbOutBufferSize = Stream_Get_UINT32(s);
5213 if (!smartcard_ndr_pointer_read(log, s, &index, &pvOutBufferNdrPtr))
5214 return ERROR_INVALID_DATA;
5216 if (pvOutBufferNdrPtr && (cbOutBufferSize > 0))
5219 smartcard_ndr_read(log, s, &ret->pvOutBuffer, cbOutBufferSize, 1, NDR_PTR_SIMPLE);
5220 if (status != SCARD_S_SUCCESS)
5222 ret->cbOutBufferSize = cbOutBufferSize;
5224 smartcard_trace_control_return(log, ret);
5225 return SCARD_S_SUCCESS;
5231 wLog* log = scard_log();
5233 UINT32 recvPciNdrPtr = 0;
5234 UINT32 recvBufferNdrPtr = 0;
5236 if (!smartcard_ndr_pointer_read(log, s, &index, &recvPciNdrPtr))
5237 return ERROR_INVALID_DATA;
5239 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
5240 return STATUS_BUFFER_TOO_SMALL;
5242 const UINT32 cbRecvLength = Stream_Get_UINT32(s);
5243 if (cbRecvLength > 66560)
5245 WLog_Print(log, WLOG_ERROR,
"2.2.3.11 Transmit_Return cbRecvLength(%" PRIu32
") > 66560",
5247 return SCARD_E_INVALID_PARAMETER;
5250 if (!smartcard_ndr_pointer_read(log, s, &index, &recvBufferNdrPtr))
5251 return ERROR_INVALID_DATA;
5255 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 8))
5256 return STATUS_BUFFER_TOO_SMALL;
5258 UINT32 dwProtocol = 0;
5259 UINT32 cbExtraBytes = 0;
5260 Stream_Read_UINT32(s, dwProtocol);
5261 Stream_Read_UINT32(s, cbExtraBytes);
5263 UINT32 pbExtraBytesNdrPtr = 0;
5264 if (!smartcard_ndr_pointer_read(log, s, &index, &pbExtraBytesNdrPtr))
5265 return ERROR_INVALID_DATA;
5267 if (pbExtraBytesNdrPtr)
5269 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
5270 return STATUS_BUFFER_TOO_SMALL;
5273 Stream_Read_UINT32(s, length);
5274 if (length != cbExtraBytes)
5276 WLog_Print(log, WLOG_WARN,
5277 "Transmit_Return unexpected length: Actual: %" PRIu32
5278 ", Expected: %" PRIu32
" (pioRecvPci.cbExtraBytes)",
5279 length, cbExtraBytes);
5280 return STATUS_INVALID_PARAMETER;
5283 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, cbExtraBytes))
5284 return STATUS_BUFFER_TOO_SMALL;
5287 if (!ret->pioRecvPci)
5288 return SCARD_E_NO_MEMORY;
5290 ret->pioRecvPci->dwProtocol = dwProtocol;
5291 ret->pioRecvPci->cbPciLength = (DWORD)(
sizeof(
SCARD_IO_REQUEST) + cbExtraBytes);
5294 Stream_Read(s, pbExtraBytes, length);
5295 if (smartcard_unpack_read_size_align(s, cbExtraBytes, 4) < 0)
5296 return STATUS_INVALID_PARAMETER;
5301 if (!ret->pioRecvPci)
5302 return SCARD_E_NO_MEMORY;
5304 ret->pioRecvPci->dwProtocol = dwProtocol;
5309 if (recvBufferNdrPtr && (cbRecvLength > 0))
5312 smartcard_ndr_read(log, s, &ret->pbRecvBuffer, cbRecvLength, 1, NDR_PTR_SIMPLE);
5313 if (status != SCARD_S_SUCCESS)
5315 ret->cbRecvLength = cbRecvLength;
5318 smartcard_trace_transmit_return(log, ret);
5319 return SCARD_S_SUCCESS;
5325 wLog* log = scard_log();
5327 UINT32 pbAttrPtr = 0;
5329 if (!Stream_CheckAndLogRequiredLengthWLog(log, s, 4))
5330 return STATUS_BUFFER_TOO_SMALL;
5332 const UINT32 cbAttrLen = Stream_Get_UINT32(s);
5333 if (cbAttrLen > 65536)
5335 WLog_Print(log, WLOG_ERROR,
"2.2.3.12 GetAttrib_Return cbAttrLen(%" PRIu32
") > 65536",
5337 return SCARD_E_INVALID_PARAMETER;
5340 if (!smartcard_ndr_pointer_read(log, s, &index, &pbAttrPtr))
5341 return ERROR_INVALID_DATA;
5343 LONG status = smartcard_ndr_read(log, s, &ret->pbAttr, cbAttrLen, 1, NDR_PTR_SIMPLE);
5344 if (status != SCARD_S_SUCCESS)
5346 ret->cbAttrLen = cbAttrLen;
5348 smartcard_trace_get_attrib_return(log, ret, 0);
5349 return SCARD_S_SUCCESS;
5352BOOL smartcard_reader_state_return_is_valid_ex(
size_t pos,
const ReaderState_Return* val,
5353 const char* file,
size_t line,
const char* fkt)
5357 WLog_Print_dbg_tag(SCARD_TAG, WLOG_WARN, line, file, fkt,
"[%" PRIuz
"] val = nullptr",
5361 if (val->cbAtr >
sizeof(val->rgbAtr))
5363 WLog_Print_dbg_tag(SCARD_TAG, WLOG_WARN, line, file, fkt,
5364 "[%" PRIuz
"] val->cbAtr=%" PRIu32
", max=%" PRIuz, pos, val->cbAtr,
5365 sizeof(val->rgbAtr));