void APP_CC scard_handle_EstablishContext_Return(struct stream *s, IRP *irp, tui32 DeviceId, tui32 CompletionId, tui32 IoStatus) { tui32 len; int tmp; SMARTCARD *sc; log_debug("entered"); /* sanity check */ if ((DeviceId != irp->DeviceId) || (CompletionId != irp->CompletionId)) { log_error("DeviceId/CompletionId do not match those in IRP"); return; } if (IoStatus != 0) { log_error("failed to establish context - device not usable"); /* LK_TODO delete irp and smartcard entry */ return; } sc = smartcards[irp->scard_index]; /* get OutputBufferLen */ xstream_rd_u32_le(s, len); /* LK_TODO */ g_hexdump(s->p, len); xstream_rd_u32_le(s, tmp); /* should be len 8, LE, V1 */ xstream_rd_u32_le(s, tmp); /* marshalling flag */ xstream_rd_u32_le(s, tmp); /* ?? */ xstream_rd_u32_le(s, tmp); /* ?? */ xstream_rd_u32_le(s, tmp); /* ?? */ xstream_rd_u32_le(s, tmp); /* ?? */ xstream_rd_u32_le(s, tmp); /* ?? */ xstream_rd_u32_le(s, len); /* len of context in bytes */ sc->Context_len = len; xstream_copyout(sc->Context, s, len); if (LOG_LEVEL == LOG_DEBUG) { log_debug("dumping context (%d bytes)", sc->Context_len); g_hexdump(sc->Context, sc->Context_len); } irp->callback = scard_handle_ListReaders_Return; scard_send_ListReaders(irp, 1); /* LK_TODO need to delete IRP */ log_debug("leaving"); }
void APP_CC scard_handle_ListReaders_Return(struct stream *s, IRP *irp, tui32 DeviceId, tui32 CompletionId, tui32 IoStatus) { tui32 len; log_debug("entered"); /* sanity check */ if ((DeviceId != irp->DeviceId) || (CompletionId != irp->CompletionId)) { log_error("DeviceId/CompletionId do not match those in IRP"); return; } if (IoStatus != 0) { log_error("failed to list readers - device not usable"); /* LK_TODO delete irp and smartcard entry */ return; } /* get OutputBufferLen */ xstream_rd_u32_le(s, len); /* LK_TODO */ log_debug("dumping %d bytes", len); g_hexdump(s->p, len); log_debug("leaving"); }
/* returns error */ int APP_CC xrdp_tcp_send(struct xrdp_tcp* self, struct stream* s) { int len; int total; int sent; struct xrdp_session* session; if (self->sck_closed) { DEBUG((" in xrdp_tcp_send, sck closed")); return 1; } len = s->end - s->data; DEBUG((" in xrdp_tcp_send, gota send %d bytes", len)); session = self->iso_layer->mcs_layer->sec_layer->rdp_layer->session; total = 0; while (total < len) { sent = g_tcp_send(self->sck, s->data + total, len - total, 0); if (sent == -1) { if (g_tcp_last_error_would_block(self->sck)) { if (!g_tcp_can_send(self->sck, 10)) { if (session->is_term != 0) { if (session->is_term()) { DEBUG((" out xrdp_tcp_send, terminated")); return 1; } } } } else { self->sck_closed = 1; DEBUG((" error = -1 in xrdp_tcp_send socket %d", self->sck)); return 1; } } else if (sent == 0) { self->sck_closed = 1; DEBUG((" error = 0 in xrdp_tcp_send socket %d", self->sck)); return 1; } else { #if defined(XRDP_DEBUG) g_hexdump(s->data + total, sent); #endif total = total + sent; } } DEBUG((" out xrdp_tcp_send, sent %d bytes ok", len)); return 0; }
static int APP_CC xrdp_caps_process_order(struct xrdp_rdp *self, struct stream *s, int len) { int i; char order_caps[32]; int ex_flags; int cap_flags; DEBUG(("order capabilities")); if (len < 20 + 2 + 2 + 2 + 2 + 2 + 2 + 32 + 2 + 2 + 4 + 4 + 4 + 4) { g_writeln("xrdp_caps_process_order: error"); return 1; } in_uint8s(s, 20); /* Terminal desc, pad */ in_uint8s(s, 2); /* Cache X granularity */ in_uint8s(s, 2); /* Cache Y granularity */ in_uint8s(s, 2); /* Pad */ in_uint8s(s, 2); /* Max order level */ in_uint8s(s, 2); /* Number of fonts */ in_uint16_le(s, cap_flags); /* Capability flags */ in_uint8a(s, order_caps, 32); /* Orders supported */ g_memcpy(self->client_info.orders, order_caps, 32); DEBUG(("dest blt-0 %d", order_caps[0])); DEBUG(("pat blt-1 %d", order_caps[1])); DEBUG(("screen blt-2 %d", order_caps[2])); DEBUG(("memblt-3-13 %d %d", order_caps[3], order_caps[13])); DEBUG(("triblt-4-14 %d %d", order_caps[4], order_caps[14])); DEBUG(("line-8 %d", order_caps[8])); DEBUG(("line-9 %d", order_caps[9])); DEBUG(("rect-10 %d", order_caps[10])); DEBUG(("desksave-11 %d", order_caps[11])); DEBUG(("polygon-20 %d", order_caps[20])); DEBUG(("polygon2-21 %d", order_caps[21])); DEBUG(("polyline-22 %d", order_caps[22])); DEBUG(("ellipse-25 %d", order_caps[25])); DEBUG(("ellipse2-26 %d", order_caps[26])); DEBUG(("text2-27 %d", order_caps[27])); DEBUG(("order_caps dump")); #if defined(XRDP_DEBUG) g_hexdump(order_caps, 32); #endif in_uint8s(s, 2); /* Text capability flags */ /* read extended order support flags */ in_uint16_le(s, ex_flags); /* Ex flags */ if (cap_flags & 0x80) /* ORDER_FLAGS_EXTRA_SUPPORT */ { self->client_info.order_flags_ex = ex_flags; if (ex_flags & XR_ORDERFLAGS_EX_CACHE_BITMAP_REV3_SUPPORT) { g_writeln("xrdp_caps_process_order: bitmap cache v3 supported"); self->client_info.bitmap_cache_version |= 4; } } in_uint8s(s, 4); /* Pad */ in_uint32_le(s, i); /* desktop cache size, usually 0x38400 */ self->client_info.desktop_cache = i; DEBUG(("desktop cache size %d", i)); in_uint8s(s, 4); /* Unknown */ in_uint8s(s, 4); /* Unknown */ /* check if libpainter should be used for drawing, instead of orders */ if (!(order_caps[TS_NEG_DSTBLT_INDEX] && order_caps[TS_NEG_PATBLT_INDEX] && order_caps[TS_NEG_SCRBLT_INDEX] && order_caps[TS_NEG_MEMBLT_INDEX])) { g_writeln("xrdp_caps_process_order: not enough orders supported by client, using painter."); self->client_info.no_orders_supported = 1; } return 0; }