20 |
|
|
21 |
s = channel_init(rdpdr_channel, 12); |
s = channel_init(rdpdr_channel, 12); |
22 |
out_uint8a(s, magic, 4); |
out_uint8a(s, magic, 4); |
23 |
out_uint16_le(s, 1); /* unknown */ |
out_uint16_le(s, 1); /* unknown */ |
24 |
out_uint16_le(s, 5); |
out_uint16_le(s, 5); |
25 |
out_uint32_be(s, 0x815ed39d); /* IP address (use 127.0.0.1) 0x815ed39d */ |
out_uint32_be(s, 0x815ed39d); /* IP address (use 127.0.0.1) 0x815ed39d */ |
26 |
s_mark_end(s); |
s_mark_end(s); |
27 |
channel_send(s, rdpdr_channel); |
channel_send(s, rdpdr_channel); |
28 |
} |
} |
31 |
rdpdr_send_name(void) |
rdpdr_send_name(void) |
32 |
{ |
{ |
33 |
uint8 magic[4] = "rDNC"; |
uint8 magic[4] = "rDNC"; |
34 |
uint32 hostlen = (strlen(hostname)+1)*2; |
uint32 hostlen = (strlen(hostname) + 1) * 2; |
35 |
STREAM s; |
STREAM s; |
36 |
|
|
37 |
s = channel_init(rdpdr_channel, 16+hostlen); |
s = channel_init(rdpdr_channel, 16 + hostlen); |
38 |
out_uint8a(s, magic, 4); |
out_uint8a(s, magic, 4); |
39 |
out_uint16_le(s, 0x63); /* unknown */ |
out_uint16_le(s, 0x63); /* unknown */ |
40 |
out_uint16_le(s, 0x72); |
out_uint16_le(s, 0x72); |
41 |
out_uint32(s, 0); |
out_uint32(s, 0); |
42 |
out_uint32_le(s, hostlen); |
out_uint32_le(s, hostlen); |
43 |
rdp_out_unistr(s, hostname, hostlen-2); |
rdp_out_unistr(s, hostname, hostlen - 2); |
44 |
s_mark_end(s); |
s_mark_end(s); |
45 |
channel_send(s, rdpdr_channel); |
channel_send(s, rdpdr_channel); |
46 |
} |
} |
49 |
rdpdr_send_available(void) |
rdpdr_send_available(void) |
50 |
{ |
{ |
51 |
uint8 magic[4] = "rDAD"; |
uint8 magic[4] = "rDAD"; |
52 |
char *driver = "Digital turbo PrintServer 20"; /* Fairly generic PostScript driver */ |
char *driver = "Digital turbo PrintServer 20"; /* Fairly generic PostScript driver */ |
53 |
char *printer = "PostScript"; |
char *printer = "PostScript"; |
54 |
uint32 driverlen = (strlen(driver)+1)*2; |
uint32 driverlen = (strlen(driver) + 1) * 2; |
55 |
uint32 printerlen = (strlen(printer)+1)*2; |
uint32 printerlen = (strlen(printer) + 1) * 2; |
56 |
STREAM s; |
STREAM s; |
57 |
|
|
58 |
s = channel_init(rdpdr_channel, 8+20); |
s = channel_init(rdpdr_channel, 8 + 20); |
59 |
out_uint8a(s, magic, 4); |
out_uint8a(s, magic, 4); |
60 |
out_uint32_le(s, 1); /* Number of devices */ |
out_uint32_le(s, 1); /* Number of devices */ |
61 |
|
|
62 |
#if 1 |
#if 1 |
63 |
out_uint32_le(s, 0x1); /* Device type 0x1 - serial */ |
out_uint32_le(s, 0x1); /* Device type 0x1 - serial */ |
67 |
out_uint32(s, 0); |
out_uint32(s, 0); |
68 |
#endif |
#endif |
69 |
#if 0 |
#if 0 |
70 |
out_uint32_le(s, 0x2); /* Device type 0x2 - parallel */ |
out_uint32_le(s, 0x2); /* Device type 0x2 - parallel */ |
71 |
out_uint32_le(s, 0); |
out_uint32_le(s, 0); |
72 |
out_uint8p(s, "LPT2", 4); |
out_uint8p(s, "LPT2", 4); |
73 |
out_uint8s(s, 4); |
out_uint8s(s, 4); |
74 |
out_uint32(s, 0); |
out_uint32(s, 0); |
75 |
#endif |
#endif |
76 |
#if 1 |
#if 1 |
77 |
out_uint32_le(s, 0x4); /* Device type 0x4 - printer */ |
out_uint32_le(s, 0x4); /* Device type 0x4 - printer */ |
78 |
out_uint32_le(s, 1); |
out_uint32_le(s, 1); |
79 |
out_uint8p(s, "PRN1", 4); |
out_uint8p(s, "PRN1", 4); |
80 |
out_uint8s(s, 4); |
out_uint8s(s, 4); |
81 |
out_uint32_le(s, 24+driverlen+printerlen); /* length of extra info */ |
out_uint32_le(s, 24 + driverlen + printerlen); /* length of extra info */ |
82 |
out_uint32_le(s, 2); /* unknown */ |
out_uint32_le(s, 2); /* unknown */ |
83 |
out_uint8s(s, 8); /* unknown */ |
out_uint8s(s, 8); /* unknown */ |
84 |
out_uint32_le(s, driverlen); /* length of driver name */ |
out_uint32_le(s, driverlen); /* length of driver name */ |
85 |
out_uint32_le(s, printerlen); /* length of printer name */ |
out_uint32_le(s, printerlen); /* length of printer name */ |
86 |
out_uint32(s, 0); /* unknown */ |
out_uint32(s, 0); /* unknown */ |
87 |
rdp_out_unistr(s, driver, driverlen-2); |
rdp_out_unistr(s, driver, driverlen - 2); |
88 |
rdp_out_unistr(s, printer, printerlen-2); |
rdp_out_unistr(s, printer, printerlen - 2); |
89 |
#endif |
#endif |
90 |
#if 0 |
#if 0 |
91 |
out_uint32_le(s, 0x8); /* Device type 0x8 - disk */ |
out_uint32_le(s, 0x8); /* Device type 0x8 - disk */ |
92 |
out_uint32_le(s, 0); |
out_uint32_le(s, 0); |
93 |
out_uint8p(s, "Z:", 2); |
out_uint8p(s, "Z:", 2); |
94 |
out_uint8s(s, 6); |
out_uint8s(s, 6); |
95 |
out_uint32(s, 0); |
out_uint32(s, 0); |
96 |
#endif |
#endif |
97 |
#if 0 |
#if 0 |
98 |
out_uint32_le(s, 0x20); /* Device type 0x20 - smart card */ |
out_uint32_le(s, 0x20); /* Device type 0x20 - smart card */ |
99 |
out_uint32_le(s, 0); |
out_uint32_le(s, 0); |
100 |
out_uint8p(s, "SCARD", 5); |
out_uint8p(s, "SCARD", 5); |
101 |
out_uint8s(s, 3); |
out_uint8s(s, 3); |
107 |
} |
} |
108 |
|
|
109 |
void |
void |
110 |
rdpdr_send_completion(uint32 device, uint32 id, uint32 status, uint32 result, uint8 *buffer, uint32 length) |
rdpdr_send_completion(uint32 device, uint32 id, uint32 status, uint32 result, uint8 * buffer, |
111 |
|
uint32 length) |
112 |
{ |
{ |
113 |
uint8 magic[4] = "rDCI"; |
uint8 magic[4] = "rDCI"; |
114 |
STREAM s; |
STREAM s; |
121 |
out_uint32_le(s, result); |
out_uint32_le(s, result); |
122 |
out_uint8p(s, buffer, length); |
out_uint8p(s, buffer, length); |
123 |
s_mark_end(s); |
s_mark_end(s); |
124 |
hexdump(s->channel_hdr+8, s->end-s->channel_hdr-8); |
hexdump(s->channel_hdr + 8, s->end - s->channel_hdr - 8); |
125 |
channel_send(s, rdpdr_channel); |
channel_send(s, rdpdr_channel); |
126 |
} |
} |
127 |
|
|
209 |
rdpdr_process(STREAM s) |
rdpdr_process(STREAM s) |
210 |
{ |
{ |
211 |
uint32 handle; |
uint32 handle; |
212 |
char *magic; |
uint8 *magic; |
213 |
|
|
214 |
printf("rdpdr_process\n"); |
printf("rdpdr_process\n"); |
215 |
hexdump(s->p, s->end-s->p); |
hexdump(s->p, s->end - s->p); |
216 |
in_uint8p(s, magic, 4); |
in_uint8p(s, magic, 4); |
217 |
|
|
218 |
if ((magic[0] == 'r') && (magic[1] == 'D')) |
if ((magic[0] == 'r') && (magic[1] == 'D')) |
248 |
BOOL |
BOOL |
249 |
rdpdr_init(void) |
rdpdr_init(void) |
250 |
{ |
{ |
251 |
rdpdr_channel = channel_register("rdpdr", CHANNEL_OPTION_INITIALIZED | CHANNEL_OPTION_COMPRESS_RDP, rdpdr_process); |
rdpdr_channel = |
252 |
|
channel_register("rdpdr", CHANNEL_OPTION_INITIALIZED | CHANNEL_OPTION_COMPRESS_RDP, |
253 |
|
rdpdr_process); |
254 |
return (rdpdr_channel != NULL); |
return (rdpdr_channel != NULL); |
255 |
} |
} |