chansrv: work on smartcard

ulab-next
Jay Sorg 11 years ago
parent e85e4634c7
commit 3069922500

@ -618,6 +618,10 @@ SCardStatus(SCARDHANDLE hCard, LPSTR mszReaderName, LPDWORD pcchReaderLen,
LLOGLN(0, ("SCardStatus: error, not connected")); LLOGLN(0, ("SCardStatus: error, not connected"));
return SCARD_F_INTERNAL_ERROR; return SCARD_F_INTERNAL_ERROR;
} }
LLOGLN(10, (" hCard 0x%8.8x", hCard));
LLOGLN(10, (" cchReaderLen %d", *pcchReaderLen));
LLOGLN(10, (" cbAtrLen %d", *pcbAtrLen));
cchReaderLen = *pcchReaderLen; cchReaderLen = *pcchReaderLen;
msg = (char *) malloc(8192); msg = (char *) malloc(8192);
SET_UINT32(msg, 0, hCard); SET_UINT32(msg, 0, hCard);
@ -648,10 +652,10 @@ SCardStatus(SCARDHANDLE hCard, LPSTR mszReaderName, LPDWORD pcchReaderLen,
} }
pthread_mutex_unlock(&g_mutex); pthread_mutex_unlock(&g_mutex);
LLOGLN(10, ("SCardStatus: cchReaderLen %d", *pcchReaderLen)); LLOGLN(10, ("SCardStatus: cchReaderLen in %d", *pcchReaderLen));
offset = 0; offset = 0;
*pcchReaderLen = GET_UINT32(msg, offset); *pcchReaderLen = GET_UINT32(msg, offset);
LLOGLN(10, ("SCardStatus: cchReaderLen %d", *pcchReaderLen)); LLOGLN(10, ("SCardStatus: cchReaderLen out %d", *pcchReaderLen));
offset += 4; offset += 4;
if (cchReaderLen > 0) if (cchReaderLen > 0)
{ {
@ -663,7 +667,7 @@ SCardStatus(SCARDHANDLE hCard, LPSTR mszReaderName, LPDWORD pcchReaderLen,
memcpy(mszReaderName, msg + offset, to_copy); memcpy(mszReaderName, msg + offset, to_copy);
mszReaderName[to_copy] = 0; mszReaderName[to_copy] = 0;
} }
LLOGLN(10, ("SCardStatus: mszReaderName %s", mszReaderName)); LLOGLN(10, ("SCardStatus: mszReaderName out %s", mszReaderName));
offset += *pcchReaderLen; offset += *pcchReaderLen;
*pdwState = GET_UINT32(msg, offset); *pdwState = GET_UINT32(msg, offset);
LLOGLN(10, ("SCardStatus: dwState %d", *pdwState)); LLOGLN(10, ("SCardStatus: dwState %d", *pdwState));
@ -715,10 +719,10 @@ SCardGetStatusChange(SCARDCONTEXT hContext, DWORD dwTimeout,
memset(msg + offset, 0, 100); memset(msg + offset, 0, 100);
memcpy(msg + offset, rgReaderStates[index].szReader, str_len); memcpy(msg + offset, rgReaderStates[index].szReader, str_len);
offset += 100; offset += 100;
LLOGLN(10, (" in dwCurrentState %d", rgReaderStates[index].dwCurrentState)); LLOGLN(10, (" in dwCurrentState 0x%8.8x", rgReaderStates[index].dwCurrentState));
SET_UINT32(msg, offset, rgReaderStates[index].dwCurrentState); SET_UINT32(msg, offset, rgReaderStates[index].dwCurrentState);
offset += 4; offset += 4;
LLOGLN(10, (" in dwEventState %d", rgReaderStates[index].dwEventState)); LLOGLN(10, (" in dwEventState 0x%8.8x", rgReaderStates[index].dwEventState));
SET_UINT32(msg, offset, rgReaderStates[index].dwEventState); SET_UINT32(msg, offset, rgReaderStates[index].dwEventState);
offset += 4; offset += 4;
LLOGLN(10, (" in cbAtr %d", rgReaderStates[index].cbAtr)); LLOGLN(10, (" in cbAtr %d", rgReaderStates[index].cbAtr));
@ -793,9 +797,10 @@ SCardControl(SCARDHANDLE hCard, DWORD dwControlCode, LPCVOID pbSendBuffer,
LLOGLN(0, ("SCardControl: error, not connected")); LLOGLN(0, ("SCardControl: error, not connected"));
return SCARD_F_INTERNAL_ERROR; return SCARD_F_INTERNAL_ERROR;
} }
LLOGLN(10, ("SCardControl: dwControlCode 0x%8.8x", dwControlCode)); LLOGLN(10, (" hCard 0x%8.8x", hCard));
LLOGLN(10, ("SCardControl: cbSendLength %d", cbSendLength)); LLOGLN(10, (" dwControlCode 0x%8.8x", dwControlCode));
LLOGLN(10, ("SCardControl: cbRecvLength %d", cbRecvLength)); LLOGLN(10, (" cbSendLength %d", cbSendLength));
LLOGLN(10, (" cbRecvLength %d", cbRecvLength));
/* #define SCARD_CTL_CODE(code) (0x42000000 + (code)) /* #define SCARD_CTL_CODE(code) (0x42000000 + (code))
control_code = (control_code & 0x3ffc) >> 2; control_code = (control_code & 0x3ffc) >> 2;
@ -805,7 +810,7 @@ SCardControl(SCARDHANDLE hCard, DWORD dwControlCode, LPCVOID pbSendBuffer,
dwControlCode = dwControlCode - 0x42000000; dwControlCode = dwControlCode - 0x42000000;
dwControlCode = dwControlCode << 2; dwControlCode = dwControlCode << 2;
dwControlCode = dwControlCode | (49 << 16); dwControlCode = dwControlCode | (49 << 16);
LLOGLN(10, ("SCardControl: dwControlCode 0x%8.8x", dwControlCode)); LLOGLN(10, (" MS dwControlCode 0x%8.8x", dwControlCode));
msg = (char *) malloc(8192); msg = (char *) malloc(8192);
offset = 0; offset = 0;
@ -845,6 +850,7 @@ SCardControl(SCARDHANDLE hCard, DWORD dwControlCode, LPCVOID pbSendBuffer,
pthread_mutex_unlock(&g_mutex); pthread_mutex_unlock(&g_mutex);
offset = 0; offset = 0;
*lpBytesReturned = GET_UINT32(msg, offset); *lpBytesReturned = GET_UINT32(msg, offset);
LLOGLN(10, (" cbRecvLength %d", *lpBytesReturned));
offset += 4; offset += 4;
memcpy(pbRecvBuffer, msg + offset, *lpBytesReturned); memcpy(pbRecvBuffer, msg + offset, *lpBytesReturned);
offset += *lpBytesReturned; offset += *lpBytesReturned;
@ -873,14 +879,16 @@ SCardTransmit(SCARDHANDLE hCard, const SCARD_IO_REQUEST *pioSendPci,
LLOGLN(0, ("SCardTransmit: error, not connected")); LLOGLN(0, ("SCardTransmit: error, not connected"));
return SCARD_F_INTERNAL_ERROR; return SCARD_F_INTERNAL_ERROR;
} }
LLOGLN(10, ("SCardTransmit: cbSendLength %d", cbSendLength)); LLOGLN(10, (" hCard 0x%8.8x", hCard));
LLOGLN(10, ("SCardTransmit: pioRecvPci %p", pioRecvPci)); LLOGLN(10, (" cbSendLength %d", cbSendLength));
LLOGLN(10, (" cbRecvLength %d", *pcbRecvLength));
LLOGLN(10, (" pioSendPci->dwProtocol %d", (int)(pioSendPci->dwProtocol)));
LLOGLN(10, (" pioSendPci->cbPciLength %d", (int)(pioSendPci->cbPciLength)));
LLOGLN(10, (" pioRecvPci %p", pioRecvPci));
if (pioRecvPci != 0) if (pioRecvPci != 0)
{ {
LLOGLN(10, ("SCardTransmit: pioRecvPci->dwProtocol %d", LLOGLN(10, (" pioRecvPci->dwProtocol %d", (int)(pioRecvPci->dwProtocol)));
(int)pioRecvPci->dwProtocol)); LLOGLN(10, (" pioRecvPci->cbPciLength %d", (int)(pioRecvPci->cbPciLength)));
LLOGLN(10, ("SCardTransmit: pioRecvPci->cbPciLength %d",
(int)pioRecvPci->cbPciLength));
} }
msg = (char *) malloc(8192); msg = (char *) malloc(8192);
offset = 0; offset = 0;
@ -966,7 +974,7 @@ SCardTransmit(SCARDHANDLE hCard, const SCARD_IO_REQUEST *pioSendPci,
} }
*pcbRecvLength = GET_UINT32(msg, offset); *pcbRecvLength = GET_UINT32(msg, offset);
offset += 4; offset += 4;
LLOGLN(10, ("SCardTransmit: cbRecvLength %d", *pcbRecvLength)); LLOGLN(10, (" cbRecvLength %d", *pcbRecvLength));
memcpy(pbRecvBuffer, msg + offset, *pcbRecvLength); memcpy(pbRecvBuffer, msg + offset, *pcbRecvLength);
offset += *pcbRecvLength; offset += *pcbRecvLength;
status = GET_UINT32(msg, offset); status = GET_UINT32(msg, offset);

@ -190,7 +190,7 @@ static int APP_CC scard_send_Transmit(IRP *irp, tui32 sc_handle,
int recv_bytes, int recv_bytes,
struct xrdp_scard_io_request *send_ior, struct xrdp_scard_io_request *send_ior,
struct xrdp_scard_io_request *recv_ior); struct xrdp_scard_io_request *recv_ior);
static int APP_CC scard_send_Control(IRP* irp, tui32 context, tui32 sc_handle, static int APP_CC scard_send_Control(IRP* irp, tui32 sc_handle,
char *send_data, int send_bytes, char *send_data, int send_bytes,
int recv_bytes, int control_code); int recv_bytes, int control_code);
static int APP_CC scard_send_Cancel(IRP *irp, tui32 context); static int APP_CC scard_send_Cancel(IRP *irp, tui32 context);
@ -703,7 +703,7 @@ scard_send_transmit(struct trans *con, tui32 sc_handle,
* Communicate directly with the smart card reader * Communicate directly with the smart card reader
*****************************************************************************/ *****************************************************************************/
int APP_CC int APP_CC
scard_send_control(struct trans *con, tui32 context, tui32 sc_handle, scard_send_control(struct trans *con, tui32 sc_handle,
char *send_data, int send_bytes, char *send_data, int send_bytes,
int recv_bytes, int control_code) int recv_bytes, int control_code)
{ {
@ -723,7 +723,7 @@ scard_send_control(struct trans *con, tui32 context, tui32 sc_handle,
irp->user_data = con; irp->user_data = con;
/* send IRP to client */ /* send IRP to client */
scard_send_Control(irp, context, sc_handle, send_data, scard_send_Control(irp, sc_handle, send_data,
send_bytes, recv_bytes, control_code); send_bytes, recv_bytes, control_code);
return 0; return 0;
@ -1655,9 +1655,9 @@ scard_send_Status(IRP *irp, int wide, tui32 sc_handle,
00 00 02 00 00 00 02 00
04 00 00 00 04 00 00 00
04 00 02 00 04 00 02 00
01 00 00 00 dwReaderLen 01 00 00 00
00 00 00 00 dwAtrLen 00 00 00 00 dwReaderLen
40 00 00 00 40 00 00 00 dwAtrLen
04 00 00 00 04 00 00 00
07 00 00 00 07 00 00 00
04 00 00 00 04 00 00 00
@ -1670,9 +1670,9 @@ scard_send_Status(IRP *irp, int wide, tui32 sc_handle,
out_uint32_le(s, 0x00020000); out_uint32_le(s, 0x00020000);
out_uint32_le(s, 0x00000004); out_uint32_le(s, 0x00000004);
out_uint32_le(s, 0x00020004); out_uint32_le(s, 0x00020004);
out_uint32_le(s, 0x00000001);
out_uint32_le(s, cchReaderLen); /* readerLen, see [MS-RDPESC] 4.11 */ out_uint32_le(s, cchReaderLen); /* readerLen, see [MS-RDPESC] 4.11 */
out_uint32_le(s, cbAtrLen); /* atrLen, see [MS-RDPESC] 4.11 */ out_uint32_le(s, cbAtrLen); /* atrLen, see [MS-RDPESC] 4.11 */
out_uint32_le(s, 0x00000040);
out_uint32_le(s, 0x00000004); out_uint32_le(s, 0x00000004);
out_uint32_le(s, 0x00000007); out_uint32_le(s, 0x00000007);
/* insert sc_handle */ /* insert sc_handle */
@ -1694,6 +1694,8 @@ scard_send_Status(IRP *irp, int wide, tui32 sc_handle,
bytes = (int) (s->end - s->data); bytes = (int) (s->end - s->data);
//g_hexdump(s->data, bytes);
/* send to client */ /* send to client */
send_channel_data(g_rdpdr_chan_id, s->data, bytes); send_channel_data(g_rdpdr_chan_id, s->data, bytes);
@ -1712,8 +1714,8 @@ scard_send_Disconnect(IRP *irp, tui32 context, tui32 sc_handle,
{ {
/* see [MS-RDPESC] 3.1.4.30 */ /* see [MS-RDPESC] 3.1.4.30 */
SMARTCARD* sc; SMARTCARD *sc;
struct stream* s; struct stream *s;
int bytes; int bytes;
if ((sc = smartcards[irp->scard_index]) == NULL) if ((sc = smartcards[irp->scard_index]) == NULL)
@ -1830,12 +1832,11 @@ scard_send_Transmit(IRP *irp, tui32 sc_handle, char *send_data,
#if 0 #if 0
s_push_layer(s, mcs_hdr, 4); /* bytes, set later */ s_push_layer(s, mcs_hdr, 4); /* bytes, set later */
//out_uint32_be(s, 0x58000000);
out_uint32_be(s, 0x00000000); out_uint32_be(s, 0x00000000);
out_uint32_be(s, 0x04000000); out_uint32_be(s, 0x04000000);
out_uint32_be(s, 0x00000200); out_uint32_be(s, 0x00000200); // map 0
out_uint32_be(s, 0x04000000); out_uint32_be(s, 0x04000000);
out_uint32_be(s, 0x04000200); out_uint32_be(s, 0x04000200); // map 1
out_uint32_be(s, 0x01000000); out_uint32_be(s, 0x01000000);
out_uint32_be(s, 0x00000000); out_uint32_be(s, 0x00000000);
out_uint32_be(s, 0x00000000); out_uint32_be(s, 0x00000000);
@ -1876,45 +1877,45 @@ scard_send_Transmit(IRP *irp, tui32 sc_handle, char *send_data,
out_uint32_le(s, 0x00000000); out_uint32_le(s, 0x00000000);
out_uint32_le(s, 4); out_uint32_le(s, 4);
xstream_wr_u32_le(s, 0x00020000); /* map0 */ out_uint32_le(s, 0x00020000); /* map0 */
out_uint32_le(s, 4); out_uint32_le(s, 4);
xstream_wr_u32_le(s, 0x00020004); /* map1 */ out_uint32_le(s, 0x00020004); /* map1 */
xstream_wr_u32_le(s, send_ior->dwProtocol); out_uint32_le(s, send_ior->dwProtocol);
xstream_wr_u32_le(s, send_ior->cbPciLength - 8); out_uint32_le(s, send_ior->cbPciLength - 8);
val = send_ior->extra_bytes > 0 ? 1 : 0; val = send_ior->extra_bytes > 0 ? 1 : 0;
xstream_wr_u32_le(s, val); /* map2 */ out_uint32_le(s, val); /* map2 */
xstream_wr_u32_le(s, send_bytes); out_uint32_le(s, send_bytes);
val = send_bytes > 0 ? 0x00020008 : 0; val = send_bytes > 0 ? 0x00020008 : 0;
xstream_wr_u32_le(s, val); /* map3 */ out_uint32_le(s, val); /* map3 */
val = recv_ior->cbPciLength > 0 ? 0x0002000c : 0; val = recv_ior->cbPciLength > 0 ? 0x0002000c : 0;
xstream_wr_u32_le(s, val); /* map 4 */ out_uint32_le(s, val); /* map 4 */
xstream_wr_u32_le(s, 0); // map5 out_uint32_le(s, 0); // map5
xstream_wr_u32_le(s, recv_bytes); out_uint32_le(s, recv_bytes);
/* map0 */ /* map0 */
out_uint32_le(s, 4); out_uint32_le(s, 4);
out_uint32_le(s, 5); out_uint32_le(s, 5);
/* map1 */ /* map1 */
xstream_wr_u32_le(s, 4); out_uint32_le(s, 4);
xstream_wr_u32_le(s, sc_handle); out_uint32_le(s, sc_handle);
if (send_ior->extra_bytes > 0) if (send_ior->extra_bytes > 0)
{ {
xstream_wr_u32_le(s, send_ior->extra_bytes); out_uint32_le(s, send_ior->extra_bytes);
out_uint8a(s, send_ior->extra_data, send_ior->extra_bytes); out_uint8a(s, send_ior->extra_data, send_ior->extra_bytes);
} }
if (send_bytes > 0) if (send_bytes > 0)
{ {
xstream_wr_u32_le(s, send_bytes); out_uint32_le(s, send_bytes);
out_uint8a(s, send_data, send_bytes); out_uint8a(s, send_data, send_bytes);
align_s(s, 4); align_s(s, 4);
} }
@ -1922,13 +1923,13 @@ scard_send_Transmit(IRP *irp, tui32 sc_handle, char *send_data,
if (recv_ior->cbPciLength > 0) if (recv_ior->cbPciLength > 0)
{ {
/* map4 */ /* map4 */
xstream_wr_u32_le(s, recv_ior->dwProtocol); out_uint32_le(s, recv_ior->dwProtocol);
xstream_wr_u32_le(s, recv_ior->cbPciLength); out_uint32_le(s, recv_ior->cbPciLength - 8);
val = recv_ior->extra_bytes > 0 ? 1 : 0; val = recv_ior->extra_bytes > 0 ? 1 : 0;
xstream_wr_u32_le(s, val); /* map6*/ out_uint32_le(s, val); /* map6*/
if (val) if (val)
{ {
xstream_wr_u32_le(s, recv_ior->extra_bytes); out_uint32_le(s, recv_ior->extra_bytes);
out_uint8a(s, recv_ior->extra_data, recv_ior->extra_bytes); out_uint8a(s, recv_ior->extra_data, recv_ior->extra_bytes);
} }
} }
@ -1964,7 +1965,7 @@ scard_send_Transmit(IRP *irp, tui32 sc_handle, char *send_data,
* Communicate directly with the smart card reader * Communicate directly with the smart card reader
*****************************************************************************/ *****************************************************************************/
static int APP_CC static int APP_CC
scard_send_Control(IRP *irp, tui32 context, tui32 sc_handle, char *send_data, scard_send_Control(IRP *irp, tui32 sc_handle, char *send_data,
int send_bytes, int recv_bytes, int control_code) int send_bytes, int recv_bytes, int control_code)
{ {
/* see [MS-RDPESC] 2.2.2.19 */ /* see [MS-RDPESC] 2.2.2.19 */
@ -1999,7 +2000,7 @@ scard_send_Control(IRP *irp, tui32 context, tui32 sc_handle, char *send_data,
out_uint32_le(s, 0x00000000); out_uint32_le(s, 0x00000000);
out_uint32_le(s, recv_bytes); out_uint32_le(s, recv_bytes);
out_uint32_le(s, 4); out_uint32_le(s, 4);
out_uint32_le(s, context); out_uint32_le(s, 0); /* context ? */
out_uint32_le(s, 4); out_uint32_le(s, 4);
out_uint32_le(s, sc_handle); out_uint32_le(s, sc_handle);
if (send_bytes > 0) if (send_bytes > 0)
@ -2026,6 +2027,8 @@ scard_send_Control(IRP *irp, tui32 context, tui32 sc_handle, char *send_data,
bytes = (int) (s->end - s->data); bytes = (int) (s->end - s->data);
//g_hexdump(s->data, bytes);
/* send to client */ /* send to client */
send_channel_data(g_rdpdr_chan_id, s->data, bytes); send_channel_data(g_rdpdr_chan_id, s->data, bytes);

@ -139,7 +139,7 @@ int APP_CC scard_send_transmit(struct trans *con, tui32 sc_handle,
struct xrdp_scard_io_request *send_ior, struct xrdp_scard_io_request *send_ior,
struct xrdp_scard_io_request *recv_ior); struct xrdp_scard_io_request *recv_ior);
int APP_CC scard_send_control(struct trans *con, tui32 context, tui32 sc_handle, int APP_CC scard_send_control(struct trans *con, tui32 sc_handle,
char *send_data, int send_bytes, char *send_data, int send_bytes,
int recv_bytes, int control_code); int recv_bytes, int control_code);

@ -155,7 +155,8 @@ scard_function_establish_context_return(struct trans *con,
//g_hexdump(in_s->p, len); //g_hexdump(in_s->p, len);
if ((g_xrdp_pcsc_state & XRDP_PCSC_STATE_GOT_EC) == 0) if ((g_xrdp_pcsc_state & XRDP_PCSC_STATE_GOT_EC) == 0)
{ {
LLOGLN(0, ("scard_function_establish_context_return: opps")); LLOGLN(0, ("scard_function_establish_context_return: opps "
"g_xrdp_pcsc_state 0x%8.8x, g_xrdp_pcsc_state"));
return 1; return 1;
} }
g_xrdp_pcsc_state &= ~XRDP_PCSC_STATE_GOT_EC; g_xrdp_pcsc_state &= ~XRDP_PCSC_STATE_GOT_EC;
@ -166,7 +167,8 @@ scard_function_establish_context_return(struct trans *con,
in_uint32_le(in_s, context_len); in_uint32_le(in_s, context_len);
if (context_len != 4) if (context_len != 4)
{ {
LLOGLN(0, ("scard_function_establish_context_return: opps")); LLOGLN(0, ("scard_function_establish_context_return: opps "
"context_len %d", context_len));
return 1; return 1;
} }
in_uint32_le(in_s, context); in_uint32_le(in_s, context);
@ -681,27 +683,29 @@ scard_function_transmit_return(struct trans *con,
return 1; return 1;
} }
g_xrdp_pcsc_state &= ~XRDP_PCSC_STATE_GOT_TR; g_xrdp_pcsc_state &= ~XRDP_PCSC_STATE_GOT_TR;
g_memset(&recv_ior, 0, sizeof(recv_ior)); g_memset(&recv_ior, 0, sizeof(recv_ior));
cbRecvLength = 0; cbRecvLength = 0;
recvBuf = 0;
if (status == 0) if (status == 0)
{ {
in_uint8s(in_s, 20); in_uint8s(in_s, 20);
in_uint32_le(in_s, val); in_uint32_le(in_s, val);
g_memset(&recv_ior, 0, sizeof(recv_ior));
if (val != 0) if (val != 0)
{ {
/* pioRecvPci */ /* pioRecvPci */
LLOGLN(0, ("scard_function_transmit_return: pioRecvPci not zero!")); in_uint8s(in_s, 8);
in_uint32_le(in_s, recv_ior.dwProtocol);
in_uint32_le(in_s, recv_ior.cbPciLength);
recv_ior.cbPciLength += 8;
in_uint32_le(in_s, recv_ior.extra_bytes);
if (recv_ior.extra_bytes > 0)
{
in_uint8p(in_s, recv_ior.extra_data, recv_ior.extra_bytes);
}
} }
in_uint8s(in_s, 4); in_uint32_le(in_s, cbRecvLength);
in_uint32_le(in_s, val); if (cbRecvLength > 0)
cbRecvLength = 0;
recvBuf = 0;
if (val != 0)
{ {
in_uint32_le(in_s, cbRecvLength);
in_uint8p(in_s, recvBuf, cbRecvLength); in_uint8p(in_s, recvBuf, cbRecvLength);
} }
} }
@ -728,7 +732,6 @@ scard_function_transmit_return(struct trans *con,
int APP_CC int APP_CC
scard_process_control(struct trans *con, struct stream *in_s) scard_process_control(struct trans *con, struct stream *in_s)
{ {
tui32 context;
int hCard; int hCard;
int send_bytes; int send_bytes;
int recv_bytes; int recv_bytes;
@ -750,9 +753,7 @@ scard_process_control(struct trans *con, struct stream *in_s)
in_uint8p(in_s, send_data, send_bytes); in_uint8p(in_s, send_data, send_bytes);
in_uint32_le(in_s, recv_bytes); in_uint32_le(in_s, recv_bytes);
context = 1; scard_send_control(con, hCard, send_data, send_bytes, recv_bytes,
scard_send_control(con, context, hCard, send_data, send_bytes, recv_bytes,
control_code); control_code);
return 0; return 0;
@ -997,7 +998,8 @@ scard_function_get_status_change_return(struct trans *con,
//g_hexdump(in_s->p, len); //g_hexdump(in_s->p, len);
if ((g_xrdp_pcsc_state & XRDP_PCSC_STATE_GOT_GSC) == 0) if ((g_xrdp_pcsc_state & XRDP_PCSC_STATE_GOT_GSC) == 0)
{ {
LLOGLN(0, ("scard_function_establish_context_return: opps")); LLOGLN(0, ("scard_function_get_status_change_return: opps "
"g_xrdp_pcsc_state 0x%8.8x", g_xrdp_pcsc_state));
return 1; return 1;
} }
g_xrdp_pcsc_state &= ~XRDP_PCSC_STATE_GOT_GSC; g_xrdp_pcsc_state &= ~XRDP_PCSC_STATE_GOT_GSC;

Loading…
Cancel
Save