chansrv: work on smartcard

This commit is contained in:
Jay Sorg
2013-12-11 03:22:00 -08:00
parent e85e4634c7
commit 3069922500
4 changed files with 79 additions and 66 deletions
+35 -32
View File
@@ -190,7 +190,7 @@ static int APP_CC scard_send_Transmit(IRP *irp, tui32 sc_handle,
int recv_bytes,
struct xrdp_scard_io_request *send_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,
int recv_bytes, int control_code);
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
*****************************************************************************/
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,
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;
/* 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);
return 0;
@@ -1655,9 +1655,9 @@ scard_send_Status(IRP *irp, int wide, tui32 sc_handle,
00 00 02 00
04 00 00 00
04 00 02 00
01 00 00 00 dwReaderLen
00 00 00 00 dwAtrLen
40 00 00 00
01 00 00 00
00 00 00 00 dwReaderLen
40 00 00 00 dwAtrLen
04 00 00 00
07 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, 0x00000004);
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, cbAtrLen); /* atrLen, see [MS-RDPESC] 4.11 */
out_uint32_le(s, 0x00000040);
out_uint32_le(s, 0x00000004);
out_uint32_le(s, 0x00000007);
/* insert sc_handle */
@@ -1694,6 +1694,8 @@ scard_send_Status(IRP *irp, int wide, tui32 sc_handle,
bytes = (int) (s->end - s->data);
//g_hexdump(s->data, bytes);
/* send to client */
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 */
SMARTCARD* sc;
struct stream* s;
SMARTCARD *sc;
struct stream *s;
int bytes;
if ((sc = smartcards[irp->scard_index]) == NULL)
@@ -1830,12 +1832,11 @@ scard_send_Transmit(IRP *irp, tui32 sc_handle, char *send_data,
#if 0
s_push_layer(s, mcs_hdr, 4); /* bytes, set later */
//out_uint32_be(s, 0x58000000);
out_uint32_be(s, 0x00000000);
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, 0x04000200);
out_uint32_be(s, 0x04000200); // map 1
out_uint32_be(s, 0x01000000);
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, 4);
xstream_wr_u32_le(s, 0x00020000); /* map0 */
out_uint32_le(s, 0x00020000); /* map0 */
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);
xstream_wr_u32_le(s, send_ior->cbPciLength - 8);
out_uint32_le(s, send_ior->dwProtocol);
out_uint32_le(s, send_ior->cbPciLength - 8);
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;
xstream_wr_u32_le(s, val); /* map3 */
out_uint32_le(s, val); /* map3 */
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
xstream_wr_u32_le(s, recv_bytes);
out_uint32_le(s, 0); // map5
out_uint32_le(s, recv_bytes);
/* map0 */
out_uint32_le(s, 4);
out_uint32_le(s, 5);
/* map1 */
xstream_wr_u32_le(s, 4);
xstream_wr_u32_le(s, sc_handle);
out_uint32_le(s, 4);
out_uint32_le(s, sc_handle);
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);
}
if (send_bytes > 0)
{
xstream_wr_u32_le(s, send_bytes);
out_uint32_le(s, send_bytes);
out_uint8a(s, send_data, send_bytes);
align_s(s, 4);
}
@@ -1922,13 +1923,13 @@ scard_send_Transmit(IRP *irp, tui32 sc_handle, char *send_data,
if (recv_ior->cbPciLength > 0)
{
/* map4 */
xstream_wr_u32_le(s, recv_ior->dwProtocol);
xstream_wr_u32_le(s, recv_ior->cbPciLength);
out_uint32_le(s, recv_ior->dwProtocol);
out_uint32_le(s, recv_ior->cbPciLength - 8);
val = recv_ior->extra_bytes > 0 ? 1 : 0;
xstream_wr_u32_le(s, val); /* map6*/
out_uint32_le(s, val); /* map6*/
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);
}
}
@@ -1964,7 +1965,7 @@ scard_send_Transmit(IRP *irp, tui32 sc_handle, char *send_data,
* Communicate directly with the smart card reader
*****************************************************************************/
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)
{
/* 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, recv_bytes);
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, sc_handle);
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);
//g_hexdump(s->data, bytes);
/* send to client */
send_channel_data(g_rdpdr_chan_id, s->data, bytes);