Merge pull request #96 from derfian/decipher-rdpdr-printer-device-announce

Clarify printer parts of rdpdr_send_client_device_list_announce
This commit is contained in:
Henrik Andersson 2017-01-30 10:05:02 +01:00 committed by GitHub
commit d124477abb
2 changed files with 20 additions and 10 deletions

View File

@ -514,6 +514,11 @@ enum RDP_INPUT_DEVICE
#define RDPDR_IRP_MJ_SET_SECURITY 0x00008000 #define RDPDR_IRP_MJ_SET_SECURITY 0x00008000
#define ALL_RDPDR_IRP_MJ 0x0000FFFF #define ALL_RDPDR_IRP_MJ 0x0000FFFF
#define RDPDR_PRINTER_ANNOUNCE_FLAG_ASCII 0x00000001
#define RDPDR_PRINTER_ANNOUNCE_FLAG_DEFAULTPRINTER 0x00000002
#define RDPDR_PRINTER_ANNOUNCE_FLAG_NETWORKPRINTER 0x00000004
#define RDPDR_PRINTER_ANNOUNCE_FLAG_TSPRINTER 0x00000008
#define RDPDR_PRINTER_ANNOUNCE_FLAG_XPSFORMAT 0x00000010
#define RDPDR_DEVICE_REMOVE_PDUS 0x00000001 #define RDPDR_DEVICE_REMOVE_PDUS 0x00000001
#define RDPDR_CLIENT_DISPLAY_NAME_PDU 0x00000002 #define RDPDR_CLIENT_DISPLAY_NAME_PDU 0x00000002

25
rdpdr.c
View File

@ -274,7 +274,7 @@ static void
rdpdr_send_client_device_list_announce(void) rdpdr_send_client_device_list_announce(void)
{ {
/* DR_CORE_CLIENT_ANNOUNCE_RSP */ /* DR_CORE_CLIENT_ANNOUNCE_RSP */
uint32 driverlen, printerlen, bloblen, disklen; uint32 driverlen, printerlen, bloblen, disklen, flags;
int i; int i;
STREAM s; STREAM s;
PRINTER *printerinfo; PRINTER *printerinfo;
@ -313,16 +313,21 @@ rdpdr_send_client_device_list_announce(void)
driverlen = 2 * strlen(printerinfo->driver) + 2; driverlen = 2 * strlen(printerinfo->driver) + 2;
printerlen = 2 * strlen(printerinfo->printer) + 2; printerlen = 2 * strlen(printerinfo->printer) + 2;
bloblen = printerinfo->bloblen; bloblen = printerinfo->bloblen;
flags = 0;
if (printerinfo->default_printer)
flags |= RDPDR_PRINTER_ANNOUNCE_FLAG_DEFAULTPRINTER;
out_uint32_le(s, 24 + driverlen + printerlen + bloblen); /* length of extra info */ out_uint32_le(s, 24 + driverlen + printerlen + bloblen); /* DeviceDataLength */
out_uint32_le(s, printerinfo->default_printer ? 2 : 0); out_uint32_le(s, flags); /* Flags */
out_uint8s(s, 8); /* unknown */ out_uint32_le(s, 0); /* Codepage */
out_uint32_le(s, driverlen); out_uint32_le(s, 0); /* PnPNameLen */
out_uint32_le(s, printerlen); out_uint32_le(s, driverlen); /* DriverNameLen */
out_uint32_le(s, bloblen); out_uint32_le(s, printerlen); /* PrinterNameLen */
rdp_out_unistr(s, printerinfo->driver, driverlen - 2); out_uint32_le(s, bloblen); /* CachedFieldsLen */
rdp_out_unistr(s, printerinfo->printer, printerlen - 2); rdp_out_unistr(s, NULL, 0); /* PnPName */
out_uint8a(s, printerinfo->blob, bloblen); rdp_out_unistr(s, printerinfo->driver, driverlen - 2); /* DriverName */
rdp_out_unistr(s, printerinfo->printer, printerlen - 2); /* PrinterName */
out_uint8a(s, printerinfo->blob, bloblen); /* CachedPrinterConfigData */
if (printerinfo->blob) if (printerinfo->blob)
xfree(printerinfo->blob); /* Blob is sent twice if reconnecting */ xfree(printerinfo->blob); /* Blob is sent twice if reconnecting */